{"version":3,"sources":["src/js/app.js","src/js/controllers.js","src/js/directives.js","src/js/filters.js","src/js/services.js","../CustomersPortal/src/js/authorization.component.js","src/js/main.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC14CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACj/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"main.js","sourcesContent":["var app = angular.module('app', ['ngRoute', 'ngSanitize', 'pascalprecht.translate']);\r\n\r\napp.config(['$routeProvider', '$locationProvider', '$httpProvider', '$translateProvider',\r\n function ($routeProvider, $locationProvider, $httpProvider, $translateProvider) {\r\n $httpProvider.defaults.timeout = 5000;\r\n $locationProvider.html5Mode(false);\r\n\r\n $routeProvider.\r\n\t\twhen('/', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/index.html',\r\n\t\t controller: 'MainController'\r\n\t\t}).\r\n\t\twhen('/register-birthday', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/register-birthday.html',\r\n\t\t controller: 'RegisterController'\r\n\t\t}).\r\n\t\twhen('/register-visits', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/register-visits.html',\r\n\t\t controller: 'RegisterController'\r\n\t\t}).\r\n\t\twhen('/visits', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/visits.html',\r\n\t\t controller: 'AllVisitController'\r\n\t\t}).\r\n\t\twhen('/select-visit-date/:id', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/select-visit-date.html',\r\n\t\t controller: 'VisitsController'\r\n\t\t}).\r\n\t\twhen('/booked/:show', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/booked.html',\r\n\t\t controller: 'VisitsController'\r\n\t\t}).\r\n\t\twhen('/select-package', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/packages.html',\r\n\t\t controller: 'PackagesController'\r\n\t\t}).\r\n\t\twhen('/select-date/:id', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/select-date.html',\r\n\t\t controller: 'CalendarController'\r\n\t\t}).\r\n\t\twhen('/select-add-ons/:id', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/select-addons.html',\r\n\t\t controller: 'AddonsController'\r\n\t\t}).\r\n\t\twhen('/select-add-ons-visits/:id', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/select-addons-visits.html',\r\n\t\t controller: 'AddonsControllerVisits'\r\n\t\t}).\r\n\t\twhen('/final', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/final.html',\r\n\t\t controller: 'FinalController'\r\n\t\t}).\r\n\t\twhen('/finish', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/finish.html',\r\n\t\t controller: 'FinishController'\r\n\t\t}).\r\n\t\twhen('/complete-booking', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/complete-booking.html',\r\n\t\t controller: 'FinalController'\r\n\t\t}).\r\n\t\twhen('/booking-completed', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/complete-booking.html',\r\n\t\t controller: 'FinishController'\r\n\t\t}).\r\n\t\twhen('/complete-booking/:OrderID/:tpwot', {\r\n\t\t templateUrl: '../frontend/onlinebooking/src/partials/complete-booking.html',\r\n\t\t controller: 'CompleteController'\r\n\t\t}).\r\n\t\totherwise({\r\n\t\t redirectTo: '/'\r\n\t\t});\r\n\r\n\r\n //$translateProvider.translations('en', dictEN)\r\n // .translations('bg', dictBG);\r\n\r\n //$translateProvider.preferredLanguage('bg');\r\n\r\n $translateProvider.fallbackLanguage('en');\r\n $translateProvider.registerAvailableLanguageKeys(['bg', 'en', 'pl', 'es', 'esc'], {\r\n 'bg_*': 'bg',\r\n 'en_*': 'en',\r\n 'pl_*': 'pl',\r\n 'es_*': 'es',\r\n 'esc_*': 'esc'\r\n });\r\n\r\n var ob_bg;\r\n var ob_en;\r\n var ob_pl;\r\n var ob_es;\r\n var ob_esc;\r\n\r\n $.ajax({\r\n async: false,\r\n url: \"../frontend/onlinebooking/src/translate/bg.json\",\r\n success: function (json) {\r\n ob_bg = json;\r\n }\r\n });\r\n\r\n $.ajax({\r\n async: false,\r\n url: \"../frontend/onlinebooking/src/translate/en.json\",\r\n success: function (json) {\r\n ob_en = json;\r\n }\r\n });\r\n\r\n $.ajax({\r\n async: false,\r\n url: \"../frontend/onlinebooking/src/translate/pl.json\",\r\n success: function (json) {\r\n ob_pl = json;\r\n }\r\n });\r\n\r\n $.ajax({\r\n async: false,\r\n url: \"../frontend/onlinebooking/src/translate/es.json\",\r\n success: function (json) {\r\n ob_es = json;\r\n }\r\n });\r\n\r\n $.ajax({\r\n async: false,\r\n url: \"../frontend/onlinebooking/src/translate/es-ca.json\",\r\n success: function (json) {\r\n ob_esc = json;\r\n }\r\n });\r\n\r\n $translateProvider.translations('en', ob_en);\r\n $translateProvider.translations('bg', ob_bg);\r\n $translateProvider.translations('pl', ob_pl);\r\n $translateProvider.translations('es', ob_es);\r\n $translateProvider.translations('esc', ob_esc);\r\n\r\n\r\n }]);\r\n\r\nvar appwaiver = angular.module('appwaiver', ['ngSanitize', 'pascalprecht.translate'])\r\n.config(['$translateProvider',\r\n\tfunction ($translateProvider) {\r\n\r\n\t $translateProvider.translations('en', dictEN)\r\n\t\t\t.translations('bg', dictBG)\r\n .translations('es', dictES)\r\n .translations('esc', dictESC);\r\n\r\n if (curLang) {\r\n curLang = getLangAbr(curLang)\r\n $translateProvider.preferredLanguage(curLang);\r\n }else if ( gym[0].Culture == 'bg-BG') {\r\n $translateProvider.preferredLanguage('bg');\r\n }else if(gym[0].Culture.includes('-ES')){\r\n if (gym[0].Culture == 'ca-ES' || gym[0].Culture == 'ca-ES-valencia') {\r\n $translateProvider.preferredLanguage('esc');\r\n }else{\r\n $translateProvider.preferredLanguage('es');\r\n }\r\n }else{\r\n $translateProvider.preferredLanguage('en');\r\n }\r\n\r\n function getLangAbr(lang){\r\n let newLang;\r\n if (lang == 'English') {\r\n newLang = 'en';\r\n }else if (lang == 'Bulgarian'){\r\n newLang = 'bg';\r\n }else if (lang == 'Spanish'){\r\n newLang = 'es';\r\n }else if(lanng == 'Catalan'){\r\n newLang = 'esc';\r\n }else{\r\n newLang = 'en';\r\n }\r\n\r\n return newLang;\r\n }\r\n\r\n\t}])\r\n.controller('MainController', ['$scope', '$http', '$timeout', '$translate', '$sce', function ($scope, $http, $timeout, $translate, $sce) {\r\n $scope.completed = false;\r\n $scope.loaded = true;\r\n $scope.error = false;\r\n $scope.error500 = false;\r\n $scope.kidsWaiver = false;\r\n $scope.waiverInfo = { LoyaltyProgram: false };\r\n $scope.waiverInfo.Client = {};\r\n $scope.waiverInfo.Client.LearnedFrom = '';\r\n $scope.waiverInfo.Client.MedicalConditionField = false;\r\n $scope.waiverInfo.Client.Medicalconditiontext = '';\r\n $scope.waiverInfo.Client.SendEmailField = false;\r\n $scope.waiverInfo.Client.LoyaltyProgram = false;\r\n $scope.waiverInfo.GymID = GymID;\r\n $scope.oneLanguageToRuleThemAll = false;\r\n $scope.waiverInfo.Namespace = namespace;\r\n $scope.waiverInfo.Client.Sex = null;\r\n // $scope.waiverInfo.SignaturePicture = signaturePicture;\r\n $scope.loyaltyProgram = loyaltyProgram;\r\n $scope.waiverInfo.isOnline = isOnline;\r\n $scope.legalAge = 21;\r\n $scope.waiverMinimumAge = 18;\r\n $scope.memberships = memberships;\r\n\r\n $scope.WaiverMultipleConditions = false;\r\n $scope.WaiverMultipleConditionsChildren = false;\r\n $scope.emailFormat = /^[_a-zA-Z0-9-]+(\\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-_]+(\\.[a-zA-Z0-9-]+)*(\\.[a-zA-Z]{2,4})$/;\r\n\r\n if ( legalAge != 0 && legalAge != null ) {\r\n $scope.legalAge = legalAge;\r\n $scope.legalAge += 1;\r\n }\r\n\r\n if (instructors) {\r\n $scope.instructors = instructors;\r\n }\r\n\r\n function getLangAbr(lang){\r\n let newLang;\r\n if (lang == 'English') {\r\n newLang = 'en';\r\n }else if (lang == 'Bulgarian'){\r\n newLang = 'bg';\r\n }else if (lang == 'Spanish'){\r\n newLang = 'es';\r\n }else if(lanng == 'Catalan'){\r\n newLang = 'esc';\r\n }else{\r\n newLang = 'en';\r\n }\r\n\r\n return newLang;\r\n }\r\n\r\n $('#address-input-val').on('keyup', function(){\r\n var input = $(this);\r\n val = $(this).val();\r\n if (val.length > 3) {\r\n input.addClass('hidden-input');\r\n $('#address-input').removeClass('hidden-input').val(val).focus();\r\n }else{\r\n input.removeClass('hidden-input');\r\n $('#address-input').addClass('hidden-input')\r\n }\r\n $scope.waiverInfo.Client.Address = val;\r\n })\r\n\r\n $('#address-input').on('keyup', function(){\r\n var input = $(this);\r\n val = $(this).val();\r\n if (val.length > 3) {\r\n input.removeClass('hidden-input');\r\n $('#address-input-val').addClass('hidden-input')\r\n }else{\r\n input.addClass('hidden-input');\r\n $('#address-input-val').removeClass('hidden-input').val(val).focus();\r\n }\r\n $scope.waiverInfo.Client.Address = val;\r\n })\r\n\r\n $('#city-input-val').on('keyup', function(){\r\n var input = $(this);\r\n val = $(this).val();\r\n if (val.length > 3) {\r\n input.addClass('hidden-input');\r\n $('#city-input').removeClass('hidden-input').val(val).focus();\r\n }else{\r\n input.removeClass('hidden-input');\r\n $('#city-input').addClass('hidden-input')\r\n }\r\n $scope.waiverInfo.Client.City = val;\r\n })\r\n\r\n $('#city-input').on('keyup', function(){\r\n var input = $(this);\r\n val = $(this).val();\r\n if (val.length > 3) {\r\n input.removeClass('hidden-input');\r\n $('#city-input-val').addClass('hidden-input')\r\n }else{\r\n input.addClass('hidden-input');\r\n $('#city-input-val').removeClass('hidden-input').val(val).focus();\r\n }\r\n $scope.waiverInfo.Client.City = val;\r\n })\r\n\r\n var currentYear = new Date().getFullYear();\r\n var endYear = new Date().getFullYear();\r\n $scope.years = [];\r\n $scope.yearsKid = [];\r\n var startYear = new Date();\r\n var startYearKid = new Date();\r\n startYear.setFullYear(startYear.getFullYear() - 100);\r\n startYearKid.setFullYear(startYearKid.getFullYear() - $scope.legalAge);\r\n\r\n startYear = startYear.getFullYear();\r\n startYearKid = startYearKid.getFullYear();\r\n\r\n while (startYear <= endYear) {\r\n $scope.years.push(startYear++);\r\n }\r\n\r\n while (startYearKid <= currentYear) {\r\n $scope.yearsKid.push(startYearKid++);\r\n }\r\n\r\n if (showEvents) {\r\n $scope.showEvents = showEvents;\r\n $scope.eventsCurrentDay = currentDay;\r\n $scope.eventsCurrentEvent = eventID;\r\n $scope.events = events;\r\n $scope.eventsLength = $scope.events.length;\r\n\r\n var now = new Date();\r\n var myTimeSpan = 30 * 60 * 1000; // 45 minutes in milliseconds\r\n now.setTime(now.getTime() - myTimeSpan);\r\n\r\n $scope.events.filter(function (el) { return (el.Date >= now); })\r\n }\r\n\r\n if (waiver && waiver[0].WaiverRefresh == true) {\r\n var time = new Date().getTime();\r\n $(document.body).bind(\"mousemove keypress touchstart touch\", function (e) {\r\n time = new Date().getTime();\r\n });\r\n\r\n var timeout = 360000;\r\n if (waiver[0].WaiverRefreshRate) {\r\n timeout = waiver[0].WaiverRefreshRate * 1000;\r\n }\r\n\r\n function refresh() {\r\n if (new Date().getTime() - time >= timeout) {\r\n window.location.reload(true);\r\n } else {\r\n setTimeout(refresh, timeout);\r\n }\r\n }\r\n\r\n setTimeout(refresh, timeout);\r\n }\r\n\r\n\r\n // New Waiver START HERE\r\n var waiversMainInfo = { Name: '', ID: 0, Languages: [] }\r\n $scope.waiverPreDefined = false;\r\n var selectedWav = false;\r\n\r\n $scope.waivers = [];\r\n $scope.waiverLang = '';\r\n\r\n $.each(waiver, function (index, value) {\r\n var self = $(this)[0];\r\n\r\n waiversMainInfo = { Name: self.Name, ID: self.Id, Languages: [] }\r\n\r\n $.each(self.Waivers, function () {\r\n var innerSelf = $(this)[0];\r\n\r\n waiversMainInfo.Languages.push(innerSelf.Language);\r\n });\r\n\r\n $scope.waivers.push(waiversMainInfo);\r\n\r\n });\r\n\r\n $scope.waiverStep = 1;\r\n\r\n $scope.nextStep = function (index) {\r\n $scope.waiverStep = index;\r\n }\r\n\r\n $scope.prevStep = function (index) {\r\n if (index == 1 && $scope.waiverPreDefined == true) {\r\n\r\n } else {\r\n if (index < $scope.waiverStep) {\r\n $scope.waiverStep = index;\r\n $scope.objectChoosen = false;\r\n $scope.waiverInfo.Client = {};\r\n $scope.waiverInfo.Client.MedicalConditionField = false;\r\n $scope.waiverInfo.Client.Medicalconditiontext = '';\r\n $scope.waiverInfo.Client.SendEmailField = false;\r\n $scope.kidsWaiver = false;\r\n $scope.clearSignature();\r\n $scope.ready = false;\r\n $scope.kids = [];\r\n $scope.resetForm();\r\n }\r\n }\r\n\r\n if (index == 1) {\r\n $scope.innerWaiver = false;\r\n $scope.oneLanguageToRuleThemAll = false;\r\n }\r\n }\r\n\r\n $scope.chooseLanguage = function (lang) {\r\n var result = $.grep($scope.mainWaiver.Waivers, function (e) { return e.Language == lang; });\r\n lang = getLangAbr(lang)\r\n $scope.lang = lang;\r\n $scope.waiverMinimumAge = 0;\r\n \r\n $translate.use(lang);\r\n\r\n if (result.length > 0) {\r\n $scope.innerWaiver = result[0];\r\n $scope.waiverInfo.WaiverID = result[0].ID;\r\n\r\n $scope.waiverInfo.Client.MedicalConditionField = $scope.innerWaiver.MedicalConditionField;\r\n $scope.waiverInfo.Client.Medicalconditiontext = $scope.innerWaiver.Medicalconditiontext;\r\n\r\n\r\n if ( $scope.innerWaiver.WaiverMultipleConditions != null ) {\r\n $scope.WaiverMultipleConditions = true;\r\n $scope.innerWaiver.WaiverMultipleConditions = JSON.parse($scope.innerWaiver.WaiverMultipleConditions);\r\n\r\n for (var i = 0; i < $scope.innerWaiver.WaiverMultipleConditions.length; i++) {\r\n $scope.innerWaiver.WaiverMultipleConditions[i].Content = $sce.trustAsHtml($scope.innerWaiver.WaiverMultipleConditions[i].Content);\r\n }\r\n }\r\n\r\n if ( $scope.innerWaiver.WaiverMultipleConditionsChildren != null ) {\r\n $scope.WaiverMultipleConditionsChildren = true;\r\n $scope.innerWaiver.WaiverMultipleConditionsChildren = JSON.parse($scope.innerWaiver.WaiverMultipleConditionsChildren);\r\n\r\n for (var i = 0; i < $scope.innerWaiver.WaiverMultipleConditionsChildren.length; i++) {\r\n $scope.innerWaiver.WaiverMultipleConditionsChildren[i].Content = $sce.trustAsHtml($scope.innerWaiver.WaiverMultipleConditionsChildren[i].Content);\r\n }\r\n }\r\n\r\n if ($scope.innerWaiver.DocumentName == undefined) {\r\n $scope.waiverKids();\r\n }\r\n\r\n if ($scope.innerWaiver.DocumentNameChildren == undefined) {\r\n $scope.waiverNoKids();\r\n }\r\n } else {\r\n $scope.innerWaiver = false;\r\n }\r\n }\r\n\r\n $scope.chooseWaiver = function (id) {\r\n var result = $.grep(waiver, function (e) { return e.Id == id; });\r\n $scope.mainWaiver = { Name: result[0].Name, ID: result[0].Id, Duration: result[0].Duration, SubtypeID: result[0].SubtypeID, Waivers: result[0].Waivers, WaiverId: id, RedirectTo: result[0].RedirectTo }\r\n $scope.mainWaiver = result[0];\r\n $scope.waiverStep = 2;\r\n\r\n if ( $scope.waiverPreDefined && curLang) {\r\n $scope.chooseLanguage(curLang)\r\n $scope.oneLanguageToRuleThemAll = true;\r\n } else if ($scope.mainWaiver.Waivers.length <= 1) {\r\n $scope.chooseLanguage($scope.mainWaiver.Waivers[0].Language)\r\n $scope.oneLanguageToRuleThemAll = true;\r\n } else {\r\n $scope.oneLanguageToRuleThemAll = false;\r\n }\r\n\r\n // $scope.$apply();\r\n }\r\n\r\n\r\n if (window.location.hash) {\r\n var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character\r\n var hashes = hash.split('=');\r\n\r\n if (hashes[0] == 'WavID') {\r\n selectedWav = hashes[1];\r\n\r\n $scope.waiverPreDefined = true;\r\n $scope.chooseWaiver(selectedWav);\r\n }\r\n }\r\n\r\n $('.menu-trigger').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n $('.header').toggleClass('show-menu');\r\n })\r\n\r\n $('#generalConditionscheck').on('change', function () {\r\n if ($scope.waiverInfo.Client.GeneralConditions && ($scope.innerWaiver.WaiverPrivacyPolicyEnabled == false || $scope.waiverInfo.Client.PrivacyPolicyAgreed)) {\r\n var checkbox = $(this);\r\n\r\n if (checkbox.is(':checked')) {\r\n $(\"html, body\").animate({ scrollTop: 0 }, \"slow\");\r\n }\r\n }\r\n })\r\n\r\n $('#WaiverPrivacyPolicyEnabledChecked').on('change', function () {\r\n if ($scope.waiverInfo.Client.GeneralConditions && ($scope.innerWaiver.WaiverPrivacyPolicyEnabled == false || $scope.waiverInfo.Client.PrivacyPolicyAgreed)) {\r\n var checkbox = $(this);\r\n\r\n if (checkbox.is(':checked')) {\r\n $(\"html, body\").animate({ scrollTop: 0 }, \"slow\");\r\n }\r\n }\r\n })\r\n\r\n $(document).on('change', '.document-row .checkbox-field input', function () {\r\n if ($scope.GeneralConditionsForm.$valid) {\r\n $(\"html, body\").animate({ scrollTop: 0 }, \"slow\");\r\n }\r\n })\r\n\r\n $scope.resetForm = function () {\r\n // Set the field values back to the original default values\r\n $scope.defaultFormData = angular.copy($scope.resetCopy);\r\n $scope.waiverForm.$setPristine();\r\n $scope.waiverForm.$setValidity();\r\n $scope.waiverForm.$setUntouched();\r\n // in my case I had to call $apply to refresh the page, you may also need this.\r\n $scope.$apply();\r\n location.reload();\r\n }\r\n // New Waiver END HERE\r\n\r\n // if ( gamifier ) {\r\n // $scope.gamifier = gamifier;\r\n\r\n // $scope.gamifierFields = [];\r\n\r\n // $scope.addGamifier = function () {\r\n // $scope.gamifierItem = {};\r\n // $scope.gamifierItem.PlayerName = '';\r\n // $scope.gamifierItem.Rfid = '';\r\n \r\n // $scope.gamifierFields.push($scope.gamifierItem);\r\n // }\r\n\r\n // $scope.addGamifier();\r\n\r\n // $scope.removeGamifier = function (i) {\r\n // if ($scope.gamifierFields.length > 1)\r\n // $scope.gamifierFields.splice(i, 1);\r\n // }\r\n\r\n // }\r\n\r\n if ( gamifier ) {\r\n $scope.gamifier = gamifier;\r\n\r\n $scope.gamifierFields = [];\r\n \r\n $scope.addGamifier = function () {\r\n $scope.gamifierItem = {};\r\n $scope.gamifierItem.PlayerName = '';\r\n $scope.gamifierItem.Rfid = '';\r\n \r\n $scope.gamifierFields.push($scope.gamifierItem);\r\n }\r\n $scope.removeGamifier = function (i) {\r\n if ($scope.gamifierFields.length > 1)\r\n $scope.gamifierFields.splice(i, 1);\r\n }\r\n }\r\n\r\n\r\n $scope.kids = [];\r\n\r\n $scope.waiverKids = function () {\r\n $scope.kidsWaiver = true;\r\n $scope.kid = {};\r\n $scope.kid.Name = '';\r\n $scope.kid.Birthday = '';\r\n $scope.kid.Sex = 0;\r\n $scope.kid.Sex = null;\r\n $scope.ready = true;\r\n\r\n if ( gamifier ) {\r\n $scope.kid.PlayerName = '';\r\n $scope.kid.Rfid = '';\r\n }\r\n\r\n $scope.kids.push($scope.kid);\r\n $scope.waiverStep = 3;\r\n\r\n if (!$scope.WaiverMultipleConditionsChildren) {\r\n $('.iframe-wrapper').html(\"\");\r\n }\r\n }\r\n\r\n $scope.waiverNoKids = function () {\r\n $scope.kidsWaiver = false;\r\n $scope.ready = true;\r\n $scope.waiverStep = 3;\r\n\r\n if ( gamifier ) {\r\n $scope.addGamifier();\r\n }\r\n\r\n if ( !$scope.WaiverMultipleConditions ) {\r\n $('.iframe-wrapper').html(\"\");\r\n }\r\n }\r\n\r\n $scope.backButton = function () {\r\n $scope.waiverInfo.Client = {};\r\n $scope.waiverInfo.Client.MedicalConditionField = false;\r\n $scope.waiverInfo.Client.Medicalconditiontext = '';\r\n $scope.waiverInfo.Client.SendEmailField = false;\r\n $scope.kidsWaiver = false;\r\n $scope.clearSignature();\r\n $scope.ready = false;\r\n $scope.kids = [];\r\n $scope.kid.Birthday = '';\r\n $scope.waiverInfo.Client.Birthday = '';\r\n $scope.resetForm();\r\n }\r\n\r\n $scope.addChild = function () {\r\n $scope.kid = {};\r\n $scope.kid.Name = '';\r\n $scope.kid.Birthday = '';\r\n $scope.kid.Sex = 0;\r\n $scope.kid.Sex = null;\r\n $scope.kid.ValidBirthday = true;\r\n\r\n if ( gamifier ) {\r\n $scope.kid.PlayerName = '';\r\n $scope.kid.Rfid = '';\r\n }\r\n\r\n $scope.kids.push($scope.kid);\r\n }\r\n\r\n $scope.updateInstructor = function(){\r\n $scope.waiverInfo.Client.InstructorName = $('#selectInstructor option:selected').text();\r\n console.log($scope.waiverInfo.Client.InstructorName);\r\n }\r\n\r\n var c = document.getElementById(\"signature\");\r\n var ctx = c.getContext(\"2d\");\r\n ctx.clearRect(0, 0, 300, 300);\r\n\r\n $scope.clearSignature = function () {\r\n var c = document.getElementById(\"signature\");\r\n var ctx = c.getContext(\"2d\");\r\n ctx.clearRect(0, 0, 300, 300);\r\n }\r\n\r\n\r\n var cInstr = document.getElementById(\"signatureInstr\");\r\n var ctxInstr = cInstr.getContext(\"2d\");\r\n ctxInstr.clearRect(0, 0, 300, 300);\r\n\r\n $scope.clearSignatureInstr = function () {\r\n var cInstr = document.getElementById(\"signatureInstr\");\r\n var ctxInstr = cInstr.getContext(\"2d\");\r\n ctxInstr.clearRect(0, 0, 300, 300);\r\n }\r\n\r\n $scope.removeKid = function (i) {\r\n if ($scope.kids.length > 1)\r\n $scope.kids.splice(i, 1);\r\n }\r\n\r\n $scope.errorFalse = function () {\r\n $scope.error = false;\r\n $scope.error500 = false;\r\n }\r\n\r\n // $scope.checkIban = function(){\r\n // var BICFromIBAN = require (\"BICFromIBAN\");\r\n \r\n // // Return true if the IBAN is a correct banck account \r\n // var isValid = BICFromIBAN.validateIBAN(\"DZ4000400174401001050486\");\r\n // }\r\n\r\n function checkIban(iban){\r\n Openiban\r\n .validate(iban)\r\n .then(function (result) {\r\n if ( result.valid ) {\r\n $('#sepaIbanCkeckbox:not(:checked)').trigger('click');\r\n }else{\r\n $('#sepaIbanCkeckbox:checked').trigger('click');\r\n }\r\n $scope.$apply();\r\n })\r\n .catch(function (err) {\r\n // some http error has occurred\r\n });\r\n }\r\n\r\n $(document).on('keyup change', '#iban-field', function(){\r\n checkIban($(this).val());\r\n })\r\n\r\n function daysInMonth(m, y) { // m is 0 indexed: 0-11\r\n switch (m) {\r\n case 1:\r\n return (y % 4 == 0 && y % 100) || y % 400 == 0 ? 29 : 28;\r\n case 8: case 3: case 5: case 10:\r\n return 30;\r\n default:\r\n return 31\r\n }\r\n }\r\n\r\n function isValid(d, m, y) {\r\n return m >= 0 && m < 12 && d > 0 && d <= daysInMonth(m, y);\r\n }\r\n\r\n function checkAges(date) {\r\n if ($scope.innerWaiver.WaiverMinimumAge != 0) {\r\n $scope.waiverMinimumAge = $scope.innerWaiver.WaiverMinimumAge;\r\n }\r\n\r\n var currentYear = new Date().getFullYear();\r\n var minDate = new Date();\r\n minDate.setFullYear(currentYear - $scope.waiverMinimumAge);\r\n minDate.setHours(0, 0, 0, 0);\r\n checkDate = new Date(date);\r\n checkDate.setHours(0, 0, 0, 0);\r\n\r\n if (checkDate <= minDate) {\r\n $scope.readyToSendMainAdult = true;\r\n } else {\r\n $scope.readyToSendMainAdult = false;\r\n $scope.loaded = true;\r\n }\r\n }\r\n\r\n function checkKidAges(date, kidID) {\r\n var currentYear = new Date().getFullYear();\r\n var minDate = new Date();\r\n minDate.setFullYear(currentYear - $scope.legalAge);\r\n minDate.setHours(0, 0, 0, 0);\r\n\r\n checkDate = new Date(date);\r\n checkDate.setHours(0, 0, 0, 0);\r\n\r\n if (checkDate >= minDate) {\r\n $scope.readyToSendKid = true;\r\n $scope.kids[kidID].ValidBirthdayAges = true;\r\n } else {\r\n $scope.loaded = true;\r\n $scope.readyToSendKid = false;\r\n $scope.kids[kidID].ValidBirthdayAges = false;\r\n }\r\n }\r\n\r\n $scope.readyToSendKid = true;\r\n $scope.readyToSendMain = true;\r\n $scope.readyToSendMainAdult = true;\r\n $scope.touchedMain = false;\r\n $scope.touchedChild = false;\r\n\r\n $(document).on('change', '.birthdaymain-fields select', function () {\r\n $scope.touchedMain = true;\r\n });\r\n $(document).on('change', '.birthdaychild-fields select', function () {\r\n $scope.touchedChild = true;\r\n });\r\n\r\n $(document).on('change', '.birthdaychild-fields select[name=\"BirthdateChildYear\"]', function () {\r\n var yearVal = parseInt($(this).val());\r\n var parentWrap = $(this).parents('.child-wrap');\r\n parentWrap.removeClass('show-alert');\r\n\r\n if ($scope.innerWaiver.WaiverParentRequiredAge != 0) {\r\n var currentYear = new Date().getFullYear();\r\n var minYear = parseInt(currentYear - $scope.innerWaiver.WaiverParentRequiredAge)\r\n if (yearVal >= minYear) {\r\n parentWrap.addClass('show-alert');\r\n } else {\r\n parentWrap.removeClass('show-alert');\r\n }\r\n }\r\n\r\n $scope.$apply();\r\n });\r\n $scope.sendwaiver = function () {\r\n var signatureReady = false;\r\n\r\n if ( $scope.innerWaiver.InstructorWaiver == true ) {\r\n var signatureInstrReady = false;\r\n if ( !isCanvasBlank(document.getElementById(\"signatureInstr\")) ) {\r\n $('.signatureInstr-wrapper').removeClass('invalid');\r\n signatureInstrReady = true;\r\n }else{\r\n $('.signatureInstr-wrapper').addClass('invalid');\r\n signatureInstrReady = false;\r\n }\r\n }\r\n\r\n if (!isCanvasBlank(document.getElementById(\"signature\"))) {\r\n $('.signature-wrapper').removeClass('invalid');\r\n signatureReady = true;\r\n }else{\r\n $('.signature-wrapper').addClass('invalid');\r\n signatureReady = false;\r\n }\r\n\r\n if ( $scope.innerWaiver.InstructorWaiver == true ) {\r\n if ( signatureReady && signatureInstrReady ) {\r\n send()\r\n }\r\n }else{\r\n if (signatureReady) {\r\n send()\r\n }\r\n }\r\n }\r\n\r\n function send(){\r\n if ( $scope.showCamera && !$scope.waiverInfo.Client.ClientPicture ) {\r\n $scope.takeSnapshot();\r\n }\r\n var currentYear = new Date().getFullYear();\r\n $scope.waiverInfo.Client.Address = $('#address-input').val();\r\n $scope.waiverInfo.Client.City = $('#city-input').val();\r\n\r\n $scope.sending = true;\r\n\r\n if ($scope.loaded == true) {\r\n $scope.loaded = false;\r\n\r\n for (var key = 0; key < $scope.kids.length; key++) {\r\n if ($scope.innerWaiver.BirthdayChildEnabled && $scope.touchedChild) {\r\n if (isValid($scope.kids[key].BirthdateChildDay, $scope.kids[key].BirthdateChildMonth - 1, $scope.kids[key].BirthdateChildYear)) {\r\n $scope.kids[key].Birthday = $scope.kids[key].BirthdateChildMonth + '/' + $scope.kids[key].BirthdateChildDay + '/' + $scope.kids[key].BirthdateChildYear;\r\n $scope.kids[key].Birthday = moment($scope.kids[key].Birthday).format(\"YYYY-MM-DDTHH:mm:ss\");\r\n checkKidAges($scope.kids[key].Birthday, [key]);\r\n // $scope.readyToSendKid = true;\r\n $scope.kids[key].ValidBirthday = true;\r\n } else {\r\n $scope.loaded = true;\r\n $scope.readyToSendKid = false;\r\n $scope.kids[key].ValidBirthday = false;\r\n }\r\n }\r\n }\r\n\r\n if ($scope.innerWaiver.BirthdateEnabled && $scope.touchedMain) {\r\n if (isValid($scope.clientBirthdayDay, $scope.clientBirthdayMonth - 1, $scope.clientBirthdayYear)) {\r\n $scope.readyToSendMain = true;\r\n $scope.waiverInfo.Client.Birthday = $scope.clientBirthdayMonth + '/' + $scope.clientBirthdayDay + '/' + $scope.clientBirthdayYear;\r\n $scope.waiverInfo.Client.Birthday = moment($scope.waiverInfo.Client.Birthday).format(\"YYYY-MM-DDTHH:mm:ss\");\r\n checkAges($scope.waiverInfo.Client.Birthday);\r\n } else {\r\n $scope.loaded = true;\r\n $scope.readyToSendMain = false;\r\n }\r\n }\r\n\r\n $scope.waiverInfo.Client.Kids = $scope.kids;\r\n\r\n var resultValidBirthday = $.grep($scope.waiverInfo.Client.Kids, function (e) { return e.ValidBirthday == false; });\r\n var resultValidBirthdayAges = $.grep($scope.waiverInfo.Client.Kids, function (e) { return e.ValidBirthdayAges == false; });\r\n if (resultValidBirthday.length > 0 || resultValidBirthdayAges.length > 0) {\r\n $scope.readyToSendKid = false;\r\n }\r\n\r\n var image = document.getElementById(\"signature\").toDataURL(\"image/png\");\r\n $scope.waiverInfo.Client.Signature = image;\r\n var imageInstr = document.getElementById(\"signatureInstr\").toDataURL(\"image/png\");\r\n $scope.waiverInfo.Client.InstructorSignature = imageInstr;\r\n\r\n $scope.waiverInfo.kidsWaiver = $scope.kidsWaiver;\r\n $scope.waiverInfo.BirthdayID = $('#birthdayevent').val();\r\n $scope.waiverInfo.Client.LoyaltyProgram = $scope.waiverInfo.LoyaltyProgram;\r\n \r\n if ($scope.readyToSendKid == true && $scope.readyToSendMain == true && $scope.readyToSendMainAdult == true) {\r\n $http.post('/waiver/SignWaiver', $scope.waiverInfo)\r\n .then(function successCallback(d) {\r\n $scope.completed = true;\r\n $scope.loaded = true;\r\n if ( kioskRedirect == true ) {\r\n var kioskHref = window.location.origin + '/OnlineBooking/KioskBooking?GymID=' + params.GymID + '&NameSpace=' + params.NameSpace;\r\n window.location.href = kioskHref;\r\n }else{\r\n $timeout(function () {\r\n if ($scope.innerWaiver.RedirectTo != undefined && $scope.innerWaiver.RedirectTo != '' && $scope.innerWaiver.RedirectTo != null && isOnline == true) {\r\n window.location.href = $scope.innerWaiver.RedirectTo;\r\n return;\r\n }\r\n location.reload();\r\n }, 1000)\r\n }\r\n\r\n }, function errorCallback(d) {\r\n if (d.status == 500) {\r\n $scope.error500 = true;\r\n }\r\n $scope.completed = false;\r\n $scope.loaded = true;\r\n $scope.sending = false;\r\n $scope.error = true;\r\n });\r\n }\r\n }\r\n $scope.sending = false;\r\n }\r\n $scope.showCamera = showCamera;\r\n\r\n if ($scope.showCamera) {\r\n Webcam.set({\r\n width: 320,\r\n height: 240,\r\n image_format: 'jpeg',\r\n jpeg_quality: 90\r\n });\r\n Webcam.attach( '#my_camera' );\r\n\r\n $scope.takeSnapshot = function(){\r\n // take snapshot and get image data\r\n Webcam.snap( function(data_uri) {\r\n // display results in page\r\n document.getElementById('results').innerHTML = \r\n '';\r\n $scope.waiverInfo.Client.ClientPicture = data_uri;\r\n } );\r\n }\r\n\r\n Webcam.on( 'error', function(err) {\r\n $scope.showCamera = false;\r\n } );\r\n }\r\n\r\n function isCanvasBlank(canvas) {\r\n var blank = document.createElement('canvas');\r\n blank.width = canvas.width;\r\n blank.height = canvas.height;\r\n\r\n return canvas.toDataURL() == blank.toDataURL();\r\n }\r\n\r\n if ($scope.waivers.length == 1) {\r\n $scope.chooseWaiver($scope.waivers[0].ID)\r\n }\r\n}]).directive('jqdatepicker', function () {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function (scope, element, attrs, ngModelCtrl) {\r\n\r\n if (language.indexOf('Polish') > -1) {\r\n element.datepicker({\r\n firstDay: 1,\r\n showOtherMonths: true,\r\n changeYear: true,\r\n yearRange: \"-90:+0\",\r\n dateFormat: 'mm-dd-yy',\r\n dayNames: [\"poniedziałek\", \"wtorek\", \"środa\", \"czwartek\", \"piątek\", \"sobota\", \"niedziela\"],\r\n dayNamesMin: [\"Pon\", \"Wt\", \"śr\", \"czw\", \"pt\", \"sb\", \"nie\"],\r\n dayNamesShort: [\"Pon\", \"Wt\", \"śr\", \"czw\", \"pt\", \"sb\", \"nie\"],\r\n monthNames: [\"styczeń\", \"luty\", \"marzec\", \"kwiecień\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpień\", \"wrzesień\", \"październik\", \"listopad\", \"grudzień\"],\r\n monthNamesShort: [\"styczeń\", \"luty\", \"marzec\", \"kwiecień\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpień\", \"wrzesień\", \"październik\", \"listopad\", \"grudzień\"],\r\n onSelect: function (date) {\r\n scope.kid.Birthday = date;\r\n scope.$apply();\r\n }\r\n });\r\n element.datepicker(\"option\", $.datepicker.regional[\"pl\"]);\r\n } else {\r\n element.datepicker({\r\n firstDay: 1,\r\n showOtherMonths: true,\r\n changeYear: true,\r\n yearRange: \"-90:+0\",\r\n dateFormat: 'mm-dd-yy',\r\n onSelect: function (date) {\r\n scope.kid.Birthday = date;\r\n scope.$apply();\r\n }\r\n });\r\n\r\n element.datepicker(\"option\", $.datepicker.regional[\"en\"]);\r\n }\r\n\r\n\r\n // language = attrs.lang;\r\n // if (language.indexOf('Bulgarian') > -1){\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"bg\" ] );\r\n // }\r\n // else if (language.indexOf('Polish') > -1){\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"pl\" ] );\r\n // }\r\n // else{\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"en\" ] );\r\n // }\r\n }\r\n };\r\n}).directive('cljqdatepicker', function () {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function (scope, element, attrs, ngModelCtrl) {\r\n\r\n var el = element;\r\n\r\n language = attrs.lang;\r\n\r\n if (language.indexOf('Polish') > -1) {\r\n element.datepicker({\r\n firstDay: 1,\r\n showOtherMonths: true,\r\n changeYear: true,\r\n yearRange: \"-90:+0\",\r\n dateFormat: 'mm-dd-yy',\r\n dayNames: [\"poniedziałek\", \"wtorek\", \"środa\", \"czwartek\", \"piątek\", \"sobota\", \"niedziela\"],\r\n dayNamesMin: [\"Pon\", \"Wt\", \"śr\", \"czw\", \"pt\", \"sb\", \"nie\"],\r\n dayNamesShort: [\"Pon\", \"Wt\", \"śr\", \"czw\", \"pt\", \"sb\", \"nie\"],\r\n monthNames: [\"styczeń\", \"luty\", \"marzec\", \"kwiecień\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpień\", \"wrzesień\", \"październik\", \"listopad\", \"grudzień\"],\r\n monthNamesShort: [\"styczeń\", \"luty\", \"marzec\", \"kwiecień\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpień\", \"wrzesień\", \"październik\", \"listopad\", \"grudzień\"],\r\n onSelect: function (date) {\r\n scope.waiverInfo.Client.Birthday = date;\r\n scope.$apply();\r\n }\r\n });\r\n element.datepicker(\"option\", $.datepicker.regional[\"pl\"]);\r\n } else {\r\n element.datepicker({\r\n firstDay: 1,\r\n showOtherMonths: true,\r\n changeYear: true,\r\n yearRange: \"-90:+0\",\r\n dateFormat: 'mm-dd-yy',\r\n onSelect: function (date) {\r\n scope.waiverInfo.Client.Birthday = date;\r\n scope.$apply();\r\n }\r\n });\r\n element.datepicker(\"option\", $.datepicker.regional[\"en\"]);\r\n\r\n if (scope.eventsCurrentDay = true) {\r\n var today = new Date();\r\n el.datepicker(\"setDate\", today);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n // if (language.indexOf('Bulgarian') > -1){\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"bg\" ] );\r\n // }\r\n // else if (language.indexOf('Polish') > -1){\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"pl\" ] );\r\n // }\r\n // else{\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"en\" ] );\r\n // }\r\n }\r\n };\r\n}).directive(\"drawing\", function () {\r\n return {\r\n restrict: \"A\",\r\n link: function (scope, element) {\r\n var ctx = element[0].getContext('2d');\r\n\r\n // variable that decides if something should be drawn on mousemove\r\n var drawing = false;\r\n\r\n // the last coordinates before the current move\r\n var lastX;\r\n var lastY;\r\n\r\n element.bind('mousedown', function (event) {\r\n if (event.offsetX !== undefined) {\r\n lastX = event.offsetX;\r\n lastY = event.offsetY;\r\n } else { // Firefox compatibility\r\n lastX = event.layerX - event.currentTarget.offsetLeft;\r\n lastY = event.layerY - event.currentTarget.offsetTop;\r\n }\r\n\r\n // begins new line\r\n ctx.beginPath();\r\n\r\n drawing = true;\r\n });\r\n element.bind('mousemove', function (event) {\r\n if (drawing) {\r\n // get current mouse position\r\n if (event.offsetX !== undefined) {\r\n currentX = event.offsetX;\r\n currentY = event.offsetY;\r\n } else {\r\n currentX = event.layerX - event.currentTarget.offsetLeft;\r\n currentY = event.layerY - event.currentTarget.offsetTop;\r\n }\r\n\r\n draw(lastX, lastY, currentX, currentY);\r\n\r\n // set current coordinates to last one\r\n lastX = currentX;\r\n lastY = currentY;\r\n }\r\n\r\n });\r\n element.bind('mouseup', function (event) {\r\n // stop drawing\r\n drawing = false;\r\n });\r\n\r\n element.bind('touchstart', function (event) {\r\n if (event.originalEvent.touches != undefined && event.originalEvent.touches.length != undefined && event.originalEvent.touches.length == 1) {\r\n var touch = event.originalEvent.touches[0];\r\n lastX = touch.pageX - event.currentTarget.offsetLeft;\r\n lastY = touch.pageY - event.currentTarget.offsetTop;\r\n }\r\n // begins new line\r\n ctx.beginPath();\r\n\r\n drawing = true;\r\n });\r\n element.bind('touchmove', function (event) {\r\n if (drawing && event.originalEvent.touches != undefined && event.originalEvent.touches.length != undefined && event.originalEvent.touches.length == 1) {\r\n // get current mouse position\r\n event.preventDefault();\r\n var touch = event.originalEvent.touches[0];\r\n currentX = touch.pageX - event.currentTarget.offsetLeft;\r\n currentY = touch.pageY - event.currentTarget.offsetTop;\r\n\r\n draw(lastX, lastY, currentX, currentY);\r\n\r\n // set current coordinates to last one\r\n lastX = currentX;\r\n lastY = currentY;\r\n }\r\n\r\n });\r\n element.bind('MSPointerMove', function (event) {\r\n if (drawing && event.originalEvent.touches != undefined && event.originalEvent.touches.length != undefined && event.originalEvent.touches.length == 1) {\r\n // get current mouse position\r\n event.preventDefault();\r\n var touch = event.originalEvent.touches[0];\r\n currentX = touch.pageX - event.currentTarget.offsetLeft;\r\n currentY = touch.pageY - event.currentTarget.offsetTop;\r\n\r\n draw(lastX, lastY, currentX, currentY);\r\n\r\n // set current coordinates to last one\r\n lastX = currentX;\r\n lastY = currentY;\r\n }\r\n\r\n });\r\n element.bind('touchend', function (event) {\r\n // stop drawing\r\n drawing = false;\r\n });\r\n\r\n // canvas reset\r\n function reset() {\r\n element[0].width = element[0].width;\r\n }\r\n\r\n function draw(lX, lY, cX, cY) {\r\n // line from\r\n ctx.moveTo(lX, lY);\r\n // to\r\n ctx.lineTo(cX, cY);\r\n // color\r\n ctx.strokeStyle = \"#4bf\";\r\n // draw it\r\n ctx.stroke();\r\n }\r\n }\r\n };\r\n}).directive('language', [\"$translate\", \"$http\", function ($translate, $http) {\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n template: '
\\\r\n\t\t\t\t\t\t\\\r\n\t\t\t\t\t\t{{curlang}}\\\r\n\t\t\t\t\t \\\r\n\t\t\t\t\t
',\r\n link: function ($scope, el, attrs) {\r\n $scope.languages = [\"en\", \"bg\"]\r\n $scope.setLang = function (d) {\r\n $translate.use(d);\r\n $scope.langon = false;\r\n $scope.curlang = d;\r\n }\r\n\r\n if ($scope.curlang == null) {\r\n $scope.curlang = \"en\";\r\n }\r\n }\r\n };\r\n}]);\r\n\r\n\r\nvar dictBG = {\r\n SAVE: \"Запази\",\r\n BACK: \"Назад\",\r\n NAME: \"Име:\",\r\n ADDRESS: \"Адрес:\",\r\n WAIVER: \"Декларация\",\r\n WAIVERTEXT: \"Благодарим, че ни посетихте!
Тук можете да подпишете вашето информирано съгласие електронно.
Трябва да сте на минимум 14 годишна възраст, за да можете да подпишете информирано съгласие!
Ако сте на възраст под 14 години, моля помолете Вашия родител или настойник да подпише съгласието за Вас!\",\r\n MYSELF: \"Самостоятелно\",\r\n MYSELFCHILDREN: \"За мен & децата\",\r\n IAGREE: \"Съгласен съм с тези общи условия\",\r\n FIRSTNAME: \"Име\",\r\n LASTNAME: \"Фамилия\",\r\n CITY: \"Град\",\r\n PHONE: \"Телефон\",\r\n CHILDNAME: \"Име на детето\",\r\n AGE: \"Възраст\",\r\n BIRTDATE: \"Рожденна дата:\",\r\n SEX: \"Пол\",\r\n ADDCHILD: \"Добави дете\",\r\n CLEAR: \"Изчисти\",\r\n LOADING: \"Зареждане...\",\r\n THANKYOU: \"Благодарим, че подписахте тази декларация!\",\r\n SIGNHERE: \"Подпишете тук\",\r\n SIGNHERE: \"SIGN HERE\",\r\n Sorry: \"Моля свържете се и опитайте отново.\",\r\n Oops: \"Опа!
Връзката с Интернет беше прекъсната.\",\r\n Sorry500: \"Съжаляваме. Моля, опитайте отново.\",\r\n Oops500: \"Опа!
Нещо се обърка.\",\r\n MoveOn: \"Продължи\",\r\n orderNotes: \"Бележка към поръчката\",\r\n ChooseEvent: \"Моля, попълнете всички fieldsChoose рожден ден или събитие\",\r\n tooltiptext: \"Ако посетите рожден ден или събитие, моля, изберете кой от списъка\",\r\n CreateFullProfile: \"Настройка за създаване на основни профили при подписване на групов уейвър\",\r\n EnterValidDate: \"Моля въведете коректна дата!\",\r\n EnterValidDateAdult: \"За да попълните декларацията трябва да сте поне на\",\r\n EnterValidDateAdultEnd: \"години!\",\r\n EnterValidDateKidAges: \"Детето трябва да е по-малко от\",\r\n PlayerName: \"Име на играча\",\r\n ParentPlayerName: \"Име на играча\",\r\n 'Fill in a Form':'Попълнете формуляр',\r\n 'Select Waiver':'Изберете декларация',\r\n 'Select Type & Language':'Изберете тип и език',\r\n 'Choose your Waiver!': 'Декларация за информирано съгласие',\r\n 'Select Language': 'Изберете език',\r\n 'Select Type': 'Избери вид',\r\n 'Myself': 'За мен',\r\n 'Myself and Children': 'За мен и моето дете',\r\n 'Back': 'Назад'\r\n}\r\n\r\n\r\nvar dictEN = {\r\n SAVE: \"Save\",\r\n BACK: \"Back\",\r\n NAME: \"Name:\",\r\n ADDRESS: \"Address:\",\r\n WAIVER: \"Waiver\",\r\n WAIVERTEXT: \"Thank you for visiting!
This process will allow you to digitally sign your liability waiver.
note that you must be at least 18
years old in order to sign a liability waiver. If you are not 18
years old, please ask your parent or legal guardian to complete this procedure.\",\r\n MYSELFCHILDREN: \"Myself & Children\",\r\n IAGREE: \"I agree with these general conditions\",\r\n FIRSTNAME: \"First Name\",\r\n LASTNAME: \"Last Name\",\r\n CITY: \"City\",\r\n PHONE: \"Phone\",\r\n CHILDNAME: \"Child's name\",\r\n AGE: \"Age\",\r\n BIRTDATE: \"Brithday date\",\r\n SEX: \"Sex\",\r\n ADDCHILD: \"Add Child\",\r\n CLEAR: \"Clear\",\r\n LOADING: \"Loading...\",\r\n THANKYOU: \"Thank you for signing the waiver!\",\r\n SIGNHERE: \"SIGN HERE\",\r\n Sorry: \"Please reconnect and try again.\",\r\n Oops: \"Oops!
Wi-Fi connection lost.\",\r\n Sorry500: \"We're sorry. Please try again.\",\r\n Oops500: \"Oops!
Something went wrong.\",\r\n MoveOn: \"Continue\",\r\n orderNotes: \"Order Notes\",\r\n ChooseEvent: \"Choose a birthday party or event\",\r\n tooltiptext: \"If you will attend a Birthday party or event, please choose which one from the list\",\r\n CreateFullProfile: \"Setup to create basic profiles when signing a group waiver\",\r\n EnterValidDate: \"Enter a valid date!\",\r\n EnterValidDateAdult: \"In order to complete the declaration, you must be at least\",\r\n EnterValidDateAdultEnd: \"years old!\",\r\n EnterValidDateKidAges: \"Children must be under\",\r\n PlayerName: \"Player Name\",\r\n ParentPlayerName: \"Parent Player Name\",\r\n 'Fill in a Form':'Fill in a Form',\r\n 'Select Waiver':'Select Waiver',\r\n 'Select Type & Language':'Select Type & Language',\r\n 'Choose your Waiver!': 'Choose your Waiver!',\r\n 'Select Language': 'Select Language',\r\n 'Select Type': 'Select Type',\r\n 'Myself': 'Myself',\r\n 'Myself and Children': 'Myself and Children',\r\n 'Back': 'Back'\r\n}\r\n\r\nvar dictES = {\r\n SAVE: \"Save\",\r\n BACK: \"Back\",\r\n NAME: \"Name:\",\r\n ADDRESS: \"Address:\",\r\n WAIVER: \"Waiver\",\r\n WAIVERTEXT: \"Thank you for visiting!
This process will allow you to digitally sign your liability waiver.
note that you must be at least 18
years old in order to sign a liability waiver. If you are not 18
years old, please ask your parent or legal guardian to complete this procedure.\",\r\n MYSELFCHILDREN: \"Myself & Children\",\r\n IAGREE: \"I agree with these general conditions\",\r\n FIRSTNAME: \"First Name\",\r\n LASTNAME: \"Last Name\",\r\n CITY: \"City\",\r\n PHONE: \"Phone\",\r\n CHILDNAME: \"Child's name\",\r\n AGE: \"Age\",\r\n BIRTDATE: \"Brithday date\",\r\n SEX: \"Sex\",\r\n ADDCHILD: \"Add Child\",\r\n CLEAR: \"Clear\",\r\n LOADING: \"Loading...\",\r\n THANKYOU: \"Thank you for signing the waiver!\",\r\n SIGNHERE: \"SIGN HERE\",\r\n Sorry: \"Please reconnect and try again.\",\r\n Oops: \"Oops!
Wi-Fi connection lost.\",\r\n Sorry500: \"We're sorry. Please try again.\",\r\n Oops500: \"Oops!
Something went wrong.\",\r\n MoveOn: \"Continue\",\r\n orderNotes: \"Order Notes\",\r\n ChooseEvent: \"Choose a birthday party or event\",\r\n tooltiptext: \"If you will attend a Birthday party or event, please choose which one from the list\",\r\n CreateFullProfile: \"Setup to create basic profiles when signing a group waiver\",\r\n EnterValidDate: \"¡Introduzca una fecha válida!\",\r\n EnterValidDateAdult: \"Para completar la declaración, debe ser al menos\",\r\n EnterValidDateAdultEnd: \"¡años!\",\r\n EnterValidDateKidAges: \"Los niños deben estar bajo\",\r\n PlayerName: \"Nombre del jugador\",\r\n ParentPlayerName: \"Parent Player Name\",\r\n January: \"enero\",\r\n February: \"febrero\",\r\n March: \"marzo\",\r\n April: \"abril\",\r\n May: \"mayo\",\r\n June: \"junio\",\r\n July: \"julio\",\r\n August: \"agosto\",\r\n September: \"septiembre\",\r\n October: \"octubre\",\r\n November: \"noviembre\",\r\n December: \"diciembre\",\r\n 'Fill in a Form':'Rellenar el formulario',\r\n 'Select Waiver':'Seleccionar consentimiento informado',\r\n 'Select Type & Language':'Seleccione tipo',\r\n 'Choose your Waiver!': 'CONSENTIMIENTO INFORMADO',\r\n 'Select Language': 'Elige tu idioma',\r\n 'Select Type': 'Selecciona una de las siguientes opciones',\r\n 'Myself': 'Adulto',\r\n 'Myself and Children': 'Adulto y menor',\r\n 'Back': 'Atrás'\r\n}\r\n\r\nvar dictESC = {\r\n SAVE: \"Save\",\r\n BACK: \"Trona\",\r\n NAME: \"Nom:\",\r\n ADDRESS: \"Address:\",\r\n WAIVER: \"Waiver\",\r\n WAIVERTEXT: \"Thank you for visiting!
This process will allow you to digitally sign your liability waiver.
note that you must be at least 18
years old in order to sign a liability waiver. If you are not 18
years old, please ask your parent or legal guardian to complete this procedure.\",\r\n MYSELFCHILDREN: \"Myself & Children\",\r\n IAGREE: \"I agree with these general conditions\",\r\n FIRSTNAME: \"First Name\",\r\n LASTNAME: \"Last Name\",\r\n CITY: \"City\",\r\n PHONE: \"Telèfon\",\r\n CHILDNAME: \"Child's name\",\r\n AGE: \"Age\",\r\n BIRTDATE: \"Brithday date\",\r\n SEX: \"Sex\",\r\n ADDCHILD: \"Add Child\",\r\n CLEAR: \"Clear\",\r\n LOADING: \"Cargant...\",\r\n THANKYOU: \"Thank you for signing the waiver!\",\r\n SIGNHERE: \"SIGN HERE\",\r\n Sorry: \"Please reconnect and try again.\",\r\n Oops: \"Oops!
Wi-Fi connection lost.\",\r\n Sorry500: \"We're sorry. Please try again.\",\r\n Oops500: \"Oops!
Something went wrong.\",\r\n MoveOn: \"Continue\",\r\n orderNotes: \"Comandes\",\r\n ChooseEvent: \"Choose a birthday party or event\",\r\n tooltiptext: \"If you will attend a Birthday party or event, please choose which one from the list\",\r\n CreateFullProfile: \"Setup to create basic profiles when signing a group waiver\",\r\n EnterValidDate: \"¡Introduzca una fecha válida!\",\r\n EnterValidDateAdult: \"Para completar la declaración, debe ser al menos\",\r\n EnterValidDateAdultEnd: \"¡años!\",\r\n EnterValidDateKidAges: \"Los niños deben estar bajo\",\r\n PlayerName: \"Nombre del jugador\",\r\n ParentPlayerName: \"Parent Player Name\",\r\n January: \"Gener\",\r\n February: \"Febrer\",\r\n March: \"Març\",\r\n April: \"Abril\",\r\n May: \"Maig\",\r\n June: \"Juny\",\r\n July: \"Juliol\",\r\n August: \"Agost\",\r\n September: \"Setembre\",\r\n October: \"Octubre\",\r\n November: \"Novembre\",\r\n December: \"Desembre\",\r\n 'Fill in a Form':'Rellenar el formulario',\r\n 'Select Waiver':'Seleccionar consentimiento informado',\r\n 'Select Type & Language':'Seleccione tipo',\r\n 'Choose your Waiver!': 'CONSENTIMIENTO INFORMADO',\r\n 'Select Language': 'Elige tu idioma',\r\n 'Select Type': 'Selecciona una de las siguientes opciones',\r\n 'Myself': 'Adulto',\r\n 'Myself and Children': 'Adulto y menor',\r\n 'Back': 'Atrás'\r\n}","/* global app, moment, _ */\r\n/* global getHours, insertString, formatInvitationLinks */\r\n/* global infoData, params */\r\n\r\n\"use strict\";\r\n\r\napp.controller('MainController', ['$scope', 'dataShare', '$location', '$http', '$window', '$routeParams', '$translate', function ($scope, dataShare, $location, $http, $window, $routeParams, $translate) {\r\n $scope.loop = [];\r\n $scope.loop.hasData = false;\r\n \r\n $scope.booked = [];\r\n $scope.bookfail = [];\r\n $scope.orderInfo = {};\r\n $scope.date = moment().startOf('day').add(1, 'days');\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.Discount = false;\r\n $scope.orderInfo.People = 0;\r\n $scope.orderInfo.ParentsAttending = 0;\r\n $scope.empty = true;\r\n $scope.orderInfo.deposit = false;\r\n $scope.orderInfo.TotalPrice = 0;\r\n $scope.orderInfo.TotalPriceWT = 0;\r\n $scope.orderInfo.TotalPriceDisc = 0;\r\n $scope.orderInfo.TotalPriceDiscWT = 0;\r\n $scope.orderInfo.Comment = '';\r\n $scope.orderInfo.addonsSum = 0;\r\n $scope.orderInfo.addonsSumWT = 0;\r\n $scope.orderInfo.Schedules = [];\r\n $scope.orderInfo.GymID = params.GymID;\r\n $scope.orderInfo.NameSpace = params.NameSpace;\r\n $scope.fail = 'Something went wrong with your registration.';\r\n $scope.infoData = infoData;\r\n $scope.logo = infoData.Logo;\r\n $scope.Bank = infoData.Settings.Bank;\r\n $scope.Cash = infoData.Settings.Cash;\r\n $scope.BankSingleVisit = infoData.Settings.BankSingleVisit;\r\n $scope.CashSingleVisit = infoData.Settings.CashSingleVisit;\r\n $scope.BankText = infoData.Settings.BankText;\r\n $scope.CashText = infoData.Settings.CashText;\r\n $scope.MembershipPayment = infoData.Settings.MembershipPayment;\r\n $scope.MembershipPaymentText = infoData.Settings.MembershipPaymentText;\r\n $scope.orderInfo.Earnest = infoData.Settings.Earnest;\r\n $scope.Currency = infoData.Currency;\r\n $scope.SubscriptionName = infoData.SubscriptionName;\r\n $scope.PhoneNumber = infoData.PhoneNumber;\r\n $scope.OnlineBookingTaxText = infoData.Settings.OnlineBookingTaxText;\r\n $scope.orderSent = false;\r\n $scope.PictureSingleSessions = infoData.Settings.PictureSingleSessions;\r\n $scope.TextSingleSessions = infoData.Settings.TextSingleSessions;\r\n $scope.PictureGroupSessions = infoData.Settings.PictureGroupSessions;\r\n $scope.TextGroupSessions = infoData.Settings.TextGroupSessions;\r\n $scope.PictureGroupChildrenSessions = infoData.Settings.PictureGroupChildrenSessions;\r\n $scope.TextGroupChildrenSessions = infoData.Settings.TextGroupChildrenSessions;\r\n $scope.LinkWebsite = infoData.Settings.LinkWebsite;\r\n $scope.LinkWebsiteTranslation = infoData.Settings.LinkWebsiteTranslation;\r\n $scope.Language = infoData.Country;\r\n $scope.PaySafeCard = infoData.PaySafeCard;\r\n $scope.EPay = infoData.EPay;\r\n $scope.PaySafeApiKeyFrontEnd = infoData.PaySafeApiKeyFrontEnd;\r\n $scope.CommBank = infoData.CommBank;\r\n $scope.CommBankPublicApiKey = infoData.CommBankPublicApiKey;\r\n $scope.CommBankHostedPayments = infoData.CommBankHostedPayments;\r\n $scope.Enviroment = infoData.Environment;\r\n $scope.reArenged = infoData.Settings.RegistrationLastStep;\r\n $scope.TelephoneNumberOptional = infoData.Settings.TelephoneNumberOptional;\r\n $scope.ShowCapacitySingleVisits = infoData.Settings.ShowCapacitySingleVisits;\r\n $scope.BirthdateSingleVisits = infoData.Settings.BirthdateSingleVisits;\r\n $scope.showFullPrice = infoData.Settings.ShowFullPrices;\r\n $scope.stripePublishKey = infoData.StripePublishKey;\r\n $scope.currencyCode = infoData.CurrencyCode;\r\n console.log(infoData);\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n if (infoData.Settings.GeneralConditionsLink != null && infoData.Settings.GeneralConditionsLink != '') {\r\n $scope.terms = infoData.Settings.GeneralConditionsLink;\r\n }\r\n if (infoData.Country.indexOf('enu') > -1 || infoData.Country.indexOf('ius') > -1) {\r\n $scope.usTime = true;\r\n $scope.dateFormat = 'MM.DD.YYYY';\r\n $scope.timeFormat = 'hh:mm a'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'hh:mm a';\r\n $scope.dateTimeFormat = 'MM-DD-YYYY hh:mm a';\r\n }\r\n else {\r\n $scope.usTime = false;\r\n $scope.dateFormat = 'DD.MM.YYYY';\r\n $scope.timeFormat = 'HH:mm'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'HH:mm [h]';\r\n $scope.dateTimeFormat = 'DD.MM.YYYY HH:mm [h]';\r\n }\r\n\r\n $scope.AdditionalInformationLink = infoData.Settings.AdditionalInformationLink;\r\n $scope.FacilityRulesLink = infoData.Settings.FacilityRulesLink;\r\n $scope.onlinePayment = infoData.Settings.OnlinePayment;\r\n $scope.OnlinePaymentSingleVisit = infoData.Settings.OnlinePaymentSingleVisit;\r\n $scope.onlyEarnest = infoData.Settings.OnlyEarnest;\r\n $scope.InvitationLink = formatInvitationLinks(infoData.Settings.InvitationLink);\r\n $scope.Parents = infoData.Settings.Parents;\r\n $scope.BookingOpenAfter = infoData.Settings.BookingOpenAfter;\r\n $scope.PartyBookingOpenAfter = infoData.Settings.PartyBookingOpenAfter;\r\n\r\n $scope.WarningText = infoData.Settings.WarningText;\r\n $scope.WaiverLink = infoData.Settings.WaiverLink;\r\n $scope.WaiverWarningText = infoData.Settings.WaiverWarningText;\r\n $scope.WarningTextPayment = infoData.Settings.WarningTextPayment;\r\n $scope.WarningTextPaymentVisits = infoData.Settings.WarningTextPaymentVisits;\r\n $scope.AdditionalInfoAboutSessions = infoData.Settings.AdditionalInfoAboutSessions;\r\n $scope.LinkAdditionalInfoAboutSessions = infoData.Settings.LinkAdditionalInfoAboutSessions;\r\n $scope.orderInfo.OnlineBookingWhatToWear = '';\r\n\r\n\r\n function orderInfoReset(){\r\n $scope.orderInfo = {};\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.Discount = false;\r\n $scope.orderInfo.People = 0;\r\n $scope.orderInfo.ParentsAttending = 0;\r\n $scope.orderInfo.deposit = false;\r\n $scope.orderInfo.TotalPrice = 0;\r\n $scope.orderInfo.TotalPriceWT = 0;\r\n $scope.orderInfo.TotalPriceDisc = 0;\r\n $scope.orderInfo.TotalPriceDiscWT = 0;\r\n $scope.orderInfo.Comment = '';\r\n $scope.orderInfo.addonsSum = 0;\r\n $scope.orderInfo.addonsSumWT = 0;\r\n $scope.orderInfo.Areas = [];\r\n $scope.orderInfo.Schedules = [];\r\n $scope.orderInfo.GymID = params.GymID;\r\n $scope.orderInfo.NameSpace = params.NameSpace;\r\n $scope.orderInfo.Earnest = infoData.Settings.Earnest;\r\n $scope.orderInfo.OnlineBookingWhatToWear = '';\r\n }\r\n\r\n $scope.checkOrderInfo = function(){\r\n if ( $scope.orderInfo.Schedules.length > 0 || $scope.orderInfo.Areas.length > 0 ){\r\n\r\n }else{\r\n $scope.refreshPage()\r\n }\r\n }\r\n\r\n $scope.loading = true;\r\n $scope.sendOrderFail = false;\r\n\r\n $scope.getTotal = function () {\r\n $scope.orderInfo.TotalPriceWithoutTax = 0;\r\n\r\n for (var i = 0; i < $scope.booked.length; i++) {\r\n if ($scope.booked[i].Discount != undefined && $scope.booked[i].Discount > 0) {\r\n $scope.booked[i].PriceWithoutTax = $scope.booked[i].PriceWithoutTax - ($scope.booked[i].PriceWithoutTax / 100 * $scope.booked[i].Discount);\r\n }\r\n $scope.orderInfo.TotalPriceWithoutTax += $scope.booked[i].people * $scope.booked[i].PriceWithoutTax;\r\n }\r\n $scope.orderInfo.TotalPriceWithoutTax += $scope.orderInfo.addonsSum;\r\n };\r\n\r\n $scope.imageHolder = 'http://localhost:20691/Frontend/onlinebooking/dist/images/events.png';\r\n\r\n $scope.getTotalWithTax = function () {\r\n $scope.orderInfo.TotalPrice = 0;\r\n\r\n for (var i = 0; i < $scope.booked.length; i++) {\r\n if ($scope.booked[i].Discount != undefined && $scope.booked[i].Discount > 0) {\r\n $scope.booked[i].TotalPrice = $scope.booked[i].TotalPrice - ($scope.booked[i].TotalPrice / 100 * $scope.booked[i].Discount);\r\n }\r\n $scope.orderInfo.TotalPrice += $scope.booked[i].people * $scope.booked[i].TotalPrice;\r\n }\r\n $scope.orderInfo.TotalPrice += $scope.orderInfo.addonsSumWT\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPrice\r\n };\r\n\r\n $scope.orderPayed = false;\r\n $scope.backInfo = [];\r\n $scope.sendOrderInfo = function (data, url) {\r\n $scope.sendOrderFail = false;\r\n $scope.orderSent = true;\r\n\r\n var justDate = moment($scope.orderInfo.StartDate).startOf('day');\r\n\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n\r\n if (data.Schedules.length > 0) {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPriceWithoutTax;\r\n } else {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPrice;\r\n }\r\n\r\n if ($scope.orderInfo.DiscountPromoCode > 0) {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPriceWithoutTax - ($scope.orderInfo.TotalPriceWithoutTax / 100 * $scope.orderInfo.DiscountPromoCode);\r\n // $scope.orderInfo.TotalPrice = $scope.orderInfo.TotalPrice - ($scope.orderInfo.TotalPrice / 100 * $scope.orderInfo.DiscountPromoCode);\r\n // $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPriceWT - ($scope.orderInfo.TotalPriceWT / 100 * $scope.orderInfo.DiscountPromoCode);\r\n }\r\n\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(-1, 'hours');\r\n $scope.orderInfo.StartDate = moment(dateTime).format($scope.dateTimeFormat).toString();\r\n\r\n if (data.deposit === false && $scope.onlyEarnest !== true)\r\n data.Earnest = 0;\r\n else\r\n data.Earnest = infoData.Settings.Earnest;\r\n\r\n\r\n if ( !$scope.orderPayed ) {\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: data\r\n }).then(function (d) {\r\n $scope.orderPayed = true;\r\n if (d.data === '' || d.data.toString().indexOf('Error') !== -1) {\r\n $scope.fail = d.data;\r\n // orderInfoReset();\r\n $window.location.href = $scope.params + '#booking-failed/0';\r\n } else if (typeof d.data === 'string' || d.data instanceof String) {\r\n if ($scope.orderInfo.PaymentType == \"4\" || $scope.orderInfo.PaymentType == \"6\") {\r\n $('.payment-status .error-msg').addClass('show').append('

' + d.data + '

');\r\n $scope.orderSent = false;\r\n }\r\n else {\r\n // orderInfoReset();\r\n $window.location.href = d.data;\r\n }\r\n }\r\n else {\r\n $scope.backInfo = d.data;\r\n $scope.backInfo.Schedules = d.data.Schedules;\r\n\r\n if ($scope.backInfo.Schedules && $scope.backInfo.Schedules.length > 0)\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPrice - $scope.backInfo.TotalPriceWithoutTax;\r\n else {\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPriceWithProducts - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n\r\n for (var key in $scope.backInfo.Schedules) {\r\n $scope.backInfo.Schedules[key].DateEnd = moment($scope.backInfo.Schedules[key].DateEnd).format($scope.dateTimeFormat);\r\n $scope.backInfo.Schedules[key].DateStart = moment($scope.backInfo.Schedules[key].Date).format($scope.dateTimeFormat);\r\n }\r\n $scope.backInfo.DateStart = moment(d.data.DateStart).format($scope.dateTimeFormat);\r\n $scope.backInfo.DateEnd = moment(d.data.DateEnd).format($scope.dateTimeFormat);\r\n\r\n\r\n\r\n /*var paypal = {};\r\n paypal.OrderID = $scope.backInfo.OrderID = d.data.OrderID;\r\n if (($scope.backInfo.Schedules.length == 0) && $scope.onlyEarnest == true || $scope.orderInfo.deposit) {\r\n paypal.TotalPrice = infoData.Settings.Earnest;\r\n } else{\r\n paypal.TotalPrice = d.data.TotalPrice;\r\n }\r\n paypal.NameSpace = params.NameSpace;\r\n paypal.GymID = params.GymID;\r\n paypal.TotalPriceWithoutTax = d.data.TotalPriceWithoutTax;*/\r\n\r\n /*if ($scope.orderInfo.PaymentType == 1) {\r\n $scope.sendPaypal(paypal);\r\n } else*/\r\n // orderInfoReset();\r\n if ($scope.backInfo.Schedules.length > 0) {\r\n $window.location.href = $scope.params + '#/booking-completed/';\r\n } else {\r\n $window.location.href = $scope.params + '#/complete-booking/';\r\n }\r\n }\r\n $('.info.blocks-checkout').removeClass('loading');\r\n }, function () {\r\n $scope.sendOrderFail = true;\r\n $scope.orderSent = false;\r\n $scope.loading = false;\r\n // var url = $scope.params + '#/booking-failed/0';\r\n // $window.location.href = url;\r\n });\r\n }\r\n\r\n };\r\n\r\n /*$scope.sendPaypal = function (d) {\r\n $http({\r\n method: 'POST',\r\n url: '/onlinebooking/sendpayment/',\r\n data: d\r\n }).then(function (data) {\r\n $window.location.href = data.data;\r\n }, function () {\r\n\r\n })\r\n }*/\r\n\r\n $scope.params = \"/onlinebooking/index?GymID=\" + $scope.orderInfo.GymID + \"&NameSpace=\" + $scope.orderInfo.NameSpace;\r\n\r\n if ($routeParams.id == 1) {\r\n $scope.fail = \"Your request was canceled successfully\";\r\n } else if ($routeParams.id == 0) {\r\n $scope.fail = 'Something went wrong with your registration.';\r\n }\r\n\r\n $scope.reset = function () {\r\n\r\n if ( $('.complete-booking').length ){\r\n $window.location.href = $scope.params;\r\n }else{\r\n Swal.fire({\r\n title: 'Are you sure you want to continue?',\r\n text: \"Your order info will be lost!\",\r\n // type: 'warning',\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: 'Yes!'\r\n })\r\n .then(function(result) {\r\n if (result.value) {\r\n $window.location.href = $scope.params;\r\n }\r\n })\r\n }\r\n };\r\n\r\n $scope.hasDataRedirect = function () {\r\n if ($scope.loop.hasData == false) {\r\n $window.location.href = $scope.params;\r\n }\r\n };\r\n\r\n $scope.refreshPage = function () {\r\n $window.location.href = $scope.params;\r\n }\r\n}]);\r\n\r\napp.controller('RegisterController', ['$scope', '$http', '$window', '$translate', function ($scope, $http, $window, $translate) {\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n $scope.text = 'me@example.com';\r\n $scope.emailFormat = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n\r\n var currentYear = new Date().getFullYear();\r\n $scope.dateYears = [];\r\n startYear = 1900;\r\n\r\n while (startYear <= currentYear) {\r\n $scope.dateYears.push(startYear++);\r\n }\r\n\r\n function daysInMonth(m, y) { // m is 0 indexed: 0-11\r\n switch (m) {\r\n case 1:\r\n return (y % 4 == 0 && y % 100) || y % 400 == 0 ? 29 : 28;\r\n case 8: case 3: case 5: case 10:\r\n return 30;\r\n default:\r\n return 31\r\n }\r\n }\r\n\r\n\r\n function isValid(d, m, y) {\r\n return m >= 0 && m < 12 && d > 0 && d <= daysInMonth(m, y);\r\n }\r\n\r\n $scope.readyToSendMain = true;\r\n\r\n $scope.sendData = function (t) {\r\n $scope.error = false;\r\n if ($scope.orderInfo.EmergencyName1) {\r\n $scope.orderInfo.EmergencyName = $scope.orderInfo.EmergencyName1 + \" \" + $scope.orderInfo.EmergencyName2;\r\n }\r\n\r\n if ($('#clientBirthdayDay').length) {\r\n if (isValid($scope.clientBirthdayDay, $scope.clientBirthdayMonth - 1, $scope.clientBirthdayYear)) {\r\n $scope.readyToSendMain = true;\r\n $scope.orderInfo.BirthDate = $scope.clientBirthdayMonth + '-' + $scope.clientBirthdayDay + '-' + $scope.clientBirthdayYear;\r\n } else {\r\n $scope.readyToSendMain = false;\r\n }\r\n }\r\n\r\n if ($scope.readyToSendMain == true) {\r\n $http.post('/OnlineBooking/AddClient', $scope.orderInfo)\r\n .then(function successCallback(response) {\r\n if (parseInt(response.data == 0) || response.data == null || response.data < 0) {\r\n $scope.error = true;\r\n $scope.userForm.$invalid = false;\r\n $window.location.reload();\r\n\r\n } else if (response.data > 0) {\r\n\r\n $scope.orderInfo.ClientID = parseInt(response.data);\r\n $scope.error = false;\r\n\r\n if (t == 'visits') {\r\n\r\n if ($scope.reArenged == true) {\r\n $window.location.href = $scope.params + '#/finish/';\r\n } else {\r\n $window.location.href = $scope.params + '#/visits/';\r\n }\r\n } else {\r\n if ($scope.reArenged == true) {\r\n $window.location.href = $scope.params + '#/final/';\r\n } else {\r\n $window.location.href = $scope.params + '#/select-package/';\r\n }\r\n }\r\n\r\n $scope.loop.hasData = true;\r\n }\r\n }, function (d) {\r\n $scope.userForm.$invalid = false;\r\n $scope.error = true;\r\n $window.location.reload();\r\n });\r\n }\r\n };\r\n\r\n}]);\r\n\r\napp.controller('AllVisitController', ['$scope', 'getServicesAndProducts', '$window', '$translate', function ($scope, getServicesAndProducts, $window, $translate) {\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.visits = d.SingleVisitsMain;\r\n $scope.visits = $scope.visits.concat(d.SingleVisitsSub);\r\n\r\n for (var i = 0; i < $scope.visits.length; i++) {\r\n\r\n if ($scope.visits[i].PriceWithoutTax == 0 || $scope.visits[i].PriceWithoutTax == null)\r\n $scope.visits[i].PriceWithoutTax = $scope.visits[i].TotalPrice;\r\n }\r\n\r\n $scope.loading = false;\r\n });\r\n\r\n\r\n $scope.sendPackage = function (id) {\r\n $window.location.href = $scope.params + '#/select-visit-date/' + id;\r\n };\r\n\r\n if ($scope.reArenged != true) {\r\n $scope.hasDataRedirect();\r\n }\r\n\r\n}]);\r\n\r\napp.controller('VisitsController', ['$scope', '$filter', '$routeParams', '$window', '$http', '$timeout', '$q', 'getServicesAndProducts', 'dataShare', 'Backend', '$translate',\r\nfunction ($scope, $filter, $routeParams, $window, $http, $timeout, $q, getServicesAndProducts, dataShare, Backend, $translate) {\r\n\r\n $scope.removeByAttr = function (arr, attr, value) {\r\n var i = arr.length;\r\n while (i--) {\r\n if (arr[i]\r\n && arr[i].hasOwnProperty(attr)\r\n && (arguments.length > 2 && arr[i][attr] === value)) {\r\n arr.splice(i, 1);\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n $scope.orderInfo.id = $routeParams.id;\r\n $scope.orderInfo.Areas = [];\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.PriceWithoutTax = '';\r\n $scope.orderInfo.VisitName = '';\r\n $scope.package = [];\r\n $scope.package.offDays = 'all';\r\n $scope.visits = [];\r\n $scope.ready = false;\r\n $scope.loading = true;\r\n $scope.hoursText = '';\r\n $scope.curHours = [];\r\n $scope.visitHours = [];\r\n $scope.haveAddons = false;\r\n\r\n // if ( $scope.reArenged == true && $scope.orderInfo.Schedules.length > 0) {\r\n // $scope.finalSchedule = $scope.orderInfo.Schedules;\r\n // $scope.lastV = $scope.finalSchedule[$scope.finalSchedule.length - 1];\r\n // $scope.lastId = $scope.lastV.VisitID;\r\n\r\n // $scope.removeByAttr($scope.orderInfo.Schedules, 'VisitID', $scope.lastId);\r\n // $scope.removeByAttr($scope.booked, 'VisitID', $scope.lastId);\r\n // }\r\n\r\n //$scope.BookingOpenAfter = 8;\r\n\r\n $scope.minBookableTime = moment().add($scope.BookingOpenAfter, 'hours');\r\n $scope.minDate = $scope.minBookableTime;\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.visits = d.SingleVisitsMain;\r\n $scope.visits = $scope.visits.concat(d.SingleVisitsSub);\r\n console.log(d);\r\n if (d.SingleVisitsAddons != undefined && d.SingleVisitsAddons.length > 0)\r\n $scope.haveAddons = true;\r\n\r\n for (var i = 0; i < $scope.visits.length; i++) {\r\n\r\n //$scope.visits[i].Description = insertString($scope.visits[i].Description, '

');\r\n\r\n if ($scope.visits[i].VisitDefinitionID == $scope.orderInfo.id)\r\n $scope.visit = $scope.visits[i];\r\n\r\n if ($scope.visits[i].PriceWithoutTax == 0 || $scope.visits[i].PriceWithoutTax == null)\r\n $scope.visits[i].PriceWithoutTax = $scope.visits[i].TotalPrice;\r\n }\r\n\r\n if ($scope.visit.OnlineBookingDaysOfWeek)\r\n $scope.visit.offDays = $scope.visit.OnlineBookingDaysOfWeek.split(',').map(function (offDay) { return parseInt(offDay, 10); });//[1, 3, 4];\r\n else\r\n $scope.visit.offDays = 'all';\r\n\r\n $scope.getTotal();\r\n\r\n $scope.visits.sort(function (a, b) {\r\n return a.OnlineBookingSortingNumber - b.OnlineBookingSortingNumber;\r\n });\r\n\r\n var minHour = $scope.minBookableTime.format(\"HH\") + \":00\";\r\n $scope.hoursText = $scope.visit.OnlineBookingHoursText;\r\n $scope.defHours = getHours($scope.hoursText);\r\n\r\n var todayHoursArray = $scope.hoursText.split(\",\");\r\n var todayPassHours = _.remove(todayHoursArray, function (n) {\r\n return n < minHour;\r\n });\r\n\r\n //if (!todayHoursArray.length) {\r\n // $scope.minDate = moment($scope.minDate).add(1, 'days');\r\n // $scope.hours = $scope.defHours;\r\n //} else {\r\n // $scope.todayHours = getHoursArr(todayHoursArray);\r\n // $scope.hours = $scope.todayHours;\r\n //}\r\n\r\n $scope.vHours = $scope.visit.OnlineBookingHours;\r\n\r\n var today = new Date();\r\n var d = new Date(2011, 11, 11);\r\n\r\n $.each($scope.vHours, function (index, value) {\r\n var self = $(this);\r\n var hours = [];\r\n\r\n $.each(self[0].Hours, function (index, value) {\r\n var innerSelf = $(this);\r\n var newDateObj = moment(d).add(innerSelf[0].Time.TotalMinutes, 'm').format('HH:mm');\r\n\r\n hours.push(newDateObj);\r\n });\r\n\r\n var oned = { day: self[0].DayOfWeek, hours: [hours] }\r\n $scope.visitHours.push(oned);\r\n });\r\n\r\n $scope.todayHours = getHoursArr(todayHoursArray);\r\n\r\n if (moment($scope.date).format('MMM Do YY') == moment($scope.minDate._d).format('MMM Do YY')) {\r\n $scope.hours = $scope.todayHours;\r\n } else {\r\n $scope.hours = $scope.defHours;\r\n }\r\n\r\n $scope.loading = false;\r\n });\r\n\r\n var n = 0;\r\n\r\n var toSchedules = function (bookInfo) {\r\n $scope.orderInfo.Schedules = [];\r\n $scope.bookedInfo = $scope.booked.map(function (bookedItem) {\r\n n++;\r\n\r\n var sessionID = bookedItem.VisitID + bookedItem.VisitName + n;\r\n\r\n return {\r\n VisitID: bookedItem.VisitID,\r\n VisitName: bookedItem.VisitName,\r\n PeopleAttending: bookedItem.people,\r\n Date: moment(bookedItem.Date).toISOString(),\r\n Price: bookedItem.TotalPrice,\r\n PriceWithoutTax: bookedItem.PriceWithoutTax,\r\n Duration: bookedItem.Duration,\r\n DateLocal: bookedItem.DateLocal,\r\n TaxIDs: bookedItem.TaxIDs,\r\n SessionID: sessionID,\r\n UniqueID: bookedItem.VisitID + bookedItem.DateLocal\r\n };\r\n });\r\n\r\n\r\n $scope.orderInfo.Schedules = $scope.bookedInfo;\r\n };\r\n\r\n $scope.getTotal = function () {\r\n $scope.orderInfo.TotalPrice = $scope.orderInfo.People * $scope.visit.PriceWithoutTax;\r\n $scope.orderInfo.TotalPriceDisc = $scope.orderInfo.TotalPrice;\r\n\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.People * $scope.visit.TotalPrice;\r\n $scope.orderInfo.TotalPriceDiscWT = $scope.orderInfo.TotalPriceWT;\r\n\r\n if ($scope.visit.OnlineBookingMinPeopleForDiscount > 0) {\r\n if ($scope.orderInfo.People >= $scope.visit.OnlineBookingMinPeopleForDiscount) {\r\n\r\n $scope.orderInfo.TotalPrice = $scope.orderInfo.TotalPrice - ($scope.orderInfo.TotalPrice * ($scope.visit.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPriceWT - ($scope.orderInfo.TotalPriceWT * ($scope.visit.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.Discount = true;\r\n\r\n $scope.orderInfo.PriceWithTax = $scope.visit.PriceWithoutTax - ($scope.visit.PriceWithoutTax * ($scope.visit.OnlineBookingDiscount / 100));\r\n } else {\r\n $scope.orderInfo.Discount = false;\r\n $scope.orderInfo.PriceWithTax = $scope.visit.PriceWithoutTax;\r\n }\r\n }\r\n else {\r\n $scope.orderInfo.Discount = false;\r\n $scope.orderInfo.TotalPrice = $scope.orderInfo.TotalPrice;\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPriceWT;\r\n }\r\n\r\n $scope.selected = 0;\r\n\r\n var date = $scope.date;\r\n if ($scope.orderInfo.People > 0) {\r\n $scope.ready = false;\r\n $scope.checkConflict(date);\r\n }\r\n\r\n $('.hours .hour.selected').removeClass('selected');\r\n $scope.selectedIndex = 99;\r\n };\r\n\r\n //setup before functions\r\n var typingTimer; //timer identifier\r\n var doneTypingInterval = 1500; //time in ms, 5 second for example\r\n var $input = $('.people-change-input');\r\n\r\n //on keyup, start the countdown\r\n $input.on('keyup', function () {\r\n clearTimeout(typingTimer);\r\n typingTimer = setTimeout(doneTyping, doneTypingInterval);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $input.on('keydown', function () {\r\n clearTimeout(typingTimer);\r\n });\r\n\r\n //user is \"finished typing,\" do something\r\n function doneTyping() {\r\n $scope.getTotal();\r\n }\r\n\r\n $scope.$watch('date', function (date) {\r\n\r\n var numberDay = moment(date).format('e');\r\n var ree = $.grep($scope.visitHours, function (e) { return e.day == numberDay; });\r\n if (ree != undefined && ree.length > 0) {\r\n var hours = ree[0].hours[0];\r\n $scope.realHours = [];\r\n for (i = 0; i < ree[0].hours[0].length; i++) {\r\n\r\n var justDate = moment(date).startOf('day');\r\n var justTime = moment(ree[0].hours[0][i], $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n if (moment(dateTime).isAfter($scope.minBookableTime)) {\r\n $scope.realHours.push(ree[0].hours[0][i]);\r\n }\r\n }\r\n if ($scope.todayHours == undefined && $scope.defHours == undefined) {\r\n return;\r\n }\r\n\r\n $scope.ready = false;\r\n $scope.checkConflict(date);\r\n }\r\n\r\n $('.hours .hour.selected').removeClass('selected');\r\n $scope.selectedIndex = 99;\r\n });\r\n\r\n $scope.checkConflict = function (b) {\r\n $scope.noHours = false;\r\n\r\n $scope.ccData = {};\r\n $scope.loading = true;\r\n\r\n $scope.ccData.VisitId = $scope.orderInfo.id;\r\n $scope.ccData.StartDate = b;\r\n if ($scope.orderInfo.People < 1)\r\n $scope.ccData.People = 1;\r\n else\r\n $scope.ccData.People = $scope.orderInfo.People;\r\n $scope.ccData.NameSpace = $scope.orderInfo.NameSpace;\r\n $scope.ccData.GymID = $scope.orderInfo.GymID;\r\n $scope.ccData.IsBirthday = false;\r\n $scope.orderInfo.Date = b;\r\n\r\n if ($scope.realHours) {\r\n $scope.ccData.StartDate = $scope.realHours.map(function (h) {\r\n var justDate = moment($scope.date).startOf('day');\r\n var justTime = moment(h, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(1, 'hours');\r\n\r\n return dateTime.toISOString();\r\n });\r\n\r\n Backend.checkConflictAsync($scope.ccData).then(function success(results) {\r\n $scope.curHours = _.map(results.data, function (hourData) {\r\n return {\r\n isConflict: hourData.MaxPeople > 0,\r\n areas: hourData.Areas,\r\n value: moment(hourData.StartDate).format($scope.timeFormat),\r\n slotsleft: hourData.SlotsLeft\r\n };\r\n });\r\n\r\n if ($scope.curHours.length == 0) {\r\n $scope.noHours = true;\r\n }\r\n\r\n var hoursResult = $.grep($scope.curHours, function (e) { return e.isConflict == false; });\r\n if (hoursResult.length == 1) {\r\n var emptyValue = hoursResult[0].value;\r\n var emptyIndex = $('.hours .hour:contains(\"' + emptyValue + '\")').parent('div').index() - 1;\r\n\r\n if (emptyIndex >= 0) {\r\n $scope.selectedIndex = emptyIndex;\r\n $scope.compare($scope.selectedIndex);\r\n }\r\n }\r\n\r\n $scope.loading = false;\r\n });\r\n\r\n $scope.compare();\r\n }\r\n };\r\n\r\n\r\n $scope.bookVisit = function (item) {\r\n var dateLocal = moment(new Date(item.Date)).format($scope.dateTimeFormat);\r\n //if ($scope.booked.length == 1)\r\n // $scope.booked = [];\r\n $scope.bookedItem = { VisitID: item.id, VisitName: $scope.visit.VisitName, UniqueID: item.id + dateLocal, people: item.People, Date: item.Date, Price: $scope.visit.PriceCurrent, TotalPrice: $scope.visit.PriceCurrent, PriceWithoutTax: $scope.visit.PriceWithoutTax, Duration: $scope.visit.Duration, DateLocal: dateLocal, TaxIDs: $scope.visit.TaxIDs, Tax: $scope.visit.TaxPercent, OnlineBookingPictureLink: $scope.visit.OnlineBookingPictureLink, Description: $scope.visit.Description }\r\n\r\n var result = $.grep($scope.booked, function (e) { return e.UniqueID == $scope.bookedItem.UniqueID; });\r\n if (result.length > 0) {\r\n\r\n } else {\r\n $scope.booked.push($scope.bookedItem);\r\n }\r\n }\r\n\r\n $scope.compare = function ($index) {\r\n\r\n if ($index == undefined)\r\n return;\r\n $scope.selectedIndex = $index;\r\n\r\n var SelectedItem = $scope.curHours[$index];\r\n if (SelectedItem != undefined) {\r\n if (SelectedItem.isConflict == true) {\r\n $scope.ready = false;\r\n } else {\r\n $scope.orderInfo.Time = $scope.realHours[$index];\r\n $scope.hours = $scope.realHours;\r\n $scope.orderInfo.Areas = $scope.curHours[$index].areas;\r\n\r\n var maxPeople = $scope.orderInfo.Areas[0].MaxPeople;\r\n\r\n if ($scope.orderInfo.People > 0 && $scope.orderInfo.Time != '' && $scope.orderInfo.People <= maxPeople) {\r\n $scope.ready = true;\r\n }\r\n else {\r\n $scope.ready = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n $scope.setDate = function (date) {\r\n var justDate = moment($scope.date).startOf('day');\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var hour = justTime.hours();\r\n var minutes = justTime.minutes();\r\n var dateTime = moment(date);\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(hour + 1, 'hours').add(minutes, 'minutes');\r\n else\r\n dateTime = dateTime.add(hour, 'hours').add(minutes, 'minutes');\r\n $scope.orderInfo.Date = moment(dateTime);\r\n $scope.orderInfo.StartDate = moment(dateTime);\r\n\r\n\r\n // if( $scope.orderInfo.id )\r\n $scope.bookVisit($scope.orderInfo);\r\n toSchedules();\r\n }\r\n\r\n if ($scope.reArenged != true) {\r\n $scope.hasDataRedirect();\r\n }\r\n\r\n}]);\r\n\r\napp.controller('PackagesController', ['$scope', 'getServicesAndProducts', '$window', '$translate', function ($scope, getServicesAndProducts, $window, $translate) {\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.loading = false;\r\n $scope.packages = d.MainServices;\r\n console.log(d);\r\n\r\n\r\n for (var i = 0; i < $scope.packages.length; i++) {\r\n if ($scope.packages[i].Description != null) {\r\n $scope.packages[i].Description = insertString($scope.packages[i].Description, '

');\r\n }\r\n if ($scope.packages[i].OnlineBookingMinPeopleForDiscount != 0)\r\n $scope.packages[i].OnlineBookingMinPeopleForDiscount++;\r\n\r\n if ($scope.packages[i].PriceWithoutTax == 0 || $scope.packages[i].PriceWithoutTax == null)\r\n $scope.packages[i].PriceWithoutTax = $scope.packages[i].TotalPrice;\r\n }\r\n\r\n $scope.packages.sort(function (a, b) {\r\n return a.OnlineBookingSortingNumber - b.OnlineBookingSortingNumber;\r\n });\r\n });\r\n\r\n $scope.sendPackage = function (id) {\r\n $window.location.href = $scope.params + '#/select-date/' + id;\r\n };\r\n\r\n if ($scope.reArenged != true) {\r\n $scope.hasDataRedirect();\r\n }\r\n\r\n}]);\r\n\r\napp.controller('CalendarController', ['$scope', '$filter', '$routeParams', '$http', '$timeout', '$q', 'getServicesAndProducts', 'dataShare', 'Backend', '$translate',\r\nfunction ($scope, $filter, $routeParams, $http, $timeout, $q, getServicesAndProducts, dataShare, Backend, $translate) {\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n $scope.orderInfo.id = $routeParams.id;\r\n $scope.ready = false;\r\n $scope.loading = true;\r\n $scope.limitReached = 0;\r\n $scope.hoursText = '';\r\n if ($scope.PartyBookingOpenAfter > 0)\r\n $scope.minDate = moment().add($scope.PartyBookingOpenAfter, 'hours');\r\n else\r\n $scope.minDate = moment();\r\n $scope.curHours = [];\r\n $scope.visitHours = [];\r\n $scope.orderInfo.Areas = [];\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.packages = d.MainServices;\r\n\r\n for (var i = 0; i < $scope.packages.length; i++) {\r\n if ($scope.packages[i].Description != null) {\r\n $scope.packages[i].Description = insertString($scope.packages[i].Description, '

');\r\n }\r\n\r\n if ($scope.packages[i].OnlineBookingMinPeopleForDiscount != 0)\r\n $scope.packages[i].OnlineBookingMinPeopleForDiscount++;\r\n\r\n if ($scope.packages[i].VisitDefinitionID == $scope.orderInfo.id)\r\n $scope.package = $scope.packages[i];\r\n\r\n if ($scope.packages[i].PriceWithoutTax == 0 || $scope.packages[i].PriceWithoutTax == null)\r\n $scope.packages[i].PriceWithoutTax = $scope.packages[i].TotalPrice;\r\n }\r\n if ($scope.package.OnlineBookingDaysOfWeek)\r\n $scope.package.offDays = $scope.package.OnlineBookingDaysOfWeek.split(',').map(function (offDay) { return parseInt(offDay, 10); });//[1, 3, 4];\r\n else\r\n $scope.package.offDays = 'all';\r\n\r\n $scope.vHours = $scope.package.OnlineBookingHours;\r\n\r\n var today = new Date();\r\n var d = new Date(2011, 11, 11);\r\n\r\n $.each($scope.vHours, function (index, value) {\r\n var self = $(this);\r\n var hours = [];\r\n\r\n $.each(self[0].Hours, function (index, value) {\r\n var innerSelf = $(this);\r\n var newDateObj = moment(d).add(innerSelf[0].Time.TotalMinutes, 'm').format('HH:mm');\r\n\r\n hours.push(newDateObj);\r\n });\r\n\r\n var oned = { day: self[0].DayOfWeek, hours: [hours] }\r\n $scope.visitHours.push(oned);\r\n });\r\n\r\n $scope.getTotal();\r\n\r\n $scope.orderInfo.OnlineBookingMinPeopleForEvent = $scope.package.OnlineBookingMinPeopleForEvent;\r\n $scope.hoursText = $scope.package.OnlineBookingHoursText;\r\n $scope.hours = getHours($scope.hoursText);\r\n $scope.loading = false;\r\n\r\n $scope.orderInfo.OnlineBookingWhatToWear = $scope.package.OnlineBookingWhatToWear;\r\n });\r\n\r\n $scope.getTotal = function () {\r\n if ($scope.package.MinimalPackagePriceByPeople > 0) {\r\n $scope.orderInfo.TotalPrice = $scope.package.MinimalPackagePriceByPeopleWithoutTax;\r\n $scope.orderInfo.TotalPriceDisc = $scope.orderInfo.TotalPrice;\r\n\r\n $scope.orderInfo.TotalPriceWT = $scope.package.MinimalPackagePriceByPeople;\r\n $scope.orderInfo.TotalPriceDiscWT = $scope.orderInfo.TotalPriceWT;\r\n if ($scope.orderInfo.People > $scope.package.MinimalPackagePeople) {\r\n $scope.orderInfo.TotalPrice += ($scope.orderInfo.People - $scope.package.MinimalPackagePeople) * $scope.package.PriceWithoutTax;\r\n $scope.orderInfo.TotalPriceDisc += ($scope.orderInfo.People - $scope.package.MinimalPackagePeople) * $scope.package.PriceWithoutTax;\r\n\r\n $scope.orderInfo.TotalPriceWT += ($scope.orderInfo.People - $scope.package.MinimalPackagePeople) * $scope.package.TotalPrice;\r\n $scope.orderInfo.TotalPriceDiscWT = $scope.orderInfo.TotalPriceWT;\r\n }\r\n }\r\n else {\r\n $scope.orderInfo.TotalPrice = $scope.orderInfo.People * $scope.package.PriceWithoutTax;\r\n $scope.orderInfo.TotalPriceDisc = $scope.orderInfo.TotalPrice;\r\n\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.People * $scope.package.TotalPrice;\r\n $scope.orderInfo.TotalPriceDiscWT = $scope.orderInfo.TotalPriceWT;\r\n }\r\n if ($scope.package.OnlineBookingMinPeopleForDiscount > 0) {\r\n if ($scope.orderInfo.People >= $scope.package.OnlineBookingMinPeopleForDiscount) {\r\n if ($scope.package.MinimalPackagePriceByPeople > 0) {\r\n if ($scope.package.OnlineBookingMinPeopleForDiscount <= $scope.orderInfo.People) {\r\n var peopleToDiscount = $scope.orderInfo.People - $scope.package.OnlineBookingMinPeopleForDiscount + 1;\r\n $scope.orderInfo.TotalPrice = $scope.orderInfo.TotalPrice - ($scope.package.PriceWithoutTax * peopleToDiscount * ($scope.package.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPrice - ($scope.package.PriceWithoutTax * peopleToDiscount * ($scope.package.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.Discount = true;\r\n }\r\n }\r\n else {\r\n $scope.orderInfo.TotalPrice = $scope.orderInfo.TotalPrice - ($scope.orderInfo.TotalPrice * ($scope.package.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPriceWT - ($scope.orderInfo.TotalPriceWT * ($scope.package.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.Discount = true;\r\n }\r\n } else {\r\n $scope.orderInfo.Discount = false;\r\n }\r\n }\r\n $scope.parentsAllowed = parseInt($scope.orderInfo.People);\r\n $scope.selected = 0;\r\n\r\n $('.hours .hour.selected').removeClass('selected');\r\n $scope.selectedIndex = 99;\r\n $scope.checkDateConflict();\r\n $scope.Compare();\r\n };\r\n\r\n //setup before functions\r\n var typingTimer; //timer identifier\r\n var doneTypingInterval = 1500; //time in ms, 5 second for example\r\n var $input = $('.people-change-input');\r\n\r\n //on keyup, start the countdown\r\n $input.on('keyup', function () {\r\n clearTimeout(typingTimer);\r\n typingTimer = setTimeout(doneTyping, doneTypingInterval);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $input.on('keydown', function () {\r\n $scope.ready = false;\r\n clearTimeout(typingTimer);\r\n });\r\n\r\n //user is \"finished typing,\" do something\r\n function doneTyping() {\r\n $scope.getTotal();\r\n }\r\n\r\n $scope.$watch('date', function (date) {\r\n //if ($scope.orderInfo.People > 0)\r\n var numberDay = moment(date).format('e');\r\n if ($scope.visitHours != undefined)\r\n var ree = $.grep($scope.visitHours, function (e) { return e.day == numberDay; });\r\n if (ree != undefined && ree.length > 0)\r\n var hours = ree[0].hours[0];\r\n\r\n var finalHours = [];\r\n if (hours != undefined)\r\n for (var i = 0; i < hours.length; i++) {\r\n var justDate = moment(date).startOf('day');\r\n var justTime = moment(hours[i], $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n if (dateTime >= $scope.minDate)\r\n finalHours.push(hours[i]);\r\n }\r\n $scope.realHours = finalHours;\r\n $scope.checkDateConflict();\r\n });\r\n\r\n $scope.checkDateConflict = function () {\r\n var dateTime = moment($scope.date).startOf('day');\r\n $scope.loading = true;\r\n $scope.noHours = false;\r\n\r\n $scope.checkConflictData = {};\r\n $scope.checkConflictData.NameSpace = $scope.orderInfo.NameSpace;\r\n $scope.checkConflictData.GymID = $scope.orderInfo.GymID\r\n $scope.checkConflictData.ParentsAttending = parseInt($scope.orderInfo.ParentsAttending, 10)\r\n $scope.checkConflictData.People = parseInt($scope.orderInfo.People, 10);\r\n $scope.checkConflictData.VisitId = parseInt($scope.orderInfo.id);\r\n $scope.orderInfo.StartDate = dateTime;\r\n $scope.checkConflictData.IsBirthday = true;\r\n $scope.checkConflictData.StartDate = {};\r\n\r\n if ($scope.realHours) {\r\n\r\n $scope.checkConflictData.StartDate = $scope.realHours.map(function (h) {\r\n var justDate = moment($scope.date).startOf('day');\r\n var justTime = moment(h, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(1, 'hours');\r\n\r\n return dateTime.toISOString();\r\n });\r\n\r\n Backend.checkConflictAsync($scope.checkConflictData).then(function success(results) {\r\n $scope.curHours = _.map(results.data, function (hourData) {\r\n return {\r\n isConflict: hourData.MaxPeople > 0,\r\n areas: hourData.Areas,\r\n value: moment(hourData.StartDate).format($scope.timeFormat),\r\n };\r\n });\r\n\r\n if ($scope.curHours.length == 0) {\r\n $scope.noHours = true;\r\n }\r\n\r\n $scope.loading = false;\r\n\r\n var hoursResult = $.grep($scope.curHours, function (e) { return e.isConflict == false; });\r\n if (hoursResult.length == 1) {\r\n var emptyValue = hoursResult[0].value;\r\n var emptyIndex = $('.hours .hour:contains(\"' + emptyValue + '\")').parent('div').index() - 1;\r\n\r\n if (emptyIndex >= 0) {\r\n $scope.selectedIndex = emptyIndex;\r\n $scope.isSelected($scope.selectedIndex);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.parentAlert = false;\r\n $scope.parentsAllowed = parseInt($scope.orderInfo.People);\r\n $scope.Compare = function () {\r\n if (infoData.Settings.Parents) {\r\n $scope.orderInfo.ParentsAttending = parseInt($scope.orderInfo.ParentsAttending, 10);\r\n $scope.orderInfo.People = parseInt($scope.orderInfo.People, 10);\r\n\r\n if ($scope.orderInfo.ParentsAttending > 0 && $scope.orderInfo.People > 0 && $scope.orderInfo.ParentsAttending > $scope.orderInfo.People) {\r\n $scope.parentAlert = false;\r\n\r\n } else {\r\n $scope.parentAlert = true;\r\n }\r\n\r\n if ($scope.orderInfo.People > 0 && $scope.orderInfo.People >= $scope.orderInfo.OnlineBookingMinPeopleForEvent && $scope.orderInfo.Time !== '' && $scope.orderInfo.ParentsAttending > 0 && $scope.parentAlert === true && $scope.selectedIndex !== -1 && $scope.loading != true)\r\n $scope.ready = true;\r\n else\r\n $scope.ready = false;\r\n } else {\r\n $scope.orderInfo.People = parseInt($scope.orderInfo.People, 10);\r\n\r\n if ($scope.orderInfo.People > 0 && $scope.orderInfo.People >= $scope.orderInfo.OnlineBookingMinPeopleForEvent && $scope.orderInfo.Time !== '' && $scope.selectedIndex !== -1 && $scope.loading != true)\r\n $scope.ready = true;\r\n else\r\n $scope.ready = false;\r\n\r\n }\r\n };\r\n\r\n $scope.Compare();\r\n\r\n $scope.count = 0;\r\n\r\n $scope.selectedIndex = -1;\r\n $scope.isSelected = function ($index) {\r\n $scope.orderInfo.Time = $scope.curHours[$index].value\r\n $scope.selectedIndex = $index;\r\n $scope.orderInfo.Areas = $scope.curHours[$index].areas;\r\n $scope.orderInfo.VisitID = $scope.orderInfo.id;\r\n $scope.Compare();\r\n };\r\n\r\n $scope.$watch('date', function () {\r\n $scope.selectedIndex = -1;\r\n $scope.ready = false;\r\n });\r\n\r\n $scope.setDate = function (date) {\r\n var justDate = moment($scope.date).startOf('day');\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var hour = justTime.hours();\r\n var minutes = justTime.minutes();\r\n var dateTime = moment(date);\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(hour + 1, 'hours').add(minutes, 'minutes');\r\n else\r\n dateTime = dateTime.add(hour, 'hours').add(minutes, 'minutes');\r\n $scope.orderInfo.StartDate = moment(dateTime);\r\n }\r\n\r\n dataShare.addInfo($scope.orderInfo);\r\n\r\n if ($scope.reArenged != true) {\r\n $scope.hasDataRedirect();\r\n }\r\n\r\n}]);\r\n\r\napp.controller('AddonsController', ['$scope', 'getServicesAndProducts', '$window', '$routeParams', 'dataShare', '$translate', function ($scope, getServicesAndProducts, $window, $routeParams, dataShare, $translate) {\r\n $scope.checkOrderInfo();\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n var data = dataShare.getData();\r\n\r\n $scope.orderInfo = data.orderInfo;\r\n $scope.id = $routeParams.id;\r\n $scope.full = false;\r\n $scope.Price = $scope.orderInfo.TotalPrice;\r\n\r\n $scope.Date = moment($scope.orderInfo.StartDate).format($scope.dateFormat);\r\n $scope.partyDate = moment($scope.orderInfo.StartDate).format($scope.dateFormat);\r\n $scope.Time = $scope.orderInfo.Time;\r\n\r\n $scope.prods = data.products\r\n $scope.adds = data.addons;\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.packages = d.MainServices;\r\n $scope.items = d.SubServices;\r\n $scope.products = d.OnlineProducts;\r\n\r\n for (var i = 0; i < $scope.packages.length; i++) {\r\n if ($scope.packages[i].Description != null) {\r\n $scope.packages[i].Description = insertString($scope.packages[i].Description, '

');\r\n }\r\n\r\n if ($scope.packages[i].OnlineBookingMinPeopleForDiscount != 0)\r\n $scope.packages[i].OnlineBookingMinPeopleForDiscount++;\r\n\r\n if ($scope.packages[i].VisitDefinitionID == $scope.id)\r\n $scope.package = $scope.packages[i];\r\n\r\n if ($scope.packages[i].PriceWithoutTax == 0 || $scope.packages[i].PriceWithoutTax == null)\r\n $scope.packages[i].PriceWithoutTax = $scope.packages[i].TotalPrice;\r\n }\r\n\r\n for (var i = 0; i < $scope.items.length; i++) {\r\n $scope.items[i].Amount = 0;\r\n for (var j = 0; j < $scope.adds.length; j++) {\r\n if ($scope.items[i].VisitDefinitionID == $scope.adds[j].VisitDefinitionID && $scope.adds[j].added == true)\r\n $scope.items[i].added = true;\r\n }\r\n\r\n if ($scope.items[i].PriceWithoutTax == 0 || $scope.items[i].PriceWithoutTax == null)\r\n $scope.items[i].PriceWithoutTax = $scope.items[i].TotalPrice;\r\n }\r\n\r\n for (var i = 0; i < $scope.products.length; i++) {\r\n $scope.products[i].Amount = 0;\r\n for (var j = 0; j < $scope.prods.length; j++) {\r\n if ($scope.products[i].ProductID == $scope.prods[j].ProductID && $scope.prods[j].added == true)\r\n $scope.products[i].added = true;\r\n }\r\n\r\n\r\n if ($scope.products[i].PriceWithoutTax == 0 || $scope.products[i].PriceWithoutTax == null)\r\n $scope.products[i].PriceWithoutTax = $scope.products[i].TotalPrice\r\n }\r\n });\r\n\r\n $scope.saveAdd = function (i) {\r\n $scope.i = i;\r\n\r\n if ($scope.i.Amount > 0) {\r\n $scope.i.Total = $scope.i.Amount * $scope.i.PriceWithoutTax;\r\n $scope.i.TotalWT = $scope.i.Amount * $scope.i.TotalPrice;\r\n\r\n\r\n $scope.i.msg = false;\r\n $scope.i.added = true;\r\n\r\n dataShare.addAddon(i);\r\n updateAddonsSum();\r\n } else {\r\n $scope.i.msg = true;\r\n $scope.i.added = false;\r\n }\r\n }\r\n\r\n $scope.saveProduct = function (i) {\r\n $scope.i = i;\r\n $scope.i.PriceWithoutTax = $scope.i.PriceWithoutTax;\r\n $scope.i.VisitName = $scope.i.ProductName;\r\n $scope.i.VisitDefinitionID = $scope.i.ProductID;\r\n\r\n if ($scope.i.Amount > 0) {\r\n if ($scope.i.PriceWithoutTax > 0) {\r\n $scope.i.Total = $scope.i.Amount * $scope.i.PriceWithoutTax;\r\n }\r\n else\r\n $scope.i.Total = 0;\r\n\r\n if ($scope.i.PriceSell > 0) {\r\n $scope.i.TotalWT = $scope.i.Amount * $scope.i.PriceSell;\r\n }\r\n else\r\n $scope.i.TotalWT = 0;\r\n\r\n $scope.i.msg = false;\r\n $scope.i.added = true;\r\n\r\n dataShare.addProduct(i);\r\n updateAddonsSum();\r\n } else {\r\n $scope.i.msg = true;\r\n $scope.i.added = false;\r\n }\r\n }\r\n\r\n $scope.deleteAdd = function (k) {\r\n var key;\r\n for (key in $scope.adds) {\r\n if ($scope.adds[key].VisitDefinitionID == k)\r\n $scope.adds.splice(key, 1);\r\n }\r\n for (key in $scope.items) {\r\n if ($scope.items[key].VisitDefinitionID == k)\r\n $scope.items[key].added = false;\r\n\r\n }\r\n\r\n for (key in $scope.prods) {\r\n if ($scope.prods[key].VisitDefinitionID == k)\r\n $scope.prods.splice(key, 1);\r\n }\r\n\r\n for (key in $scope.products) {\r\n if ($scope.products[key].ProductID == k)\r\n $scope.products[key].added = false;\r\n }\r\n\r\n updateAddonsSum();\r\n };\r\n\r\n var updateAddonsSum = function () {\r\n $scope.addonsSum = 0;\r\n $scope.addonsSumWT = 0;\r\n $scope.Price = 0;\r\n var i;\r\n var hasItems = false;\r\n for (i = 0; i < $scope.adds.length; i++) {\r\n if ($scope.adds[i].PriceWithoutTax > 0)\r\n $scope.addonsSum += $scope.adds[i].PriceWithoutTax * $scope.adds[i].Amount;\r\n if ($scope.adds[i].TotalPrice > 0)\r\n $scope.addonsSumWT += $scope.adds[i].TotalPrice * $scope.adds[i].Amount;\r\n hasItems = true;\r\n }\r\n\r\n for (i = 0; i < $scope.prods.length; i++) {\r\n if ($scope.prods[i].PriceWithoutTax > 0)\r\n $scope.addonsSum += $scope.prods[i].PriceWithoutTax * $scope.prods[i].Amount;\r\n if ($scope.prods[i].PriceSell > 0)\r\n $scope.addonsSumWT += $scope.prods[i].PriceSell * $scope.prods[i].Amount;\r\n hasItems = true;\r\n }\r\n\r\n if ($scope.addonsSum > 0 || hasItems == true) {\r\n $scope.full = true;\r\n } else {\r\n $scope.full = false;\r\n }\r\n\r\n $scope.Price = $scope.orderInfo.TotalPrice + $scope.addonsSum;\r\n\r\n $scope.orderInfo.addonsSum = $scope.addonsSum;\r\n $scope.orderInfo.addonsSumWT = $scope.addonsSumWT;\r\n };\r\n updateAddonsSum();\r\n\r\n if ($scope.reArenged != true) {\r\n $scope.hasDataRedirect();\r\n }\r\n\r\n}]);\r\n\r\napp.controller('AddonsControllerVisits', ['$scope', 'getServicesAndProducts', '$window', '$routeParams', 'dataShare', '$translate', function ($scope, getServicesAndProducts, $window, $routeParams, dataShare, $translate) {\r\n\r\n $scope.checkOrderInfo();\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n $scope.id = $routeParams.id;\r\n $scope.full = false;\r\n $scope.Price = $scope.orderInfo.TotalPrice;\r\n\r\n $scope.visit = $scope.booked[0];\r\n $scope.Date = moment($scope.booked[0].Date).format($scope.dateFormat);\r\n $scope.partyDate = moment($scope.booked[0].Date).format($scope.dateFormat);\r\n var data = dataShare.getData();\r\n $scope.adds = data.addons;\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.items = d.SingleVisitsAddons;\r\n\r\n for (var i = 0; i < $scope.items.length; i++) {\r\n $scope.items[i].Amount = 0;\r\n for (var j = 0; j < $scope.adds.length; j++) {\r\n if ($scope.items[i].VisitDefinitionID == $scope.adds[j].VisitDefinitionID && $scope.adds[j].added == true)\r\n $scope.items[i].added = true;\r\n }\r\n\r\n if ($scope.items[i].PriceWithoutTax == 0 || $scope.items[i].PriceWithoutTax == null)\r\n $scope.items[i].PriceWithoutTax = $scope.items[i].TotalPrice;\r\n }\r\n });\r\n\r\n $scope.saveAdd = function (i) {\r\n $scope.i = i;\r\n\r\n if ($scope.i.Amount > 0) {\r\n $scope.i.Total = $scope.i.Amount * $scope.i.PriceWithoutTax;\r\n $scope.i.TotalWT = $scope.i.Amount * $scope.i.TotalPrice;\r\n\r\n $scope.i.msg = false;\r\n $scope.i.added = true;\r\n\r\n dataShare.addAddon(i);\r\n updateAddonsSum();\r\n } else {\r\n $scope.i.msg = true;\r\n $scope.i.added = false;\r\n }\r\n }\r\n\r\n $scope.deleteAdd = function (k) {\r\n var key;\r\n for (key in $scope.adds) {\r\n if ($scope.adds[key].VisitDefinitionID == k)\r\n $scope.adds.splice(key, 1);\r\n }\r\n for (key in $scope.items) {\r\n if ($scope.items[key].VisitDefinitionID == k)\r\n $scope.items[key].added = false;\r\n\r\n }\r\n\r\n for (key in $scope.prods) {\r\n if ($scope.prods[key].VisitDefinitionID == k)\r\n $scope.prods.splice(key, 1);\r\n }\r\n\r\n for (key in $scope.products) {\r\n if ($scope.products[key].ProductID == k)\r\n $scope.products[key].added = false;\r\n }\r\n\r\n updateAddonsSum();\r\n };\r\n\r\n var updateAddonsSum = function () {\r\n $scope.addonsSum = 0;\r\n $scope.addonsSumWT = 0;\r\n $scope.Price = 0;\r\n var i;\r\n for (i = 0; i < $scope.adds.length; i++) {\r\n $scope.addonsSum += $scope.adds[i].PriceWithoutTax * $scope.adds[i].Amount;\r\n $scope.addonsSumWT += $scope.adds[i].TotalPrice * $scope.adds[i].Amount;\r\n }\r\n\r\n if ($scope.addonsSum > 0) {\r\n $scope.full = true;\r\n } else {\r\n $scope.full = false;\r\n }\r\n\r\n $scope.Price = $scope.orderInfo.TotalPrice + $scope.addonsSum;\r\n\r\n $scope.orderInfo.addonsSum = $scope.addonsSum;\r\n $scope.orderInfo.addonsSumWT = $scope.addonsSumWT;\r\n };\r\n updateAddonsSum();\r\n\r\n if ($scope.reArenged != true) {\r\n $scope.hasDataRedirect();\r\n }\r\n}]);\r\n\r\n///Used for Party Reservation\r\napp.controller('FinalController', ['$scope', 'dataShare', '$translate', '$http', function ($scope, dataShare, $translate, $http) {\r\n if ( window.location.href.indexOf('final') > 1 ){\r\n $scope.checkOrderInfo();\r\n }\r\n window.scrollTo(0, 0);\r\n var startYear = new Date().getFullYear().toString().substr(-2);\r\n var currentYear = new Number(startYear);\r\n var url = '/onlinebooking/SaveBirthDay/';\r\n\r\n currentYear += 20;\r\n $scope.years = [];\r\n\r\n while (startYear <= currentYear) {\r\n $scope.years.push(startYear++);\r\n }\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n var data = dataShare.getData();\r\n $scope.final = [];\r\n $scope.paymentPageText = infoData.Settings.PaymentPageText;\r\n\r\n $scope.final.Price = $scope.orderInfo.TotalPrice + $scope.orderInfo.addonsSum;\r\n $scope.final.PriceWT = $scope.orderInfo.TotalPriceWT + $scope.orderInfo.addonsSumWT;\r\n $scope.final.PriceDisc = $scope.orderInfo.TotalPriceDisc + $scope.orderInfo.addonsSum;\r\n $scope.final.PriceDiscWT = $scope.orderInfo.TotalPriceDiscWT + $scope.orderInfo.addonsSumWT;\r\n\r\n $scope.final.Tax = $scope.final.PriceWT - $scope.final.Price;\r\n $scope.final.TaxDisc = $scope.final.PriceDiscWT - $scope.final.PriceDisc;\r\n\r\n var justDate = moment($scope.orderInfo.StartDate).startOf('day');\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n\r\n\r\n $scope.partyDate = moment(dateTime).format($scope.dateTimeFormat);\r\n\r\n $scope.orderInfo.ChildName = $scope.orderInfo.FirstName + \" \" + $scope.orderInfo.LastName;\r\n $scope.orderInfo.ParentName = $scope.orderInfo.EmergencyName;\r\n $scope.orderInfo.Language = 1;\r\n $scope.orderInfo.ExtraProducts = data.products;\r\n $scope.orderInfo.ExtraVisits = data.addons;\r\n $scope.PaySafeCard = infoData.PaySafeCard;\r\n $scope.PaySafeApiKeyFrontEnd = infoData.PaySafeApiKeyFrontEnd;\r\n $scope.CommBank = infoData.CommBank;\r\n $scope.CommBankPublicApiKey = infoData.CommBankPublicApiKey;\r\n $scope.paySafeInit = false;\r\n $scope.ZIP = '';\r\n $scope.Przelewy24 = infoData.Przelewy24;\r\n $scope.orderInfo.PromoCode = '';\r\n $scope.orderInfo.DiscountPromoCode = 0;\r\n $scope.promocodeFalse = false;\r\n $scope.promocodeTrue = false;\r\n\r\n $scope.changePromoStatus = function () {\r\n $scope.promocodeTrue = false;\r\n }\r\n\r\n $scope.changePromoCode = function () {\r\n\r\n $scope.orderInfo.DiscountPromoCode = 0;\r\n\r\n $scope.final.Price = $scope.orderInfo.TotalPrice + $scope.orderInfo.addonsSum;\r\n $scope.final.PriceWT = $scope.orderInfo.TotalPriceWT + $scope.orderInfo.addonsSumWT;\r\n $scope.final.PriceDisc = $scope.orderInfo.TotalPriceDisc + $scope.orderInfo.addonsSum;\r\n $scope.final.PriceDiscWT = $scope.orderInfo.TotalPriceDiscWT + $scope.orderInfo.addonsSumWT;\r\n\r\n $scope.promocodeFalse = false;\r\n $scope.promocodeTrue = false;\r\n if ($scope.orderInfo.PromoCode.length > 3) {\r\n $scope.orderInfo.Date = $scope.orderInfo.StartDate;\r\n $http({\r\n method: 'POST',\r\n url: '/onlinebooking/ValidatePromoCode',\r\n data: $scope.orderInfo\r\n }).success(function (data) {\r\n\r\n if (data.length > 0) {\r\n for (i = 0; i < data.length; i++) {\r\n if (data[i].VisitID == $scope.orderInfo.VisitID) {\r\n $scope.orderInfo.DiscountPromoCode = data[i].Discount;\r\n }\r\n }\r\n if ($scope.orderInfo.DiscountPromoCode > 0) {\r\n $scope.final.Price = ($scope.orderInfo.TotalPrice - ($scope.orderInfo.TotalPrice / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSum;\r\n $scope.final.PriceWT = ($scope.orderInfo.TotalPriceWT - ($scope.orderInfo.TotalPriceWT / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSumWT;\r\n $scope.final.PriceDisc = ($scope.orderInfo.TotalPriceDisc - ($scope.orderInfo.TotalPriceDisc / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSum;\r\n $scope.final.PriceDiscWT = ($scope.orderInfo.TotalPriceDiscWT - ($scope.orderInfo.TotalPriceDiscWT / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSumWT;\r\n\r\n $scope.promocodeTrue = true;\r\n $scope.promocodeFalse = false;\r\n } else {\r\n if (!$scope.promocodeTrue) {\r\n $scope.promocodeTrue = false;\r\n $scope.promocodeFalse = true;\r\n }\r\n }\r\n } else {\r\n $scope.promocodeFalse = true;\r\n }\r\n }).error(function () {\r\n });\r\n }\r\n };\r\n\r\n\r\n $scope.$watch('orderInfo.PaymentType', function (v) {\r\n $scope.orderInfo.PaymentType = v;\r\n if (v == 4) {\r\n if (!$scope.paySafeInit) {\r\n if ($scope.PaySafeCard == true && $scope.PaySafeApiKeyFrontEnd != '') {\r\n $scope.paySafeInit = true;\r\n // Base64 encoded version the Single-use Token API key.\r\n // Create the key below by concatenating the API username and password\r\n // separated by a colon and Base64-encoding the result\r\n var apiKey = infoData.PaySafeApiKeyFrontEnd;\r\n\r\n var Enviroment = \"TEST\";\r\n if ($scope.Enviroment == true)\r\n Enviroment = \"LIVE\";\r\n var options = {\r\n\r\n // select the Paysafe test / sandbox environment\r\n environment: Enviroment,\r\n\r\n // set the CSS selectors to identify the payment field divs above\r\n // set the placeholder text to display in these fields\r\n fields: {\r\n cardNumber: {\r\n selector: \"#cardNumber\",\r\n placeholder: \"Card number\"\r\n },\r\n expiryDate: {\r\n selector: \"#expiryDate\",\r\n placeholder: \"Expiry date\"\r\n },\r\n cvv: {\r\n selector: \"#cvv\",\r\n placeholder: \"CVV\"\r\n }\r\n }\r\n };\r\n\r\n paysafe.fields.setup(apiKey, options, function (instance, error) {\r\n document.getElementById(\"payNow\").addEventListener(\"click\", function (event) {\r\n $('.info.blocks-checkout').addClass('loading');\r\n instance.tokenize(function (instance, error, result) {\r\n if (error) {\r\n $('.payment-status .error-msg').addClass('show').append('

' + error.message + '

');\r\n $('.info.blocks-checkout').removeClass('loading');\r\n } else {\r\n $scope.orderInfo.Token = result.token;\r\n $scope.orderInfo.Comment = $scope.svComment;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n }\r\n });\r\n }, false);\r\n });\r\n }\r\n }\r\n }\r\n else {\r\n $scope.ShowPaySafe = false;\r\n }\r\n\r\n if (v == 66) {\r\n /**\r\n * Configure hosted payments callback.\r\n */\r\n $scope.finalBankPrice = $scope.final.PriceWT.toFixed(2).split('.').join(\"\");\r\n $scope.finalBankPrice = parseInt($scope.finalBankPrice);\r\n\r\n var hostedPayments = SimplifyCommerce.hostedPayments(\r\n function(response) {\r\n var cardToken = response.cardToken;\r\n console.log(cardToken);\r\n // TODO: Pass token to the server & use Simplify's API to make a payment\r\n\r\n $scope.orderInfo.Token = cardToken;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n },\r\n {\r\n scKey: infoData.CommBankPublicApiKey,\r\n amount: $scope.finalBankPrice,\r\n operation: 'create.token',\r\n }\r\n );\r\n /**\r\n * Handle the error response from the server call that\r\n * failed to make a payment from the card token.\r\n */\r\n function apiPaymentErrorHandler() {\r\n // re-enable the payment button, so the user can try again.\r\n hostedPayments.enablePayBtn();\r\n // TODO: Handle error\r\n }\r\n }\r\n\r\n if (v == 6) {\r\n $(\"#process-payment-btn\").on(\"click\", function () {\r\n $('.info.blocks-checkout').addClass('loading');\r\n $('.payment-form.cbform, .loader-container.cbform-loader').addClass('loading');\r\n // Disable the submit button\r\n $(\"#process-payment-btn\").attr(\"disabled\", \"disabled\");\r\n // Generate a card token & handle the response\r\n SimplifyCommerce.generateToken({\r\n key: infoData.CommBankPublicApiKey,\r\n card: {\r\n number: $(\"#cc-number\").val(),\r\n cvc: $(\"#cc-cvc\").val(),\r\n expMonth: $(\"#cc-exp-month\").val(),\r\n expYear: $(\"#cc-exp-year\").val()\r\n }\r\n }, simplifyResponseHandler);\r\n // Prevent the form from submitting\r\n return false;\r\n });\r\n\r\n function simplifyResponseHandler(data) {\r\n var $paymentForm = $(\"#payment-form\");\r\n // Remove all previous errors\r\n $(\".error\").remove();\r\n // Check for errors\r\n if (data.error) {\r\n // Show any validation errors\r\n if (data.error.code == \"validation\") {\r\n var fieldErrors = data.error.fieldErrors,\r\n fieldErrorsLength = fieldErrors.length,\r\n errorList = \"\";\r\n for (var i = 0; i < fieldErrorsLength; i++) {\r\n errorList += \"
Field: '\" + fieldErrors[i].field +\r\n \"' is invalid - \" + fieldErrors[i].message + \"
\";\r\n }\r\n\r\n // Display the errors\r\n $('.payment-form.cbform .payment-status').html('
');\r\n $('.payment-form.cbform .payment-status .error-msg').after('
' + errorList + '
');\r\n }\r\n // Re-enable the submit button\r\n $(\"#process-payment-btn\").removeAttr(\"disabled\");\r\n $('.info.blocks-checkout').removeClass('loading');\r\n } else {\r\n // The token contains id, last4, and card type\r\n var token = data[\"id\"];\r\n // Insert the token into the form so it gets submitted to the server\r\n $('.payment-form.cbform .payment-status').append(\"\");\r\n // Submit the form to the server\r\n $scope.orderInfo.Token = token;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n }\r\n $('.payment-form.cbform, .loader-container.cbform-loader').removeClass('loading');\r\n }\r\n }\r\n\r\n if (v == 7) {\r\n $scope.orderInfo.PaymentProvider = \"paylogin\";\r\n }\r\n if (v == 71) {\r\n $scope.orderInfo.PaymentProvider = \"credit_paydirect\";\r\n }\r\n\r\n if (v == 8) {\r\n\r\n $('.blocks-checkout .next').addClass('show-stripe-btn');\r\n // Create a Stripe client.\r\n var stripe = Stripe($scope.stripePublishKey);\r\n // Create an instance of Elements.\r\n var elements = stripe.elements();\r\n // Custom styling can be passed to options when creating an Element.\r\n // (Note that this demo uses a wider set of styles than the guide below.)\r\n var style = {\r\n base: {\r\n color: '#32325d',\r\n lineHeight: '18px',\r\n fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\r\n fontSmoothing: 'antialiased',\r\n fontSize: '16px',\r\n '::placeholder': {\r\n color: '#aab7c4'\r\n }\r\n },\r\n invalid: {\r\n color: '#fa755a',\r\n iconColor: '#fa755a'\r\n }\r\n };\r\n\r\n\r\n // Create an instance of the card Element.\r\n if ($scope.currencyCode == 'EUR') {\r\n var card = elements.create('card', { style: style, hidePostalCode: true });\r\n } else {\r\n var card = elements.create('card', { style: style });\r\n }\r\n\r\n // Add an instance of the card Element into the `card-element`
.\r\n card.mount('#card-element');\r\n\r\n // Handle real-time validation errors from the card Element.\r\n card.addEventListener('change', function (event) {\r\n var displayError = document.getElementById('card-errors');\r\n if (event.error) {\r\n displayError.textContent = event.error.message;\r\n } else {\r\n displayError.textContent = '';\r\n }\r\n });\r\n\r\n // Handle form submission.\r\n var form = document.getElementById('payment-form');\r\n\r\n $('.stripe-button').on('click', function (e) {\r\n e.preventDefault();\r\n $('.info.blocks-checkout').addClass('loading');\r\n\r\n stripe.createToken(card).then(function (result) {\r\n if (result.error) {\r\n // Inform the user if there was an error.\r\n var errorElement = document.getElementById('card-errors');\r\n errorElement.textContent = result.error.message;\r\n $('.info.blocks-checkout').removeClass('loading');\r\n } else {\r\n // Send the token to your server.\r\n $scope.orderInfo.Token = result.token.id;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n }\r\n });\r\n\r\n })\r\n } else {\r\n $('.blocks-checkout .next').removeClass('show-stripe-btn');\r\n }\r\n });\r\n\r\n $scope.$watch('e', function (v) {\r\n if (v == 1) {\r\n $scope.orderInfo.deposit = true;\r\n } else {\r\n $scope.orderInfo.deposit = false;\r\n }\r\n });\r\n\r\n $scope.checkValue = function (v) {\r\n if ($scope.req == true) {\r\n if (v < 100) {\r\n $scope.earnest = true;\r\n } else {\r\n $scope.earnest = false;\r\n }\r\n }\r\n };\r\n\r\n $scope.sendOrder = function () {\r\n $scope.orderInfo.Earnest = parseInt($scope.orderInfo.Earnest);\r\n if ($scope.orderInfo.PaymentType == 71) {\r\n $scope.orderInfo.PaymentType = 7;\r\n }\r\n\r\n console.log($scope.orderInfo);\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n };\r\n\r\n\r\n\r\n if ($scope.orderInfo.PaymentType == 0) {\r\n $scope.backInfo.type = 'Cash';\r\n $scope.cash = true;\r\n } else if ($scope.orderInfo.PaymentType == 4 || $scope.orderInfo.PaymentType == 6) {\r\n $scope.backInfo.type = 'Card transaction';\r\n } else {\r\n $scope.bank = true;\r\n $scope.backInfo.type = 'Bank';\r\n }\r\n\r\n $scope.backInfo.visit = 'Birthday Booking';\r\n $scope.backInfo.PaidSum = 0;\r\n $scope.backInfo.RemainingSum = $scope.orderInfo.TotalPrice;\r\n $scope.hasDataRedirect();\r\n\r\n}]);\r\n\r\n///Used for single visit reservation\r\napp.controller('FinishController', ['$scope', '$translate', '$window', '$http', 'dataShare', function ($scope, $translate, $window, $http, dataShare) {\r\n\r\n if ( window.location.href.indexOf('finish') > 1 ){\r\n $scope.checkOrderInfo();\r\n }\r\n window.scrollTo(0, 0);\r\n var startYear = new Date().getFullYear().toString().substr(-2);\r\n var currentYear = new Number(startYear);\r\n var url = '/onlinebooking/bookvisits/';\r\n currentYear += 20;\r\n $scope.years = [];\r\n $scope.loading = false;\r\n\r\n while (startYear <= currentYear) {\r\n $scope.years.push(startYear++);\r\n }\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n $scope.data = [];\r\n for (b = 0; b < $scope.orderInfo.Schedules.length; b++) {\r\n if ($scope.orderInfo.Schedules[b].PriceOriginal != undefined) {\r\n $scope.orderInfo.Schedules[b].Price = $scope.orderInfo.Schedules[b].PriceOriginal;\r\n $scope.orderInfo.Schedules[b].Discount = 0;\r\n }\r\n }\r\n for (var b = 0; b < $scope.booked.length; b++) {\r\n if ($scope.booked[b].PriceWithoutTaxOriginal != undefined && $scope.booked[b].TotalPriceOriginal != undefined) {\r\n $scope.booked[b].Discount = 0;\r\n $scope.booked[b].PriceWithoutTax = $scope.booked[b].PriceWithoutTaxOriginal;\r\n $scope.booked[b].TotalPrice = $scope.booked[b].TotalPriceOriginal;\r\n }\r\n }\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n $scope.orderInfo.UserID = -1;\r\n $scope.visits = true;\r\n $scope.finalSchedule = $scope.orderInfo.Schedules;\r\n $scope.lastV = $scope.finalSchedule[$scope.finalSchedule.length - 1];\r\n $scope.lastId = $scope.lastV.VisitID;\r\n $scope.paymentPageText = infoData.Settings.PaymentPageText;\r\n $scope.GiftCardsSingleVisitsPayment = infoData.Settings.GiftCardsSingleVisitsPayment;\r\n $scope.orderInfo.TotalPriceWOTax = $scope.orderInfo.TotalPriceWithoutTax;\r\n $scope.orderInfo.Tax = $scope.orderInfo.TotalPrice - $scope.orderInfo.TotalPriceWithoutTax;\r\n $scope.PaySafeCard = infoData.PaySafeCard;\r\n $scope.PaySafeApiKeyFrontEnd = infoData.PaySafeApiKeyFrontEnd;\r\n $scope.CommBank = infoData.CommBank;\r\n $scope.CommBankPublicApiKey = infoData.CommBankPublicApiKey;\r\n $scope.paySafeInit = false;\r\n $scope.ZIP = '';\r\n $scope.Przelewy24 = infoData.Przelewy24;\r\n\r\n var data = dataShare.getData();\r\n\r\n $scope.orderInfo.Addons = data.addons;\r\n\r\n $scope.orderInfo.Valid = true;\r\n $scope.orderInfo.PromoCode = '';\r\n $scope.promocodeFalse = false;\r\n $scope.changePromoStatus = function () {\r\n $scope.promocodeTrue = false;\r\n }\r\n\r\n $scope.changePromoCode = function () {\r\n\r\n for (b = 0; b < $scope.orderInfo.Schedules.length; b++) {\r\n $scope.orderInfo.Schedules[b].Discount = 0;\r\n $scope.orderInfo.Schedules[b].PriceOriginal = $scope.orderInfo.Schedules[b].PriceWithoutTax;\r\n $scope.orderInfo.Schedules[b].Price = $scope.orderInfo.Schedules[b].PriceOriginal;\r\n }\r\n for (var b = 0; b < $scope.booked.length; b++) {\r\n $scope.booked[b].Discount = 0;\r\n $scope.booked[b].PriceWithoutTaxOriginal = $scope.booked[b].Price;\r\n $scope.booked[b].PriceWithoutTax = $scope.booked[b].Price;\r\n $scope.booked[b].TotalPrice = $scope.booked[b].Price;\r\n }\r\n\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n\r\n $scope.promocodeFalse = false;\r\n $scope.promocodeTrue = false;\r\n if ($scope.orderInfo.PromoCode.length > 3) {\r\n $http({\r\n method: 'POST',\r\n url: '/onlinebooking/ValidatePromoCode',\r\n data: $scope.orderInfo\r\n }).success(function (data) {\r\n\r\n if (data.length > 0) {\r\n for (i = 0; i < data.length; i++) {\r\n for (b = 0; b < $scope.orderInfo.Schedules.length; b++) {\r\n if (data[i].VisitID == $scope.orderInfo.Schedules[b].VisitID) {\r\n $scope.orderInfo.Schedules[b].Discount = data[i].Discount;\r\n $scope.orderInfo.Schedules[b].PriceOriginal = $scope.orderInfo.Schedules[b].Price;\r\n $scope.orderInfo.Schedules[b].Price = $scope.orderInfo.Schedules[b].Price - ($scope.orderInfo.Schedules[b].Price / 100 * data[i].Discount);\r\n $scope.promocodeTrue = true;\r\n $scope.promocodeFalse = false;\r\n }\r\n else {\r\n if (!$scope.promocodeTrue) {\r\n $scope.promocodeTrue = false;\r\n $scope.promocodeFalse = true;\r\n }\r\n }\r\n }\r\n for (var b = 0; b < $scope.booked.length; b++) {\r\n if (data[i].VisitID == $scope.booked[b].VisitID) {\r\n $scope.booked[b].Discount = data[i].Discount;\r\n $scope.booked[b].PriceWithoutTaxOriginal = $scope.booked[b].PriceWithoutTax;\r\n $scope.booked[b].TotalPriceOriginal = $scope.booked[b].TotalPrice;\r\n $scope.promocodeTrue = true;\r\n $scope.promocodeFalse = false;\r\n } else {\r\n\r\n if (!$scope.promocodeTrue) {\r\n $scope.promocodeTrue = false;\r\n $scope.promocodeFalse = true;\r\n }\r\n }\r\n }\r\n }\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n } else {\r\n $scope.promocodeFalse = true;\r\n }\r\n\r\n }).error(function () {\r\n });\r\n\r\n }\r\n else {\r\n for (b = 0; b < $scope.orderInfo.Schedules.length; b++) {\r\n if ($scope.orderInfo.Schedules[b].PriceOriginal != undefined) {\r\n $scope.orderInfo.Schedules[b].Price = $scope.orderInfo.Schedules[b].PriceOriginal;\r\n }\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n }\r\n }\r\n\r\n };\r\n\r\n $scope.$watch('orderInfo.PaymentType', function (v) {\r\n $scope.orderInfo.PaymentType = v;\r\n if (v == 3 || v == 10) {\r\n $scope.orderInfo.Valid = false;\r\n return;\r\n }\r\n if (v == 4) {\r\n if (!$scope.paySafeInit) {\r\n if ($scope.PaySafeCard == true && $scope.PaySafeApiKeyFrontEnd != '') {\r\n $scope.paySafeInit = true;\r\n // Base64 encoded version the Single-use Token API key.\r\n // Create the key below by concatenating the API username and password\r\n // separated by a colon and Base64-encoding the result\r\n var apiKey = infoData.PaySafeApiKeyFrontEnd;\r\n var Enviroment = \"TEST\";\r\n if ($scope.Enviroment == true)\r\n Enviroment = \"LIVE\";\r\n var options = {\r\n\r\n // select the Paysafe test / sandbox environment\r\n environment: Enviroment,\r\n\r\n // set the CSS selectors to identify the payment field divs above\r\n // set the placeholder text to display in these fields\r\n fields: {\r\n cardNumber: {\r\n selector: \"#cardNumber\",\r\n placeholder: \"Card number\"\r\n },\r\n expiryDate: {\r\n selector: \"#expiryDate\",\r\n placeholder: \"Expiry date\"\r\n },\r\n cvv: {\r\n selector: \"#cvv\",\r\n placeholder: \"CVV\"\r\n }\r\n }\r\n };\r\n\r\n paysafe.fields.setup(apiKey, options, function (instance, error) {\r\n document.getElementById(\"payNow\").addEventListener(\"click\", function (event) {\r\n $('.info.blocks-checkout').addClass('loading');\r\n instance.tokenize(function (instance, error, result) {\r\n if (error) {\r\n $('.payment-status .error-msg').addClass('show').append('

' + error.message + '

');\r\n $('.info.blocks-checkout').removeClass('loading');\r\n } else {\r\n $scope.orderInfo.Token = result.token;\r\n $scope.orderInfo.Comment = $scope.svComment;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n }\r\n });\r\n }, false);\r\n });\r\n }\r\n }\r\n }\r\n else {\r\n $scope.ShowPaySafe = false;\r\n }\r\n\r\n if (v == 66) {\r\n /**\r\n * Configure hosted payments callback.\r\n */\r\n $scope.finalBankPrice = $scope.orderInfo.TotalPriceWT.toFixed(2).split('.').join(\"\");\r\n $scope.finalBankPrice = parseInt($scope.finalBankPrice);\r\n\r\n var hostedPayments = SimplifyCommerce.hostedPayments(\r\n function(response) {\r\n var cardToken = response.cardToken;\r\n console.log(cardToken);\r\n // TODO: Pass token to the server & use Simplify's API to make a payment\r\n\r\n $scope.orderInfo.Token = cardToken;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n },\r\n {\r\n scKey: infoData.CommBankPublicApiKey,\r\n amount: $scope.finalBankPrice,\r\n operation: 'create.token',\r\n }\r\n );\r\n /**\r\n * Handle the error response from the server call that\r\n * failed to make a payment from the card token.\r\n */\r\n function apiPaymentErrorHandler() {\r\n // re-enable the payment button, so the user can try again.\r\n hostedPayments.enablePayBtn();\r\n // TODO: Handle error\r\n }\r\n }\r\n\r\n if (v == 6) {\r\n $(\"#process-payment-btn\").on(\"click\", function () {\r\n $('.info.blocks-checkout').addClass('loading');\r\n $('.payment-form.cbform, .loader-container.cbform-loader').addClass('loading');\r\n // Disable the submit button\r\n $(\"#process-payment-btn\").attr(\"disabled\", \"disabled\");\r\n // Generate a card token & handle the response\r\n SimplifyCommerce.generateToken({\r\n key: infoData.CommBankPublicApiKey,\r\n card: {\r\n number: $(\"#cc-number\").val(),\r\n cvc: $(\"#cc-cvc\").val(),\r\n expMonth: $(\"#cc-exp-month\").val(),\r\n expYear: $(\"#cc-exp-year\").val()\r\n }\r\n }, simplifyResponseHandler);\r\n // Prevent the form from submitting\r\n return false;\r\n });\r\n\r\n function simplifyResponseHandler(data) {\r\n var $paymentForm = $(\"#payment-form\");\r\n // Remove all previous errors\r\n $(\".error\").remove();\r\n // Check for errors\r\n if (data.error) {\r\n // Show any validation errors\r\n if (data.error.code == \"validation\") {\r\n var fieldErrors = data.error.fieldErrors,\r\n fieldErrorsLength = fieldErrors.length,\r\n errorList = \"\";\r\n for (var i = 0; i < fieldErrorsLength; i++) {\r\n errorList += \"
Field: '\" + fieldErrors[i].field +\r\n \"' is invalid - \" + fieldErrors[i].message + \"
\";\r\n }\r\n\r\n // console.log(errorList);\r\n // Display the errors\r\n $('.payment-form.cbform .payment-status').html('
');\r\n $('.payment-form.cbform .payment-status .error-msg').after('
' + errorList + '
');\r\n }\r\n // Re-enable the submit button\r\n $(\"#process-payment-btn\").removeAttr(\"disabled\");\r\n $('.info.blocks-checkout').removeClass('loading');\r\n } else {\r\n // The token contains id, last4, and card type\r\n var token = data[\"id\"];\r\n // Insert the token into the form so it gets submitted to the server\r\n $('.payment-form.cbform .payment-status').append(\"\");\r\n // Submit the form to the server\r\n\r\n $scope.orderInfo.Token = token;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n // $paymentForm.get(0).submit();\r\n }\r\n $('.payment-form.cbform, .loader-container.cbform-loader').removeClass('loading');\r\n }\r\n }\r\n\r\n if (v == 7) {\r\n $scope.orderInfo.PaymentProvider = \"paylogin\";\r\n }\r\n if (v == 71) {\r\n $scope.orderInfo.PaymentProvider = \"credit_paydirect\";\r\n }\r\n\r\n if (v == 8) {\r\n $('.blocks-checkout .next').addClass('show-stripe-btn');\r\n // Create a Stripe client.\r\n var stripe = Stripe($scope.stripePublishKey);\r\n // Create an instance of Elements.\r\n var elements = stripe.elements();\r\n // Custom styling can be passed to options when creating an Element.\r\n // (Note that this demo uses a wider set of styles than the guide below.)\r\n var style = {\r\n base: {\r\n color: '#32325d',\r\n lineHeight: '18px',\r\n fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\r\n fontSmoothing: 'antialiased',\r\n fontSize: '16px',\r\n '::placeholder': {\r\n color: '#aab7c4'\r\n }\r\n },\r\n invalid: {\r\n color: '#fa755a',\r\n iconColor: '#fa755a'\r\n }\r\n };\r\n\r\n\r\n // Create an instance of the card Element.\r\n if ($scope.currencyCode == 'EUR') {\r\n var card = elements.create('card', { style: style, hidePostalCode: true });\r\n } else {\r\n var card = elements.create('card', { style: style });\r\n }\r\n\r\n // Add an instance of the card Element into the `card-element`
.\r\n card.mount('#card-element');\r\n\r\n // Handle real-time validation errors from the card Element.\r\n card.addEventListener('change', function (event) {\r\n var displayError = document.getElementById('card-errors');\r\n if (event.error) {\r\n displayError.textContent = event.error.message;\r\n } else {\r\n displayError.textContent = '';\r\n }\r\n });\r\n\r\n // Handle form submission.\r\n var form = document.getElementById('payment-form');\r\n\r\n $('.stripe-button').on('click', function (e) {\r\n e.preventDefault();\r\n $('.info.blocks-checkout').addClass('loading');\r\n\r\n stripe.createToken(card).then(function (result) {\r\n if (result.error) {\r\n // Inform the user if there was an error.\r\n var errorElement = document.getElementById('card-errors');\r\n errorElement.textContent = result.error.message;\r\n $('.info.blocks-checkout').removeClass('loading');\r\n } else {\r\n // Send the token to your server.\r\n $scope.orderInfo.Token = result.token.id;\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n }\r\n });\r\n\r\n })\r\n } else {\r\n $('.blocks-checkout .next').removeClass('show-stripe-btn');\r\n }\r\n\r\n $scope.orderInfo.Valid = true;\r\n });\r\n\r\n //setup before functions\r\n var typingTimerMembership; //timer identifier\r\n var doneTypingIntervalMembership = 2000; //time in ms, 5 second for example\r\n var $inputMembership = $('#membershipCardField');\r\n $scope.membershipCodeValid = true;\r\n\r\n //on keyup, start the countdown\r\n $inputMembership.on('keyup', function () {\r\n clearTimeout(typingTimerMembership);\r\n typingTimerMembership = setTimeout(doneTypingMembership, doneTypingIntervalMembership);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $inputMembership.on('keydown', function () {\r\n clearTimeout(typingTimerMembership);\r\n });\r\n\r\n //user is \"finished typing,\" do something\r\n function doneTypingMembership () {\r\n //do something\r\n\r\n if ( $scope.orderInfo.CardNumber == '' ) {\r\n $scope.membershipCodeValid = true;\r\n }else{\r\n if ($scope.orderInfo.PaymentType == 3 && $scope.orderInfo.CardNumber != '' && $scope.orderInfo.CardNumber != undefined) {\r\n $scope.orderInfo.Valid = false;\r\n $http.post('/OnlineBooking/ValidateMembership', $scope.orderInfo)\r\n .then(function successCallback(response) {\r\n if (response.data == 'True') {\r\n $scope.orderInfo.Valid = true;\r\n $scope.membershipCodeValid = true;\r\n } else{\r\n $scope.orderInfo.Valid = false;\r\n $scope.membershipCodeValid = false;\r\n }\r\n })\r\n }\r\n }\r\n $scope.$apply();\r\n }\r\n\r\n //setup before functions\r\n var typingTimerGiftCard; //timer identifier\r\n var doneTypingIntervalGiftCard = 2000; //time in ms, 5 second for example\r\n var $inputGiftCard = $('#giftCodeCardField');\r\n $scope.giftCodeValid = true;\r\n\r\n //on keyup, start the countdown\r\n $inputGiftCard.on('keyup', function () {\r\n clearTimeout(typingTimerGiftCard);\r\n typingTimerGiftCard = setTimeout(doneTypingGiftCard, doneTypingIntervalGiftCard);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $inputGiftCard.on('keydown', function () {\r\n clearTimeout(typingTimerGiftCard);\r\n });\r\n\r\n //user is \"finished typing,\" do something\r\n function doneTypingGiftCard () {\r\n //do something\r\n\r\n if ( $scope.orderInfo.GiftCardCode == '' ) {\r\n $scope.giftCodeValid = true;\r\n }else{\r\n if ($scope.orderInfo.PaymentType == 10 && $scope.orderInfo.GiftCardCode != '' && $scope.orderInfo.GiftCardCode != undefined) {\r\n $scope.orderInfo.Valid = true;\r\n var dataObject = {\r\n Code: $scope.orderInfo.GiftCardCode,\r\n Amount: $scope.orderInfo.TotalPrice,\r\n GymID: infoData.GymID,\r\n Namespace: infoData.NameSpace\r\n }\r\n\r\n $http.post('/OnlineBooking/ValidateGiftCode', dataObject)\r\n .then(function successCallback(response) {\r\n if (response.data == 'true') {\r\n $scope.orderInfo.Valid = true;\r\n $scope.giftCodeValid = true;\r\n } else{\r\n $scope.orderInfo.Valid = false;\r\n $scope.giftCodeValid = false;\r\n }\r\n })\r\n }\r\n }\r\n $scope.$apply();\r\n }\r\n\r\n\r\n $scope.sendOrder = function () {\r\n $scope.orderInfo.Comment = $scope.svComment;\r\n if ($scope.orderInfo.PaymentType == 71) {\r\n $scope.orderInfo.PaymentType = 7;\r\n }\r\n\r\n console.log($scope.orderInfo);\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n };\r\n\r\n $scope.removeVisit = function (visit) {\r\n $scope.removeByAttr($scope.booked, 'UniqueID', visit.UniqueID)\r\n $scope.removeByAttr($scope.orderInfo.Schedules, 'UniqueID', visit.UniqueID)\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n $scope.finalSchedule = $scope.orderInfo.Schedules;\r\n $scope.lastV = $scope.finalSchedule[$scope.finalSchedule.length - 1];\r\n $scope.lastId = $scope.lastV.VisitID;\r\n $scope.paymentPageText = infoData.Settings.PaymentPageText;\r\n $scope.orderInfo.TotalPriceWOTax = $scope.orderInfo.TotalPriceWithoutTax + $scope.orderInfo.addonsSum;\r\n $scope.orderInfo.Tax = $scope.orderInfo.TotalPrice - $scope.orderInfo.TotalPriceWithoutTax;\r\n };\r\n\r\n $scope.backFinish = function () {\r\n if ($scope.reArenged == true) {\r\n $window.location.href = $scope.params + '#/register-visits/';\r\n } else {\r\n $scope.removeByAttr($scope.orderInfo.Schedules, 'VisitID', $scope.lastId);\r\n $scope.removeByAttr($scope.booked, 'VisitID', $scope.lastId);\r\n\r\n $window.location.href = $scope.params + '#/select-visit-date/' + $scope.lastId;\r\n }\r\n };\r\n\r\n\r\n if ($scope.orderInfo.PaymentType == 0) {\r\n $scope.backInfo.type = 'Cash';\r\n $scope.cash = true;\r\n } else if ($scope.orderInfo.PaymentType == 4 || $scope.orderInfo.PaymentType == 6) {\r\n $scope.backInfo.type = 'Card transaction';\r\n }else if ($scope.orderInfo.PaymentType == 10){\r\n $scope.backInfo.type = 'Gift Card';\r\n } else {\r\n $scope.bank = true;\r\n $scope.backInfo.type = 'Bank';\r\n }\r\n\r\n\r\n $scope.backInfo.visit = 'Session Booking';\r\n\r\n $scope.backInfo.ParentName = $scope.orderInfo.FirstName + \" \" + $scope.orderInfo.LastName;\r\n\r\n $scope.backInfo.PaidSum = 0;\r\n $scope.backInfo.RemainingSum = $scope.orderInfo.TotalPrice;\r\n $scope.hasDataRedirect();\r\n\r\n $scope.removeByAttr = function (arr, attr, value) {\r\n var i = arr.length;\r\n while (i--) {\r\n if (arr[i]\r\n && arr[i].hasOwnProperty(attr)\r\n && (arguments.length > 2 && arr[i][attr] === value)) {\r\n arr.splice(i, 1);\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n}]);\r\n\r\napp.controller('CompleteController', ['$scope', '$http', '$routeParams', '$translate', function ($scope, $http, $routeParams, $translate) {\r\n // $scope.checkOrderInfo();\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n $scope.backInfo = [];\r\n $scope.bank = false;\r\n $scope.card = true;\r\n\r\n $http({\r\n method: 'GET',\r\n url: '/onlinebooking/GetBookigByOrderID/',\r\n params: { OrderID: $routeParams.OrderID, GymID: params.GymID, NameSpace: params.NameSpace }\r\n }).then(function (data) {\r\n $scope.backInfo = data.data;\r\n\r\n $scope.backInfo.DateEnd = moment($scope.backInfo.DateEnd).format($scope.dateTimeFormat);\r\n $scope.backInfo.DateStart = moment($scope.backInfo.DateStart).format($scope.dateTimeFormat);\r\n\r\n $scope.backInfo.Schedules = data.data.Schedules;\r\n for (var key in $scope.backInfo.Schedules) {\r\n $scope.backInfo.Schedules[key].DateEnd = moment($scope.backInfo.Schedules[key].DateEnd).format($scope.dateTimeFormat);\r\n }\r\n\r\n $scope.backInfo.TotalPriceWithoutTax = $routeParams.tpwot;\r\n if ($scope.backInfo.IsBirthday) {\r\n $scope.backInfo.visit = 'Birthday Booking';\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPriceWithProducts - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n else {\r\n $scope.backInfo.visit = 'Session Booking';\r\n $scope.visits = true;\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPrice - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n\r\n $scope.backInfo.type = 'Card';\r\n });\r\n\r\n}]);\r\n\r\napp.controller('KioskBookingController', ['$scope', 'dataShare', '$location', '$http', '$window', '$routeParams', '$translate', 'getServicesAndProducts', 'Backend', '$q', function ($scope, dataShare, $location, $http, $window, $routeParams, $translate, getServicesAndProducts, Backend, $q) {\r\n\r\n $scope.infoData = infoData;\r\n $scope.Language = infoData.Country;\r\n $scope.success = false;\r\n $scope.currentStep = 1;\r\n $scope.ready = false;\r\n\r\n $scope.booked = [];\r\n $scope.orderInfo = {};\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.Discount = false;\r\n $scope.orderInfo.People = 0;\r\n $scope.orderInfo.ParentsAttending = 0;\r\n $scope.orderInfo.deposit = false;\r\n $scope.orderInfo.TotalPrice = 0;\r\n $scope.orderInfo.TotalPriceWT = 0;\r\n $scope.orderInfo.TotalPriceDisc = 0;\r\n $scope.orderInfo.TotalPriceDiscWT = 0;\r\n $scope.orderInfo.Comment = '';\r\n $scope.orderInfo.addonsSum = 0;\r\n $scope.orderInfo.addonsSumWT = 0;\r\n $scope.orderInfo.Schedules = [];\r\n $scope.orderInfo.GymID = params.GymID;\r\n $scope.orderInfo.NameSpace = params.NameSpace;\r\n $scope.orderInfo.KioskMode = true;\r\n $scope.terms = $scope.infoData.Settings.GeneralConditionsLink;\r\n $scope.isPaymentAvailable = false;\r\n $scope.Currency = infoData.Currency;\r\n $scope.CompanyName = infoData.CompanyName;\r\n $scope.ShowFullPrices = $scope.infoData.Settings.ShowFullPrices;\r\n\r\n $scope.orderInfo.Earnest = infoData.Settings.Earnest;\r\n $scope.orderInfo.OnlineBookingWhatToWear = '';\r\n\r\n $scope.orderInfo.Areas = [];\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.PriceWithoutTax = '';\r\n $scope.orderInfo.VisitName = '';\r\n $scope.showCart = false;\r\n $scope.showAddOn = false;\r\n\r\n var data = dataShare.getData();\r\n $scope.adds = data.addons;\r\n\r\n $scope.showAddOn = false;\r\n\r\n $scope.BookingOpenAfter = infoData.Settings.BookingOpenAfter;\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('esm') > -1) {\r\n $translate.use('es')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n if (infoData.Country.indexOf('enu') > -1 || infoData.Country.indexOf('ius') > -1) {\r\n $scope.usTime = true;\r\n $scope.dateFormat = 'MM.DD.YYYY';\r\n $scope.timeFormat = 'hh:mm a'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'hh:mm a';\r\n $scope.dateTimeFormat = 'MM-DD-YYYY hh:mm a';\r\n }\r\n else {\r\n $scope.usTime = false;\r\n $scope.dateFormat = 'DD.MM.YYYY';\r\n $scope.timeFormat = 'HH:mm'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'HH:mm [h]';\r\n $scope.dateTimeFormat = 'DD.MM.YYYY HH:mm [h]';\r\n }\r\n\r\n $scope.getWaiver = function(){\r\n var waiverHref = window.location.origin + '/waiver/embedregistration?GymID=' + params.GymID + '&NameSpace=' + params.NameSpace + '&KioskRedirect=true';\r\n window.location.replace(waiverHref);\r\n }\r\n\r\n $scope.scrollIframe = function(){\r\n document.getElementById('iframe').contentWindow.scrollTo(0,9999);\r\n }\r\n\r\n var plusClickTimer = 0;\r\n var plusClicked = false;\r\n\r\n $scope.plus = function (item) {\r\n item.Quantity++;\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n\r\n if (!plusClicked) {\r\n plusClickTimer = setTimeout(function() {$scope.calculatePrice(item)}, 2000);\r\n plusClicked = true;\r\n }else{\r\n clearTimeout (plusClickTimer);\r\n plusClickTimer = setTimeout(function() {$scope.calculatePrice(item)}, 2000);\r\n }\r\n };\r\n $scope.minus = function (item) {\r\n if (item.Quantity != 1) {\r\n item.Quantity--;\r\n }\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n\r\n if (!plusClicked) {\r\n plusClickTimer = setTimeout(function() {$scope.calculatePrice(item)}, 2000);\r\n plusClicked = true;\r\n }else{\r\n clearTimeout (plusClickTimer);\r\n plusClickTimer = setTimeout(function() {$scope.calculatePrice(item)}, 2000);\r\n }\r\n };\r\n\r\n $scope.calculatePrice = function (item) {\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n // $('.sessions-list .item.expanded .actions .field-wrap .item-quantity')[0].disabled = true;\r\n item['PriceTotal'] = item.Quantity * item.PriceWithoutTax;\r\n item['PriceTotalWithTax'] = item.Quantity * item.Price1;\r\n\r\n $scope.selectedIndex = -1;\r\n $scope.ready = false;\r\n\r\n var now = new Date();\r\n\r\n setTimeout(function() {\r\n $scope.checkConflict(now);\r\n }, 500);\r\n }\r\n\r\n if (infoData.Country.indexOf('enu') > -1 || infoData.Country.indexOf('ius') > -1) {\r\n $scope.usTime = true;\r\n $scope.dateFormat = 'MM.DD.YYYY';\r\n $scope.timeFormat = 'hh:mm a'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'hh:mm a';\r\n $scope.dateTimeFormat = 'MM-DD-YYYY hh:mm a';\r\n }\r\n else {\r\n $scope.usTime = false;\r\n $scope.dateFormat = 'DD.MM.YYYY';\r\n $scope.timeFormat = 'HH:mm'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'HH:mm [h]';\r\n $scope.dateTimeFormat = 'DD.MM.YYYY HH:mm [h]';\r\n }\r\n\r\n\r\n $(document).on('keypress', '.item-quantity', function (e) {\r\n if (e.keyCode == 45) e.preventDefault();\r\n });\r\n\r\n $scope.getTotal = function () {\r\n $scope.orderInfo.TotalPriceWithoutTax = 0;\r\n\r\n for (var i = 0; i < $scope.booked.length; i++) {\r\n if ($scope.booked[i].Discount != undefined && $scope.booked[i].Discount > 0) {\r\n $scope.booked[i].PriceWithoutTax = $scope.booked[i].PriceWithoutTax - ($scope.booked[i].PriceWithoutTax / 100 * $scope.booked[i].Discount);\r\n }\r\n $scope.orderInfo.TotalPriceWithoutTax += $scope.booked[i].people * $scope.booked[i].PriceWithoutTax;\r\n }\r\n $scope.orderInfo.TotalPriceWithoutTax += $scope.orderInfo.addonsSum;\r\n };\r\n\r\n $scope.getTotalWithTax = function () {\r\n $scope.orderInfo.TotalPrice = 0;\r\n\r\n for (var i = 0; i < $scope.booked.length; i++) {\r\n if ($scope.booked[i].Discount != undefined && $scope.booked[i].Discount > 0) {\r\n $scope.booked[i].TotalPrice = $scope.booked[i].TotalPrice - ($scope.booked[i].TotalPrice / 100 * $scope.booked[i].Discount);\r\n }\r\n $scope.orderInfo.TotalPrice += $scope.booked[i].people * $scope.booked[i].TotalPrice;\r\n }\r\n $scope.orderInfo.TotalPrice += $scope.orderInfo.addonsSumWT;\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPrice;\r\n };\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.visits = d.SingleVisitsMain;\r\n $scope.visits = $scope.visits.concat(d.SingleVisitsSub);\r\n $scope.addOns = d.SingleVisitsAddons;\r\n console.log(d);\r\n\r\n for (var i = 0; i < $scope.visits.length; i++) {\r\n var visitHours = [];\r\n\r\n if ($scope.visits[i].PriceWithoutTax == 0 || $scope.visits[i].PriceWithoutTax == null)\r\n $scope.visits[i].PriceWithoutTax = $scope.visits[i].TotalPrice;\r\n\r\n\r\n var vHours = $scope.visits[i].OnlineBookingHours;\r\n\r\n var today = new Date();\r\n var d = new Date(2011, 11, 11);\r\n\r\n $.each(vHours, function (index, value) {\r\n var self = $(this);\r\n var hours = [];\r\n\r\n $.each(self[0].Hours, function (index, value) {\r\n var innerSelf = $(this);\r\n var newDateObj = moment(d).add(innerSelf[0].Time.TotalMinutes, 'm').format('HH:mm');\r\n\r\n hours.push(newDateObj);\r\n });\r\n\r\n var oned = { day: self[0].DayOfWeek, hours: [hours] };\r\n\r\n visitHours.push(oned);\r\n\r\n });\r\n\r\n $scope.visits[i]['visitRealHours'] = visitHours;\r\n $scope.visits[i]['Quantity'] = 1;\r\n $scope.visits[i]['PriceTotal'] = $scope.visits[i].PriceWithoutTax;\r\n }\r\n\r\n for (var i = 0; i < $scope.addOns.length; i++) {\r\n $scope.addOns[i]['Quantity'] = 0;\r\n }\r\n });\r\n\r\n $scope.changeStep = function (n) {\r\n\r\n if (n == 2 && $scope.addOns.length > 0 && $scope.showAddOn == false) {\r\n $scope.showAddOn = true;\r\n } else {\r\n $scope.currentStep = n;\r\n }\r\n\r\n if (n == 2) {\r\n $('.iframe-wrapper').html(\"\");\r\n }\r\n\r\n if ( n == 3 || n == 4 || n == 5) {\r\n $('.neworder-wrapper').addClass('hide-cart');\r\n }else{\r\n $('.neworder-wrapper.hide-cart').removeClass('hide-cart');\r\n }\r\n }\r\n\r\n $scope.changeStepY = function () {\r\n console.log($scope.orderInfo);\r\n }\r\n\r\n $scope.nextStep = function () {\r\n\r\n if ($scope.currentStep == 3) {\r\n\r\n } else if ($scope.currentStep == 2) {\r\n if (!$scope.formRegister.$invalid) {\r\n $scope.sendData()\r\n }\r\n } else if ($scope.currentStep == 1) {\r\n if ($scope.addOns.length > 0 && $scope.showAddOn == false) {\r\n $scope.showAddOn = true;\r\n } else {\r\n $scope.currentStep = $scope.currentStep + 1;\r\n }\r\n } else {\r\n $scope.currentStep = $scope.currentStep + 1;\r\n }\r\n \r\n if ($scope.currentStep == 2) {\r\n $('.iframe-wrapper').html(\"\");\r\n }\r\n\r\n if ( $scope.currentStep == 3 || $scope.currentStep == 4 ) {\r\n $('.neworder-wrapper').addClass('hide-cart');\r\n }else{\r\n $('.neworder-wrapper.hide-cart').removeClass('hide-cart');\r\n }\r\n }\r\n\r\n $(document).on('click', '.sessions-list .item-header', function () {\r\n var item = $(this).parent('.item');\r\n $scope.ready = false;\r\n $scope.showAddOn = false;\r\n $scope.visit = false;\r\n\r\n if (!item.is('.expanded')) {\r\n item.addClass('loading');\r\n $scope.getVisitHours(item.data('itemid'));\r\n $scope.selectedIndex = -1;\r\n } else {\r\n item.removeClass('expanded loaded');\r\n }\r\n })\r\n\r\n $scope.getVisitHours = function (visitID) {\r\n\r\n $scope.orderInfo.id = visitID;\r\n var visitResult = $.grep($scope.visits, function (e) { return e.VisitDefinitionID == visitID; });\r\n $scope.visit = visitResult[0];\r\n\r\n var now = new Date();\r\n // $scope.minBookableTime = moment().add($scope.BookingOpenAfter, 'hours');\r\n $scope.minBookableTime = moment();\r\n var numberDay = moment(now).format('e');\r\n\r\n if (visitResult.length > 0 && visitResult != undefined) {\r\n var ree = $.grep(visitResult[0].visitRealHours, function (e) { return e.day == numberDay; });\r\n if (ree != undefined && ree.length > 0) {\r\n var hours = ree[0].hours[0];\r\n $scope.realHours = [];\r\n for (i = 0; i < ree[0].hours[0].length; i++) {\r\n\r\n var justDate = moment(now).startOf('day');\r\n var justTime = moment(ree[0].hours[0][i], $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n if (moment(dateTime).isAfter($scope.minBookableTime)) {\r\n $scope.realHours.push(ree[0].hours[0][i]);\r\n }\r\n }\r\n\r\n if ($scope.realHours.length < 1) {\r\n setTimeout(function () {\r\n $('.sessions-list .item[data-itemid=\"' + visitID + '\"]').addClass('disabled').removeClass('loading');\r\n }, 500);\r\n } else {\r\n $('.sessions-list .item[data-itemid=\"' + visitID + '\"]').removeClass('loading').addClass('expanded').siblings().removeClass('expanded loaded');\r\n }\r\n\r\n //setup before functions\r\n var typingPeople;\r\n var $inputPeople = $('.sessions-list .item.expanded .actions .field-wrap .item-quantity');\r\n\r\n //on keyup, start the countdown\r\n $inputPeople.on('keyup', function () {\r\n clearTimeout(typingPeople);\r\n typingPeople = setTimeout(function() {$scope.calculatePrice($scope.visit)}, 2000);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $inputPeople.on('keydown', function () {\r\n clearTimeout(typingPeople);\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n });\r\n $scope.checkConflict(now);\r\n }\r\n }\r\n }\r\n\r\n $scope.checkConflict = function (b) {\r\n var item = $('.sessions-list .item.expanded');\r\n var people = item.find('.item-quantity').val();\r\n $scope.orderInfo.People = people;\r\n\r\n $scope.ccData = {};\r\n $scope.loading = true;\r\n\r\n $scope.ccData.VisitId = item.data('itemid')\r\n $scope.ccData.StartDate = b;\r\n if (people < 1)\r\n $scope.ccData.People = 1;\r\n else\r\n $scope.ccData.People = people;\r\n $scope.ccData.NameSpace = $scope.infoData.NameSpace;\r\n $scope.ccData.GymID = $scope.infoData.GymID;\r\n $scope.ccData.IsBirthday = false;\r\n\r\n if ($scope.realHours) {\r\n $scope.ccData.StartDate = $scope.realHours.map(function (h) {\r\n var justDate = moment($scope.date).startOf('day');\r\n var justTime = moment(h, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(1, 'hours');\r\n\r\n return dateTime.toISOString();\r\n });\r\n\r\n Backend.checkConflictAsync($scope.ccData).then(function success(results) {\r\n $scope.curHours = _.map(results.data, function (hourData) {\r\n return {\r\n isConflict: hourData.MaxPeople > 0,\r\n areas: hourData.Areas,\r\n value: moment(hourData.StartDate).format($scope.timeFormat),\r\n slotsleft: hourData.SlotsLeft\r\n };\r\n });\r\n\r\n $scope.loading = false;\r\n plusClicked = false;\r\n $('.sessions-list .item.expanded').addClass('loaded');\r\n // $('.sessions-list .item.expanded .actions .field-wrap .item-quantity')[0].disabled = false;\r\n $scope.compare();\r\n });\r\n\r\n }\r\n };\r\n\r\n $scope.addToCart = function (item) {\r\n // $scope.showAddOn = true;\r\n $scope.calculatePrice(item);\r\n\r\n var date = new Date();\r\n var justDate = moment($scope.date).startOf('day');\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay){\r\n dateTime = dateTime.add(1, 'hours');\r\n }\r\n $scope.orderInfo.Date = moment(dateTime);\r\n $scope.orderInfo.StartDate = moment(dateTime);\r\n $scope.orderInfo.People = $('.sessions-list .item.expanded .item-quantity').val();\r\n $scope.orderInfo.PriceTotal = item.PriceTotal;\r\n $scope.orderInfo.PriceTotalWithTax = item.PriceTotalWithTax;\r\n $scope.selectedIndex = -1;\r\n $scope.bookVisit($scope.orderInfo);\r\n\r\n $scope.ready = false;\r\n\r\n Swal.fire({\r\n type: 'success',\r\n title: 'Product added to cart.',\r\n showConfirmButton: false,\r\n timer: 1500\r\n })\r\n }\r\n\r\n $scope.bookVisit = function (item) {\r\n var dateLocal = moment(new Date(item.Date)).format($scope.dateTimeFormat);\r\n $scope.bookedItem = { VisitID: item.id, VisitName: $scope.visit.VisitName, UniqueID: item.id + dateLocal, people: item.People, Date: item.Date, Price: $scope.visit.PriceCurrent, TotalPrice: $scope.visit.PriceCurrent, PriceWithoutTax: $scope.visit.PriceWithoutTax, Duration: $scope.visit.Duration, DateLocal: dateLocal, DateHour: item.Time, TaxIDs: $scope.visit.TaxIDs, Tax: $scope.visit.TaxPercent, OnlineBookingPictureLink: $scope.visit.OnlineBookingPictureLink, Description: $scope.visit.Description, PriceTotal: item.PriceTotal, PriceTotalWithTax: item.PriceTotalWithTax }\r\n\r\n var result = $.grep($scope.booked, function (e) { return e.UniqueID == $scope.bookedItem.UniqueID; });\r\n\r\n if (result.length > 0) {\r\n $scope.removeByAttr($scope.booked, 'UniqueID', $scope.bookedItem.UniqueID)\r\n }\r\n $scope.booked.push($scope.bookedItem);\r\n\r\n toSchedules();\r\n }\r\n\r\n var n = 0;\r\n var toSchedules = function (bookInfo) {\r\n $scope.orderInfo.Schedules = [];\r\n $scope.bookedInfo = $scope.booked.map(function (bookedItem) {\r\n n++;\r\n\r\n var sessionID = bookedItem.VisitID + bookedItem.VisitName + n;\r\n\r\n return {\r\n VisitID: bookedItem.VisitID,\r\n VisitName: bookedItem.VisitName,\r\n PeopleAttending: bookedItem.people,\r\n Date: moment(bookedItem.Date).toISOString(),\r\n Price: bookedItem.TotalPrice,\r\n PriceWithoutTax: bookedItem.PriceWithoutTax,\r\n PriceTotal: bookedItem.PriceTotal,\r\n PriceTotalWithTax: bookedItem.PriceTotalWithTax,\r\n Duration: bookedItem.Duration,\r\n DateLocal: bookedItem.DateLocal,\r\n DateHour: bookedItem.DateHour,\r\n TaxIDs: bookedItem.TaxIDs,\r\n SessionID: sessionID,\r\n UniqueID: bookedItem.VisitID + bookedItem.DateLocal\r\n };\r\n });\r\n\r\n $scope.orderInfo.Schedules = $scope.bookedInfo;\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n\r\n if ($scope.orderInfo.Schedules.length > 0) {\r\n $scope.showCart = true;\r\n }\r\n };\r\n\r\n $scope.compare = function ($index) {\r\n var itemPeople = $('.sessions-list .item.expanded .item-quantity').val();\r\n if ($index == undefined)\r\n return;\r\n $scope.selectedIndex = $index;\r\n\r\n var SelectedItem = $scope.curHours[$index];\r\n $scope.visitLimit = SelectedItem.slotsleft\r\n if (SelectedItem != undefined) {\r\n if (SelectedItem.isConflict == true) {\r\n $scope.ready = false;\r\n } else {\r\n $scope.orderInfo.Time = $scope.realHours[$index];\r\n $scope.hours = $scope.realHours;\r\n $scope.orderInfo.Areas = $scope.curHours[$index].areas;\r\n\r\n $scope.maxPeople = $scope.orderInfo.Areas[0].MaxPeople;\r\n\r\n if (itemPeople > 0 && $scope.orderInfo.Time != '' && itemPeople <= $scope.maxPeople) {\r\n $scope.ready = true;\r\n }\r\n else {\r\n Swal.fire({\r\n type: 'warning',\r\n title: \"There are not enough free slots for this hour!\"\r\n })\r\n $scope.ready = false;\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n $scope.sendData = function (t) {\r\n $scope.error = false;\r\n var data = {\r\n Email: $scope.orderInfo.Email,\r\n GymID: params.GymID,\r\n Namespace: params.NameSpace\r\n }\r\n\r\n $http.post('/Waiver/HasWaiver', data)\r\n .then(function successCallback(response) {\r\n console.log(response);\r\n\r\n if (response.data > 0) {\r\n $scope.orderInfo.ClientID = parseInt(response.data);\r\n $scope.error = false;\r\n $scope.changeStep(3);\r\n } else {\r\n $scope.error = true;\r\n $scope.formRegister.$invalid = true;\r\n\r\n Swal.fire({\r\n type: 'warning',\r\n title: \"You don't have waiver, please before continue sign a waiver and then you can finish your order!\"\r\n })\r\n }\r\n }, function (d) {\r\n\r\n });\r\n\r\n console.log($scope.orderInfo);\r\n };\r\n\r\n $scope.removeByAttr = function (arr, attr, value) {\r\n var i = arr.length;\r\n while (i--) {\r\n if (arr[i]\r\n && arr[i].hasOwnProperty(attr)\r\n && (arguments.length > 2 && arr[i][attr] === value)) {\r\n arr.splice(i, 1);\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n $scope.removeVisit = function (visit) {\r\n $scope.removeByAttr($scope.booked, 'UniqueID', visit.UniqueID)\r\n $scope.removeByAttr($scope.orderInfo.Schedules, 'UniqueID', visit.UniqueID)\r\n\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n\r\n // $scope.finalSchedule = $scope.orderInfo.Schedules;\r\n // $scope.lastV = $scope.finalSchedule[$scope.finalSchedule.length - 1];\r\n // $scope.lastId = $scope.lastV.VisitID;\r\n // $scope.paymentPageText = infoData.Settings.PaymentPageText;\r\n // $scope.orderInfo.TotalPriceWOTax = $scope.orderInfo.TotalPriceWithoutTax + $scope.orderInfo.addonsSum;\r\n // $scope.orderInfo.Tax = $scope.orderInfo.TotalPrice - $scope.orderInfo.TotalPriceWithoutTax;\r\n\r\n if ($scope.orderInfo.Schedules.length == 0) {\r\n $scope.showCart = false;\r\n $scope.changeStep(1);\r\n $scope.showAddOn = false;\r\n $('body').removeClass('show-cart');\r\n }\r\n };\r\n\r\n $scope.plusAddon = function (item) {\r\n item.Quantity++;\r\n $scope.calculatePrice(item);\r\n $scope.saveAdd(item);\r\n };\r\n $scope.minusAddon = function (item) {\r\n if (item.Quantity != 0) {\r\n item.Quantity--;\r\n $scope.calculatePrice(item);\r\n $scope.saveAdd(item);\r\n }\r\n };\r\n\r\n\r\n $scope.saveAdd = function (i) {\r\n $scope.deleteAdd(i.VisitDefinitionID);\r\n $scope.item = i;\r\n $scope.item.Amount = $scope.item.Quantity;\r\n\r\n if ($scope.item.Amount > 0) {\r\n $scope.item.Total = $scope.item.Amount * $scope.item.PriceWithoutTax;\r\n $scope.item.TotalWT = $scope.item.Amount * $scope.item.TotalPrice;\r\n\r\n dataShare.addAddon(i);\r\n updateAddonsSum();\r\n }\r\n }\r\n\r\n $scope.deleteAdd = function (k) {\r\n var key;\r\n for (key in $scope.adds) {\r\n if ($scope.adds[key].VisitDefinitionID == k)\r\n $scope.adds.splice(key, 1);\r\n // $scope.adds[key].added = false;\r\n }\r\n\r\n updateAddonsSum();\r\n };\r\n\r\n var updateAddonsSum = function () {\r\n $scope.addonsSum = 0;\r\n $scope.addonsSumWT = 0;\r\n $scope.Price = 0;\r\n var i;\r\n for (i = 0; i < $scope.adds.length; i++) {\r\n $scope.addonsSum += $scope.adds[i].PriceWithoutTax * $scope.adds[i].Amount;\r\n $scope.addonsSumWT += $scope.adds[i].TotalPrice * $scope.adds[i].Amount;\r\n }\r\n\r\n if ($scope.addonsSum > 0) {\r\n $scope.full = true;\r\n } else {\r\n $scope.full = false;\r\n }\r\n\r\n $scope.Price = $scope.orderInfo.TotalPrice + $scope.addonsSum;\r\n\r\n $scope.orderInfo.addonsSum = $scope.addonsSum;\r\n $scope.orderInfo.addonsSumWT = $scope.addonsSumWT;\r\n $scope.orderInfo.Addons = data.addons;\r\n\r\n console.log($scope.orderInfo);\r\n\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n };\r\n updateAddonsSum();\r\n\r\n $scope.sendOrderInfo = function (data, url) {\r\n $scope.sendOrderFail = false;\r\n\r\n var justDate = moment($scope.orderInfo.StartDate).startOf('day');\r\n\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n\r\n $scope.orderSent = true;\r\n if (data.Schedules.length > 0) {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPriceWithoutTax;\r\n } else {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPrice;\r\n }\r\n\r\n if ($scope.orderInfo.DiscountPromoCode > 0) {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPriceWithoutTax - ($scope.orderInfo.TotalPriceWithoutTax / 100 * $scope.orderInfo.DiscountPromoCode);\r\n // $scope.orderInfo.TotalPrice = $scope.orderInfo.TotalPrice - ($scope.orderInfo.TotalPrice / 100 * $scope.orderInfo.DiscountPromoCode);\r\n // $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPriceWT - ($scope.orderInfo.TotalPriceWT / 100 * $scope.orderInfo.DiscountPromoCode);\r\n }\r\n\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(-1, 'hours');\r\n\r\n $scope.orderInfo.StartDate = moment(dateTime).format($scope.dateTimeFormat).toString();\r\n $scope.orderInfo.KioskMode = true;\r\n $scope.orderInfo.PaymentType = 11;\r\n\r\n if (data.deposit === false && $scope.onlyEarnest !== true)\r\n data.Earnest = 0;\r\n else\r\n data.Earnest = infoData.Settings.Earnest;\r\n\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: data\r\n }).then(function (d) {\r\n if (d.data === '' || d.data.toString().indexOf('Error') !== -1) {\r\n $scope.fail = d.data;\r\n $scope.changeStep(5);\r\n } else if (typeof d.data === 'string' || d.data instanceof String) {\r\n if ($scope.orderInfo.PaymentType == \"4\" || $scope.orderInfo.PaymentType == \"6\") {\r\n $('.payment-status .error-msg').addClass('show').append('

' + d.data + '

');\r\n $scope.orderSent = false;\r\n }\r\n else {\r\n $window.location.href = d.data;\r\n }\r\n }\r\n else {\r\n $scope.backInfo = d.data;\r\n $scope.backInfo.Schedules = d.data.Schedules;\r\n\r\n if ($scope.backInfo.Schedules && $scope.backInfo.Schedules.length > 0)\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPrice - $scope.backInfo.TotalPriceWithoutTax;\r\n else {\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPriceWithProducts - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n\r\n for (var key in $scope.backInfo.Schedules) {\r\n $scope.backInfo.Schedules[key].DateEnd = moment($scope.backInfo.Schedules[key].DateEnd).format($scope.dateTimeFormat);\r\n $scope.backInfo.Schedules[key].DateStart = moment($scope.backInfo.Schedules[key].Date).format($scope.dateTimeFormat);\r\n }\r\n $scope.backInfo.DateStart = moment(d.data.DateStart).format($scope.dateTimeFormat);\r\n $scope.backInfo.DateEnd = moment(d.data.DateEnd).format($scope.dateTimeFormat);\r\n\r\n /*var paypal = {};\r\n paypal.OrderID = $scope.backInfo.OrderID = d.data.OrderID;\r\n if (($scope.backInfo.Schedules.length == 0) && $scope.onlyEarnest == true || $scope.orderInfo.deposit) {\r\n paypal.TotalPrice = infoData.Settings.Earnest;\r\n } else{\r\n paypal.TotalPrice = d.data.TotalPrice;\r\n }\r\n paypal.NameSpace = params.NameSpace;\r\n paypal.GymID = params.GymID;\r\n paypal.TotalPriceWithoutTax = d.data.TotalPriceWithoutTax;*/\r\n\r\n /*if ($scope.orderInfo.PaymentType == 1) {\r\n $scope.sendPaypal(paypal);\r\n } else*/\r\n\r\n Swal.fire({\r\n type: 'success',\r\n title: 'Payment finished with success.',\r\n onAfterClose: (function () {\r\n setTimeout(function() {\r\n $scope.reload();\r\n }, 2000);\r\n })\r\n })\r\n\r\n $scope.changeStep(4);\r\n\r\n if ($scope.infoData.Local != true) {\r\n printReceipt($scope.backInfo.OrderID);\r\n // $scope.paying = false;\r\n } else {\r\n\r\n }\r\n\r\n // $scope.changeStep(4);\r\n }\r\n }, function () {\r\n $scope.sendOrderFail = true;\r\n $scope.orderSent = false;\r\n $scope.loading = false;\r\n // var url = $scope.params + '#/booking-failed/0';\r\n // $window.location.href = url;\r\n });\r\n\r\n };\r\n\r\n var transactionReference = 304;\r\n\r\n $scope.sendOrder = function () {\r\n\r\n console.log($scope.orderInfo);\r\n\r\n // $scope.sendOrderInfo($scope.orderInfo, '/onlinebooking/bookvisits/');\r\n\r\n if ($scope.infoData.Local != true) {\r\n\r\n Swal.fire({\r\n type: 'warning',\r\n title: 'Please',\r\n text: 'Follow the instruction on the terminal!'\r\n });\r\n\r\n $scope.paying = true;\r\n var payPromise = pay($scope.orderInfo.TotalPriceWT);\r\n payPromise.then(\r\n function (payObj) {\r\n // alert('Then Send Order Info');\r\n $scope.sendOrderInfo($scope.orderInfo, '/onlinebooking/bookvisits/');\r\n // Show Payment success:\r\n }, function (error) {\r\n // alert('Error' + error);\r\n\r\n Swal.fire({\r\n type: 'error',\r\n title: \"Payment error. Please try again.\",\r\n onAfterClose: (function () {\r\n $scope.reload();\r\n \r\n $scope.paying = false;\r\n })\r\n })\r\n\r\n }\r\n );\r\n } else {\r\n $scope.sendOrderInfo($scope.orderInfo, '/onlinebooking/bookvisits/');\r\n }\r\n }\r\n\r\n $scope.MBirdSdkConnected = function () {\r\n if (MBirdSdk.isConnected()) {\r\n var promise = MBirdSdk.Peripherals.Status();\r\n promise.then(function (value) {\r\n var isPaymentAvailable = JSON.stringify(value.IsPaymentAvailable);\r\n\r\n if (isPaymentAvailable == 'true') {\r\n $scope.isPaymentAvailable = true;\r\n } else {\r\n $scope.isPaymentAvailable = false;\r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n\r\n $(window).on('load', function(){\r\n $scope.MBirdSdkConnected();\r\n })\r\n\r\n // Start the pay process:\r\n function pay(totalCost) {\r\n var defer = $q.defer();\r\n setTimeout(function () {\r\n if (MBirdSdk.isConnected()) {\r\n var promise = MBirdSdk.Peripherals.Status();\r\n promise.then(function (value) {\r\n var isPaymentAvailable = JSON.stringify(value.IsPaymentAvailable);\r\n\r\n if (isPaymentAvailable == 'true') {\r\n var totalCostCent = parseInt(totalCost * 100);\r\n var payObj = MBirdSdk.Payment.Pay(totalCostCent, transactionReference);\r\n\r\n // Resolve:\r\n defer.resolve(payObj);\r\n\r\n } else {\r\n defer.reject(\"Payment hardware not available.\");\r\n }\r\n });\r\n } else {\r\n defer.reject(\"MBirdSdk is not connected\");\r\n }\r\n }, 100)// Use TimeOut because of the sync request\r\n return defer.promise;\r\n }\r\n // Print Order:\r\n function printReceipt(orderId) {\r\n var defer = $q.defer();\r\n setTimeout(function () {\r\n // Print Receipt: \r\n var promise = MBirdSdk.Peripherals.Status();\r\n promise.then(function (value) {\r\n var isPrinterAvailable = JSON.stringify(value.IsPrinterAvailable);\r\n\r\n if (isPrinterAvailable == 'true') {\r\n\r\n var printContent = getReceiptContent($scope.orderInfo.TotalPriceWT, orderId, $scope.CompanyName);\r\n\r\n var printObj = MBirdSdk.Printer.TagContent(printContent);\r\n // var printObj = MBirdSdk.Printer.TagContent(printContent);\r\n defer.resolve(printObj);\r\n\r\n setTimeout(function () {\r\n $scope.reload();\r\n }, 2000);\r\n } else {\r\n defer.reject(\"Printer not available.\");\r\n }\r\n });\r\n }, 100)// Use TimeOut because of the sync request\r\n return defer.promise;\r\n }\r\n\r\n function pad(n){ \r\n return (\"0\" + n).slice(-2); \r\n }\r\n\r\n // Returns a string formated on multiple lines.\r\n function getReceiptContent(totalCost,\r\n transactionReference,\r\n shopName) {\r\n\r\n var products = $scope.orderInfo.Schedules;\r\n var addOns = $scope.orderInfo.Addons;\r\n var current_datetime = new Date()\r\n var dateFor = current_datetime.getFullYear() + \"-\" + (current_datetime.getMonth() + 1) + \"-\" + current_datetime.getDate() + \" \" + current_datetime.getHours() + \":\" + current_datetime.getMinutes() + \":\" + pad(current_datetime.getSeconds());\r\n var totalLineLength = 42;\r\n var printContent = \"\";\r\n\r\n if (shopName) {\r\n printContent += getSpaces((totalLineLength - shopName.length) / 2) + shopName + \"\\r\\n\\r\\n\\r\\n\";\r\n }\r\n\r\n printContent += getSpaces((totalLineLength - (\"RECEIPT FISCAL \" + transactionReference).length) / 2) + \"RECEIPT FISCAL \" + transactionReference + \"\\r\\n\\r\\n\";\r\n printContent += \"Client: \" + $scope.orderInfo.FirstName + ' ' + $scope.orderInfo.LastName + \"\\r\\n\";;\r\n printContent += \"Email: \" + $scope.orderInfo.Email + \"\\r\\n\";;\r\n printContent += \"Phone: \" + $scope.orderInfo.EmergencyPhone + \"\\r\\n\";;\r\n printContent += \"\\r\\n\\r\\n\";\r\n printContent += \"Items: \\r\\n\";\r\n for (var i = 0; i < products.length; i++) {\r\n var productName = products[i].PeopleAttending + \" x \" + products[i].VisitName.substr(0, 17).toUpperCase();\r\n var productPrice = products[i].PriceTotal.toFixed(2) + \" \" + $scope.Currency;\r\n if ( $scope.ShowFullPrices == true ) {\r\n productPrice = products[i].PriceTotalWithTax.toFixed(2) + $scope.Currency;\r\n }\r\n var dif = totalLineLength - (productName + productPrice).length;\r\n\r\n printContent += productName;\r\n printContent += getSpaces(dif);\r\n printContent += productPrice + \"\\r\\n\";\r\n }\r\n\r\n if ( addOns.length > 0 ) {\r\n for (var i = 0; i < addOns.length; i++) {\r\n var productName = addOns[i].Amount + \" x \" + addOns[i].VisitName.substr(0, 25).toUpperCase();\r\n var productPrice = addOns[i].Total.toFixed(2) + \" \" + $scope.Currency;\r\n if ( $scope.ShowFullPrices == true ) {\r\n productPrice = addOns[i].TotalWT.toFixed(2) + \" \" + $scope.Currency;\r\n }\r\n var dif = totalLineLength - (productName + productPrice).length;\r\n\r\n printContent += productName;\r\n printContent += getSpaces(dif);\r\n printContent += productPrice + \"\\r\\n\";\r\n }\r\n }\r\n\r\n // printContent += \"\\r\\n \\r\\n\";\r\n // printContent += \"\\r\\n \\r\\n\";\r\n // printContent += \"<@PaymentCustomerReceipt>\";\r\n // printContent += \"\\r\\n \\r\\n\";\r\n // printContent += \"\\r\\n \\r\\n\";\r\n // printContent += \"<@PaymentMerchantReceipt>\";\r\n // printContent += \"\\r\\n \\r\\n\";\r\n printContent += \"\\r\\n \\r\\n\";\r\n\r\n // printContent += \"\\r\\n\";\r\n var dif = totalLineLength - (\"TOTAL Without Taxes\".length + $scope.orderInfo.TotalPriceWithoutTax.toFixed(2).length + $scope.Currency.length);\r\n printContent += \"TOTAL Without Taxes\" + getSpaces(dif) + $scope.orderInfo.TotalPriceWithoutTax.toFixed(2) + $scope.Currency + \"\\r\\n\";\r\n\r\n printContent += \"\\r\\n\";\r\n var dif = totalLineLength - (\"TOTAL\".length + totalCost.toFixed(2).length + $scope.Currency.length);\r\n printContent += \"TOTAL\" + getSpaces(dif) + totalCost.toFixed(2) + $scope.Currency + \"\\r\\n\";\r\n printContent += \"\\r\\n\";\r\n printContent += \"<@PaymentCustomerReceipt>\";\r\n printContent += \"<@PaymentMerchantReceipt>\";\r\n // printContent += getSpaces((totalLineLength - dateFor.length) / 2) + dateFor;\r\n printContent += \"\\r\\n\\r\\n\\r\\n\";\r\n printContent += \"<@PartialCut>\";\r\n\r\n return printContent;\r\n }\r\n\r\n function getSpaces(num) {\r\n var sp = \"\";\r\n for (var l = 0; l < num; l++) {\r\n sp += \" \";\r\n }\r\n return sp;\r\n }\r\n\r\n $scope.reload = function () {\r\n var kioskHref = window.location.origin + '/OnlineBooking/KioskBooking?GymID=' + params.GymID + '&NameSpace=' + params.NameSpace;\r\n window.location.replace(kioskHref);\r\n }\r\n\r\n}]);\r\napp.controller('NewBookingController', ['$scope', 'dataShare', '$location', '$http', '$window', '$routeParams', '$translate', 'getServicesAndProducts', 'Backend', '$timeout', function ($scope, dataShare, $location, $http, $window, $routeParams, $translate, getServicesAndProducts, Backend, $timeout) {\r\n\r\n $scope.infoData = infoData;\r\n $scope.Language = infoData.Country;\r\n $scope.success = false;\r\n $scope.currentStep = 1;\r\n $scope.ready = false;\r\n\r\n $scope.booked = [];\r\n $scope.orderInfo = {};\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.Discount = false;\r\n $scope.orderInfo.People = 0;\r\n $scope.orderInfo.ParentsAttending = 0;\r\n $scope.orderInfo.deposit = false;\r\n $scope.orderInfo.TotalPrice = 0;\r\n $scope.orderInfo.TotalPriceWT = 0;\r\n $scope.orderInfo.TotalPriceDisc = 0;\r\n $scope.orderInfo.TotalPriceDiscWT = 0;\r\n $scope.orderInfo.Comment = '';\r\n $scope.orderInfo.addonsSum = 0;\r\n $scope.orderInfo.addonsSumWT = 0;\r\n $scope.orderInfo.Schedules = [];\r\n $scope.orderInfo.GymID = infoData.GymID;\r\n $scope.orderInfo.NameSpace = infoData.NameSpace;\r\n \r\n var namespace = infoData.NameSpace;\r\n $scope.onlyEarnest = infoData.Settings.OnlyEarnest;\r\n $scope.OnlineBookingTaxText = infoData.Settings.OnlineBookingTaxText;\r\n $scope.ShowCapacitySingleVisits = infoData.Settings.ShowCapacitySingleVisits;\r\n $scope.Currency = infoData.Currency;\r\n\r\n if (customCurrency ){\r\n $scope.Currency = customCurrency;\r\n }\r\n \r\n $scope.TelephoneNumberOptional = infoData.Settings.TelephoneNumberOptional;\r\n $scope.orderInfo.Earnest = infoData.Settings.Earnest;\r\n $scope.orderInfo.OnlineBookingWhatToWear = '';\r\n\r\n $scope.orderInfo.Areas = new Array();\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.PriceWithoutTax = '';\r\n $scope.orderInfo.VisitName = '';\r\n $scope.showCart = false;\r\n $scope.showAddOn = false;\r\n $scope.noHours = false;\r\n $scope.notEnoughSlots = false;\r\n $scope.notReachMinimumSlots = false;\r\n $scope.vaapShow = false;\r\n $scope.newBookingBirthday = false;\r\n $scope.newBookingVisit = false;\r\n $scope.newBookingBirthdayBooked = false;\r\n $scope.showFullPrice = infoData.Settings.ShowFullPrices;\r\n $scope.WarningText = infoData.Settings.WarningText;\r\n $scope.orderInfo.newbooking = true;\r\n $scope.orderInfo.ExtraProducts = [];\r\n $scope.orderInfo.ExtraVisits = [];\r\n $scope.emailFormat = /^[_a-zA-Z0-9-]+(\\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-_]+(\\.[a-zA-Z0-9-]+)*(\\.[a-zA-Z]{2,4})$/;\r\n if( client != null ){\r\n $scope.client = client;\r\n }\r\n \r\n if (gym) {\r\n\t\t$scope.gym = gym;\r\n\t\t$($scope.gym[0].BODYPart).prependTo('.body-scripts');\r\n $($scope.gym[0].HEADPart).appendTo(document.head);\r\n }\r\n\r\n $scope.translateLangs = [\r\n {Language : \"English\", LangCode : \"en\", active : false }, \r\n {Language : \"Bulgarian\", LangCode : \"bg\", active : false }, \r\n {Language : \"Polish\", LangCode : \"pl\", active : false }, \r\n {Language : \"Spanish\", LangCode : \"es\", active : false },\r\n {Language : \"Catalan\", LangCode : \"esc\", active : false }\r\n ];\r\n\r\n function setCookie(key, value) {\r\n var val = value;\r\n var expires = new Date();\r\n expires.setTime(expires.getTime() + (1 * 24 * 60 * 60 * 1000));\r\n document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/';\r\n }\r\n\r\n function getCookie(key) {\r\n var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');\r\n return keyValue ? keyValue[2] : null;\r\n } \r\n\r\n function langTranslateUpdate(lang){\r\n for (var i = 0; i < $scope.translateLangs.length; i++) {\r\n $scope.translateLangs[i].active = false;\r\n }\r\n var result = $.grep($scope.translateLangs, function (e) { return e.LangCode == lang; });\r\n result[0].active = true;\r\n }\r\n \r\n $scope.translateThis = function(lang){\r\n $translate.use(lang); \r\n langTranslateUpdate(lang);\r\n setCookie('setLang', lang);\r\n $('.header').toggleClass('show-lang-menu');\r\n }\r\n\r\n $('.lang-nav i.lang-icon').on('click', function(){\r\n $('.header').toggleClass('show-lang-menu');\r\n if($('.header').is('.show-login-menu'))\r\n $('.header').toggleClass('show-login-menu');\r\n })\r\n\r\n $('.login-nav i.login-icon').on('click', function(){\r\n if(client){\r\n $('.header').toggleClass('show-login-menu');\r\n }else{\r\n $scope.loginModal();\r\n }\r\n\r\n if($('.header').is('.show-lang-menu'))\r\n $('.header').toggleClass('show-lang-menu');\r\n })\r\n\r\n var newMozDate = new Date();\r\n $scope.newMozDate = newMozDate;\r\n\r\n var currentYear = new Date().getFullYear();\r\n $scope.dateYears = [];\r\n startYear = currentYear - 21;\r\n\r\n while (startYear <= currentYear) {\r\n $scope.dateYears.push(startYear++);\r\n }\r\n\r\n var data = dataShare.getData();\r\n $scope.adds = data.addons;\r\n\r\n $scope.showAddOn = false;\r\n\r\n $scope.BookingOpenAfter = infoData.Settings.BookingOpenAfter;\r\n $scope.PartyBookingOpenAfter = infoData.Settings.PartyBookingOpenAfter;\r\n const lastLang = getCookie('setLang');\r\n\r\n if ( lastLang ) {\r\n $translate.use(lastLang)\r\n langTranslateUpdate(lastLang);\r\n }else{\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n langTranslateUpdate('bg');\r\n }\r\n else if ($scope.Language.indexOf('esm') > -1 || $scope.Language.indexOf('esn') > -1 || $scope.Language.indexOf('euq') > -1) {\r\n $translate.use('es')\r\n langTranslateUpdate('es');\r\n }else if($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('glc') > -1){\r\n $translate.use('esc')\r\n langTranslateUpdate('esc');\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n langTranslateUpdate('pl');\r\n }\r\n else {\r\n $translate.use('en')\r\n langTranslateUpdate('en');\r\n }\r\n }\r\n\r\n if (infoData.Country.indexOf('enu') > -1 || infoData.Country.indexOf('ius') > -1) {\r\n $scope.usTime = true;\r\n $scope.dateFormat = 'MM.DD.YYYY';\r\n $scope.timeFormat = 'hh:mm a'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'hh:mm a';\r\n $scope.dateTimeFormat = 'MM-DD-YYYY hh:mm a';\r\n }\r\n else {\r\n $scope.usTime = false;\r\n $scope.dateFormat = 'DD.MM.YYYY';\r\n $scope.timeFormat = 'HH:mm'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'HH:mm [h]';\r\n $scope.dateTimeFormat = 'DD.MM.YYYY HH:mm [h]';\r\n }\r\n\r\n\r\n var plusClickTimer = 0;\r\n var plusClicked = false;\r\n\r\n $scope.plus = function (item) {\r\n item.Quantity++;\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n\r\n if (!plusClicked) {\r\n plusClickTimer = setTimeout(() => $scope.calculatePrice(item), 2000);\r\n plusClicked = true;\r\n }else{\r\n clearTimeout (plusClickTimer);\r\n plusClickTimer = setTimeout(() => $scope.calculatePrice(item), 2000);\r\n }\r\n };\r\n\r\n $scope.minus = function (item) {\r\n if (item.Quantity != 1) {\r\n if (item.PeopleQuantity == item.Quantity) {\r\n item.PeopleQuantity--;\r\n }\r\n item.Quantity--;\r\n }\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n\r\n if (!plusClicked) {\r\n plusClickTimer = setTimeout(() => $scope.calculatePrice(item), 2000);\r\n plusClicked = true;\r\n }else{\r\n clearTimeout (plusClickTimer);\r\n plusClickTimer = setTimeout(() => $scope.calculatePrice(item), 2000);\r\n }\r\n };\r\n\r\n $scope.plusP = function (item) {\r\n if (item.PeopleQuantity < item.Quantity) {\r\n item.PeopleQuantity++;\r\n }\r\n };\r\n $scope.minusP = function (item) {\r\n if (item.PeopleQuantity != 1) {\r\n item.PeopleQuantity--;\r\n }\r\n };\r\n\r\n\r\n manageItemDiscounts = (item) => {\r\n $scope.category = getDiscCategory(item.ServiceCategoryID);\r\n if (item.MinimalPackagePriceByPeople > 0) {\r\n item.PriceTotal = item.MinimalPackagePriceByPeople;\r\n item.PriceTotalWithoutTax = item.MinimalPackagePriceByPeopleWithoutTax;\r\n\r\n if (item.Quantity >= item.MinimalPackagePeople) {\r\n item.PriceTotal += (item.Quantity - item.MinimalPackagePeople) * item.TotalPrice;\r\n item.PriceTotalWithoutTax += (item.Quantity - item.MinimalPackagePeople) * item.PriceWithoutTax;\r\n }\r\n }\r\n else {\r\n item.PriceTotal = item.Quantity * item.TotalPrice;\r\n item.PriceTotalWithoutTax = item.Quantity * item.PriceWithoutTax;\r\n }\r\n\r\n if (item.OnlineBookingMinPeopleForDiscount > 0) {\r\n if (item.Quantity > item.OnlineBookingMinPeopleForDiscount) {\r\n if (item.MinimalPackagePriceByPeople > 0) {\r\n if (item.OnlineBookingMinPeopleForDiscount <= item.Quantity) {\r\n var peopleToDiscount = item.Quantity - item.OnlineBookingMinPeopleForDiscount + 1;\r\n item.PriceTotal = item.PriceTotal - (item.PriceWithoutTax * peopleToDiscount * (item.OnlineBookingDiscount / 100));\r\n item.PriceTotalWithoutTax = item.PriceTotal;\r\n item.PriceCurrent = item.Price1 - (item.Price1 * (item.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.Discount = true;\r\n item.quantityDiscount = true;\r\n }\r\n }\r\n else {\r\n item.PriceTotal = item.PriceTotal - (item.PriceTotal * (item.OnlineBookingDiscount / 100));\r\n item.PriceTotalWithoutTax = item.PriceTotalWithoutTax - (item.PriceTotalWithoutTax * (item.OnlineBookingDiscount / 100));\r\n item.PriceCurrent = item.Price1 - (item.Price1 * (item.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.Discount = true;\r\n item.quantityDiscount = true;\r\n $scope.orderInfo.PriceWithTax = item.PriceWithoutTax - (item.PriceWithoutTax * (item.OnlineBookingDiscount / 100));\r\n }\r\n }else{\r\n $scope.orderInfo.Discount = false;\r\n item.quantityDiscount = false;\r\n $scope.orderInfo.PriceWithTax = item.PriceWithoutTax;\r\n }\r\n }else if($scope.category && $scope.category.Discounts) {\r\n let quantity = $scope.category.Quantity > 0 ? $scope.category.Quantity + item.Quantity : item.Quantity;\r\n item.OnlineBookingDiscount = getDiscountByQuantity(quantity, $scope.category.Discounts);\r\n\r\n if (item.OnlineBookingDiscount > 0) {\r\n item.PriceTotal = item.PriceTotal - (item.PriceTotal * (item.OnlineBookingDiscount / 100));\r\n item.PriceTotalWithoutTax = item.PriceTotalWithoutTax - (item.PriceTotalWithoutTax * (item.OnlineBookingDiscount / 100));\r\n $scope.orderInfo.PriceWithTax = item.PriceWithoutTax - (item.PriceWithoutTax * (item.OnlineBookingDiscount / 100));\r\n }\r\n }else{\r\n $scope.orderInfo.Discount = false;\r\n item.quantityDiscount = false;\r\n item.PriceTotal = item.PriceTotal;\r\n item.PriceTotalWithoutTax = item.PriceTotalWithoutTax; \r\n }\r\n }\r\n\r\n getDiscountByQuantity = (quantity, discounts) => {\r\n let disc;\r\n let finalDiscount;\r\n\r\n for (var i = 0; i < discounts.length; i++) {\r\n if ( quantity >= discounts[i].NumberOfVisits) {\r\n disc = discounts[i];\r\n }\r\n }\r\n\r\n finalDiscount = disc ? disc.Discount : 0;\r\n return finalDiscount;\r\n }\r\n\r\n $scope.calculatePrice = async function (item) {\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n\r\n manageItemDiscounts(item)\r\n\r\n $scope.selectedIndex = -1;\r\n if( $scope.selectedIndex >= 0 ){\r\n $scope.compare($scope.selectedIndex);\r\n }\r\n\r\n $scope.minBookableTime = $scope.newBookingBirthday ? moment().add($scope.PartyBookingOpenAfter, 'hours') : moment().add($scope.BookingOpenAfter, 'hours');\r\n\r\n var now = new Date($scope.minBookableTime);\r\n\r\n if ($scope.minDate)\r\n now = $scope.minDate\r\n\r\n if ($scope.currentDate != undefined)\r\n now = $scope.currentDate;\r\n\r\n var numberDay = moment(now).format('e');\r\n var datepicker = '#newBookingDatepicker' + $scope.currentVisitId;\r\n var ree = $.grep($scope.visit.visitRealHours, function (e) { return e.day == numberDay; });\r\n $scope.realHours = [];\r\n if (ree != undefined && ree.length > 0) {\r\n var hours = ree[0].hours[0];\r\n for (i = 0; i < ree[0].hours[0].length; i++) {\r\n\r\n var justDate = moment(now).startOf('day');\r\n var justTime = moment(ree[0].hours[0][i], $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n if (moment(dateTime).isAfter($scope.minBookableTime)) {\r\n $scope.realHours.push(ree[0].hours[0][i]);\r\n }\r\n }\r\n }\r\n\r\n if (!$scope.dontCallCheckConflict) {\r\n // setTimeout(function() {\r\n // }, 500);\r\n await checkConflict(now);\r\n }\r\n\r\n $scope.ready = false;\r\n $scope.notEnoughSlots = false;\r\n $scope.notReachMinimumSlots = false;\r\n\r\n }\r\n\r\n $scope.calculatePeople = function(item){\r\n if (item.PeopleQuantity > item.Quantity)\r\n item.PeopleQuantity = item.Quantity\r\n }\r\n\r\n if (infoData.Country.indexOf('enu') > -1 || infoData.Country.indexOf('ius') > -1) {\r\n $scope.usTime = true;\r\n $scope.dateFormat = 'MM.DD.YYYY';\r\n $scope.timeFormat = 'hh:mm a'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'hh:mm a';\r\n $scope.dateTimeFormat = 'MM-DD-YYYY hh:mm a';\r\n }\r\n else {\r\n $scope.usTime = false;\r\n $scope.dateFormat = 'DD.MM.YYYY';\r\n $scope.timeFormat = 'HH:mm'; // used when parsing times from the backend\r\n $scope.timePrintFormat = 'HH:mm [h]';\r\n $scope.dateTimeFormat = 'DD.MM.YYYY HH:mm [h]';\r\n }\r\n\r\n getServicesAndProducts.async().then(function (d) {\r\n $scope.visits = d.SingleVisitsMain;\r\n $scope.visits = $scope.visits.concat(d.SingleVisitsSub);\r\n $scope.birthdays = d.MainServices;\r\n $scope.singleAddOns = d.SingleVisitsAddons;\r\n $scope.groupAddOns = d.OnlineProducts;\r\n $scope.groupAddOns = $scope.groupAddOns.concat(d.SubServices);\r\n $scope.categories = d.Categories;\r\n\r\n for (var i = 0; i < $scope.birthdays.length; i++) {\r\n if ($scope.birthdays[i].OnlineBookingMinPeopleForDiscount != 0)\r\n $scope.birthdays[i].OnlineBookingMinPeopleForDiscount++;\r\n }\r\n\r\n for (var i = 0; i < $scope.singleAddOns.length; i++) {\r\n $scope.singleAddOns[i]['Quantity'] = 0;\r\n }\r\n\r\n for (var i = 0; i < $scope.groupAddOns.length; i++) {\r\n $scope.groupAddOns[i]['Quantity'] = 0;\r\n\r\n if ($scope.groupAddOns[i]['ProductName']) {\r\n $scope.groupAddOns[i]['VisitName'] = $scope.groupAddOns[i]['ProductName'];\r\n }\r\n\r\n if ( $scope.groupAddOns[i]['PriceSell'] >= 0 ) {\r\n $scope.groupAddOns[i]['TotalPrice'] = $scope.groupAddOns[i]['PriceSell'];\r\n }\r\n\r\n if ($scope.groupAddOns[i]['ProductID']) {\r\n $scope.groupAddOns[i]['VisitDefinitionID'] = $scope.groupAddOns[i]['ProductID'];\r\n }\r\n }\r\n\r\n for (var i = 0; i < $scope.categories.length; i++) {\r\n $scope.categories[i]['Quantity'] = 0;\r\n }\r\n });\r\n\r\n\r\n $scope.changeStep = function (n, v) {\r\n if ( $scope.currentStep == 3 && n == 2 && $scope.vaapShow == true) {\r\n $scope.vaapShow = false\r\n return;\r\n }\r\n\r\n if (n == 1) {\r\n orderInfoReset();\r\n }\r\n\r\n if (n == 3 && ($scope.groupAddOns.length > 0 || $scope.singleAddOns.length > 0) && $scope.showAddOn == false) {\r\n $scope.showAddOn = true;\r\n $(window).scrollTop(0);\r\n } else {\r\n $(window).scrollTop(0);\r\n $scope.currentStep = n;\r\n }\r\n\r\n if (v == 1) {\r\n $scope.newBookingBirthday = true;\r\n $scope.newBookingVisit = false;\r\n $scope.showAddOn = false;\r\n } else if (v == 2) {\r\n $scope.newBookingVisit = true;\r\n $scope.newBookingBirthday = false;\r\n $scope.showAddOn = false;\r\n }\r\n\r\n if (n == 4 || n == 1 || n == 5) {\r\n $('.neworder-wrapper').addClass('hide-cart');\r\n } else {\r\n $('.neworder-wrapper.hide-cart').removeClass('hide-cart');\r\n }\r\n\r\n if (v == 5) {\r\n $scope.newBookingBirthday = true;\r\n $scope.newBookingVisit = false;\r\n $scope.showAddOn = false;\r\n }\r\n\r\n if (n == 4) {\r\n\r\n }\r\n\r\n $('body').removeClass('show-shopping-cart');\r\n }\r\n\r\n if ( isBirthday == true ){\r\n $scope.changeStep(2, 1);\r\n }else if ( isBirthday == false ){\r\n $scope.changeStep(2, 2);\r\n }\r\n\r\n $scope.nextStep = function () {\r\n\r\n if ( $scope.currentStep == 4 ) {\r\n $('body').removeClass('show-shopping-cart');\r\n // $scope.showCart = false;\r\n }else{\r\n if ($scope.currentStep == 3 && $scope.vaapShow == false) {\r\n if (!$scope.formRegister.$invalid) {\r\n $scope.sendData()\r\n }\r\n } else if ( $scope.currentStep == 3 && $scope.vaapShow == true ) {\r\n if ( !$scope.formVaap.$invalid ) {\r\n $scope.changeStep($scope.currentStep + 1);\r\n }\r\n }else{\r\n $scope.changeStep($scope.currentStep + 1);\r\n }\r\n }\r\n }\r\n\r\n $(document).on('click', '.sessions-list .item-header', function () {\r\n var item = $(this).parent('.item');\r\n $scope.ready = false;\r\n $scope.showAddOn = false;\r\n $scope.noHours = false;\r\n $scope.curHours = [];\r\n $scope.visit = false;\r\n $scope.minBookableTime = $scope.newBookingBirthday ? moment().add($scope.PartyBookingOpenAfter, 'hours') : moment().add($scope.BookingOpenAfter, 'hours');\r\n var now = new Date($scope.minBookableTime);\r\n // $scope.currentDate = now;\r\n $scope.currentDate = $scope.currentDate > now ? $scope.currentDate : now;\r\n // $scope.$apply();\r\n\r\n if (!item.is('.expanded')) {\r\n item.addClass('expanded').siblings().removeClass('expanded loaded');\r\n // item.find('.item-quantity').val('1');\r\n $scope.getVisitHours(item.data('itemid'));\r\n $scope.selectedIndex = -1;\r\n\r\n\r\n if ( $scope.newBookingBirthday == true && $scope.orderInfo.Schedules.length > 0){\r\n $scope.newBookingBirthdayBooked = true;\r\n }\r\n } else {\r\n item.removeClass('expanded loaded');\r\n }\r\n })\r\n\r\n discountSchedule = () => {\r\n for (var i = 0; i < $scope.categories.length; i++) {\r\n if ( $scope.categories[i].Quantity > 0 ) {\r\n let discount = getDiscountByQuantity($scope.categories[i].Quantity, $scope.categories[i].Discounts);\r\n let scheduleItems = $.grep($scope.orderInfo.Schedules, function (e) { return e.ServiceCategoryID == $scope.categories[i].Id; });\r\n\r\n for (var n = 0; n < scheduleItems.length; n++) {\r\n if (discount > 0) {\r\n scheduleItems[n].PriceTotalWithoutTax = (scheduleItems[n].PriceWithoutTax - (scheduleItems[n].PriceWithoutTax / 100 * discount)) * scheduleItems[n].PeopleAttending;\r\n scheduleItems[n].PriceTotal = (scheduleItems[n].Price - (scheduleItems[n].Price / 100 * discount)) * scheduleItems[n].PeopleAttending;\r\n scheduleItems[n].Discount = true;\r\n }else{\r\n scheduleItems[n].PriceTotalWithoutTax = scheduleItems[n].PriceTotalWithoutTax\r\n scheduleItems[n].PriceTotal = scheduleItems[n].PriceTotal\r\n scheduleItems[n].Discount = false;\r\n }\r\n \r\n scheduleItems[n].OnlineBookingDiscount = discount;\r\n\r\n let bookedItem = $.grep($scope.booked, function (e) { return e.UniqueID == scheduleItems[n].UniqueID; });\r\n if ( bookedItem ) {\r\n bookedItem[0].PriceTotalWithoutTax = scheduleItems[n].PriceTotalWithoutTax;\r\n bookedItem[0].PriceTotal = scheduleItems[n].PriceTotal;\r\n bookedItem[0].OnlineBookingDiscount = scheduleItems[n].OnlineBookingDiscount;\r\n\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n getDiscCategory = (visitCategoryID) => {\r\n const category = $.grep($scope.categories, function (e) { return e.Id == visitCategoryID; });\r\n return category[0] || false;\r\n }\r\n\r\n addQuantityToDiscCat = (categoryId, quantity) => {\r\n let cat = getDiscCategory(categoryId);\r\n cat.Quantity += cat ? quantity : 0;\r\n }\r\n\r\n removeQuantityFromDiscCat = (categoryId, quantity) => {\r\n let cat = getDiscCategory(categoryId);\r\n cat.Quantity -= cat ? quantity : 0;\r\n }\r\n\r\n $scope.getVisitHours = async function (visitID) {\r\n $scope.noHours = true;\r\n $scope.currentVisitId = visitID;\r\n $scope.orderInfo.id = visitID;\r\n\r\n if ($scope.newBookingBirthday == true) {\r\n var visitResult = $.grep($scope.birthdays, function (e) { return e.VisitDefinitionID == visitID; });\r\n } else {\r\n var visitResult = $.grep($scope.visits, function (e) { return e.VisitDefinitionID == visitID; });\r\n }\r\n $scope.visit = visitResult[0];\r\n let visit = $scope.visit;\r\n\r\n $scope.category = getDiscCategory(visit.ServiceCategoryID);\r\n\r\n if ($scope.visit.OnlineBookingDaysOfWeek){\r\n $scope.visit.offDays = $scope.visit.OnlineBookingDaysOfWeek.split(',').map(function (offDay) { return parseInt(offDay, 10); });//[1, 3, 4];\r\n }else{\r\n $scope.visit.offDays = 'all';\r\n }\r\n\r\n //setup before functions\r\n var typingPeople;\r\n var $inputPeople = $('.neworder-wrapper.newbooking .sessions-list .item.expanded .actions .field-wrap .item-quantity');\r\n\r\n //on keyup, start the countdown\r\n $inputPeople.on('keyup', function () {\r\n clearTimeout(typingPeople);\r\n typingPeople = setTimeout(function() {$scope.calculatePrice($scope.visit)}, 2000);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $inputPeople.on('keydown', function () {\r\n clearTimeout(typingPeople);\r\n $('.sessions-list .item.expanded').removeClass('loaded');\r\n });\r\n\r\n $scope.orderInfo.OnlineBookingMinPeopleForEvent = $scope.visit.OnlineBookingMinPeopleForEvent;\r\n\r\n var visitHours = [];\r\n\r\n if ($scope.visit.PriceWithoutTax == 0 || $scope.visit.PriceWithoutTax == null)\r\n $scope.visit.PriceWithoutTax = $scope.visit.TotalPrice;\r\n\r\n\r\n var vHours = $scope.visit.OnlineBookingHours;\r\n\r\n // var today = new Date();\r\n var d = new Date(2011, 11, 11);\r\n\r\n $.each(vHours, function (index, value) {\r\n var self = $(this);\r\n var hours = [];\r\n\r\n $.each(self[0].Hours, function (index, value) {\r\n var innerSelf = $(this);\r\n var newDateObj = moment(d).add(innerSelf[0].Time.TotalMinutes, 'm').format('HH:mm');\r\n\r\n hours.push(newDateObj);\r\n });\r\n\r\n var oned = { day: self[0].DayOfWeek, hours: [hours] };\r\n\r\n visitHours.push(oned);\r\n\r\n });\r\n\r\n $scope.visit['visitRealHours'] = visitHours;\r\n $scope.visit['Quantity'] = 1;\r\n if ( $scope.visit.OnlineBookingMinPeopleForEvent > 0 ) {\r\n $scope.visit['Quantity'] = $scope.visit.OnlineBookingMinPeopleForEvent;\r\n }\r\n $scope.visit['PeopleQuantity'] = 1;\r\n $scope.visit['PriceTotal'] = $scope.visit.TotalPrice;\r\n $scope.visit['PriceTotalWithoutTax'] = $scope.visit.PriceWithoutTax;\r\n\r\n var now = new Date();\r\n if ($scope.newBookingBirthday) {\r\n $scope.minBookableTime = moment().add($scope.PartyBookingOpenAfter, 'hours');\r\n if ( $scope.PartyBookingOpenAfter > 0 ) {\r\n $scope.minDate = moment().add($scope.PartyBookingOpenAfter, 'hours');\r\n }else{\r\n $scope.minDate = moment();\r\n }\r\n }else{\r\n $scope.minBookableTime = moment().add($scope.BookingOpenAfter, 'hours');\r\n if ( $scope.BookingOpenAfter > 0 ) {\r\n $scope.minDate = moment().add($scope.BookingOpenAfter, 'hours');\r\n }else{\r\n $scope.minDate = moment();\r\n }\r\n }\r\n\r\n $scope.currentDate = moment($scope.currentDate);\r\n $scope.minDate = $scope.currentDate > $scope.minDate ? $scope.currentDate : $scope.minDate;\r\n\r\n var maxTries = 30;\r\n // Try to find the next date which is allowed by the days filter;\r\n while (!filterDays($scope.minDate.toDate())[0] && maxTries--) {\r\n $scope.minDate.add(1, 'days');\r\n }\r\n\r\n $scope.dontCallCheckConflict = true;\r\n await $scope.calculatePrice($scope.visit);\r\n await $scope.getDayHours($scope.minDate);\r\n\r\n var datepicker = '#newBookingDatepicker' + $scope.currentVisitId;\r\n var datepickerEl = $('.sessions-list .item[data-itemid=\"' + visitID + '\"]').find(datepicker)\r\n datepickerEl.datepicker({\r\n minDate: 0,\r\n dateFormat: \"yy-mm-dd\",\r\n onSelect: function (dateText, inst) {\r\n $scope.ready = false;\r\n $('.sessions-list .item[data-itemid=\"' + visitID + '\"]').removeClass('loaded');\r\n var newDateF = new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay);\r\n $scope.currentDate = newDateF;\r\n $scope.getDayHours(newDateF);\r\n }\r\n });\r\n\r\n datepickerEl.datepicker(\"setDate\", new Date($scope.minDate));\r\n datepickerEl.datepicker(\"option\", \"minDate\", new Date($scope.minDate));\r\n datepickerEl.datepicker('option', 'beforeShowDay', filterDays);\r\n $scope.date = datepickerEl.datepicker('getDate');\r\n \r\n function filterDays(date) {\r\n if ($scope.visit.offDays == 'all' || $scope.visit.offDays === undefined) return [true, '', ''];\r\n var day = date.getDay();\r\n var dayIsAllowed = $scope.visit.offDays.indexOf(day) != -1;\r\n\r\n return [dayIsAllowed, '', ''];\r\n }\r\n }\r\n\r\n $(document).on('click', '.sessions-list .item .actions .field-wrap.field-wrap-datepicker i', function(){\r\n var id = $(this).parent().find('input');\r\n\r\n if ( id.datepicker(\"widget\").is(\":visible\")){\r\n console.log('show');\r\n }else{\r\n id.datepicker(\"show\");\r\n }\r\n })\r\n\r\n $scope.getDayHours = function (now) {\r\n $scope.selectedIndex = -1;\r\n\r\n var numberDay = moment(now).format('e');\r\n var datepicker = '#newBookingDatepicker' + $scope.currentVisitId;\r\n var ree = $.grep($scope.visit.visitRealHours, function (e) { return e.day == numberDay; });\r\n $scope.realHours = [];\r\n $scope.curHours = [];\r\n if (ree != undefined && ree.length > 0) {\r\n var hours = ree[0].hours[0];\r\n for (i = 0; i < ree[0].hours[0].length; i++) {\r\n\r\n var justDate = moment(now).startOf('day');\r\n var justTime = moment(ree[0].hours[0][i], $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n if (moment(dateTime).isAfter($scope.minBookableTime)) {\r\n $scope.realHours.push(ree[0].hours[0][i]);\r\n }\r\n }\r\n }\r\n checkConflict(now);\r\n }\r\n\r\n async function checkCustomSlots(date){\r\n let dataObject = {\r\n VisitDefinitionID: $scope.orderInfo.id,\r\n Date: date,\r\n Namespace: $scope.infoData.NameSpace\r\n }\r\n let hours = [];\r\n var d = new Date(2011, 11, 11);\r\n\r\n await $http({\r\n method: 'POST',\r\n url: '/OnlineBooking/GetCustomSlots',\r\n data: dataObject\r\n }).success(function (data) {\r\n if (data) {\r\n if ( data.Hours.length > 0 ) {\r\n for (var i = data.Hours.length - 1; i >= 0; i--) {\r\n var newDateObj = moment(d).add(data.Hours[i].Time.TotalMinutes, 'm').format('HH:mm');\r\n hours.push(newDateObj);\r\n }\r\n\r\n $scope.realHours = hours;\r\n }\r\n\r\n if ( data.NoSlots ) {\r\n $scope.realHours = [];\r\n $scope.noHours = true;\r\n }\r\n }\r\n\r\n }).error(function (err) {\r\n console.log(err);\r\n });\r\n }\r\n\r\n async function checkConflict(b) {\r\n await checkCustomSlots(b);\r\n\r\n var item = $('.sessions-list .item.expanded');\r\n var people = item.find('.item-quantity').val();\r\n $scope.orderInfo.People = people;\r\n $scope.notReachMinimumSlots = false;\r\n\r\n $scope.ccData = {};\r\n $scope.loading = true;\r\n\r\n $scope.ccData.VisitId = item.data('itemid')\r\n $scope.ccData.StartDate = b;\r\n if (people < 1)\r\n $scope.ccData.People = 1;\r\n else\r\n $scope.ccData.People = people;\r\n $scope.ccData.NameSpace = $scope.infoData.NameSpace;\r\n $scope.ccData.GymID = $scope.infoData.GymID;\r\n $scope.ccData.IsBirthday = false;\r\n\r\n if ($scope.realHours.length > 0) {\r\n $scope.ccData.StartDate = $scope.realHours.map(function (h) {\r\n var justDate = moment($scope.ccData.StartDate).startOf('day');\r\n var justTime = moment(h, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(1, 'hours');\r\n\r\n return dateTime.toISOString();\r\n });\r\n\r\n Backend.checkConflictAsync($scope.ccData).then(function success(results) {\r\n $scope.curHours = _.map(results.data, function (hourData) {\r\n return {\r\n isConflict: hourData.MaxPeople > 0,\r\n areas: hourData.Areas,\r\n value: moment(hourData.StartDate).format($scope.timeFormat),\r\n slotsleft: hourData.SlotsLeft\r\n };\r\n });\r\n\r\n if ($scope.curHours.length == 0) {\r\n $scope.noHours = true;\r\n } else {\r\n $scope.noHours = false;\r\n }\r\n\r\n $scope.loading = false;\r\n\r\n // $scope.compare();\r\n\r\n plusClicked = false;\r\n setTimeout(function() {\r\n $('.sessions-list .item.expanded').addClass('loaded');\r\n }, 1000);\r\n });\r\n } else {\r\n $scope.noHours = true;\r\n $scope.loading = false;\r\n $scope.curHours = [];\r\n plusClicked = false;\r\n // $scope.$apply();\r\n setTimeout(function() {\r\n $('.sessions-list .item.expanded').addClass('loaded');\r\n }, 1000);\r\n }\r\n\r\n $scope.dontCallCheckConflict = false;\r\n\r\n $scope.$apply();\r\n };\r\n\r\n $scope.compare = function ($index) {\r\n var itemPeople = $scope.visit.Quantity;\r\n if ($index == undefined)\r\n return;\r\n $scope.selectedIndex = $index;\r\n\r\n var SelectedItem = $scope.curHours[$index];\r\n if (SelectedItem != undefined) {\r\n $scope.visitLimit = SelectedItem.slotsleft;\r\n\r\n if (SelectedItem.isConflict == true) {\r\n $scope.ready = false;\r\n } else {\r\n $scope.orderInfo.Time = $scope.realHours[$index];\r\n $scope.hours = $scope.realHours;\r\n $scope.tempAreas = $scope.curHours[$index].areas;\r\n\r\n $scope.maxPeople = $scope.curHours[$index].areas[0].MaxPeople;\r\n\r\n if (itemPeople > 0 && $scope.orderInfo.Time != '' && itemPeople <= $scope.maxPeople) {\r\n $scope.notEnoughSlots = false;\r\n if ( itemPeople >= $scope.orderInfo.OnlineBookingMinPeopleForEvent ) {\r\n $scope.notReachMinimumSlots = false;\r\n $scope.ready = true;\r\n }else{\r\n $scope.notReachMinimumSlots = true;\r\n $scope.ready = false;\r\n }\r\n }\r\n else {\r\n $scope.ready = false;\r\n $scope.notEnoughSlots = true;\r\n }\r\n }\r\n } else {\r\n $scope.ready = false;\r\n }\r\n }\r\n\r\n $scope.addToCart = function (item) {\r\n // $scope.showAddOn = true;\r\n $scope.orderInfo.OnlineBookingWhatToWear = item.OnlineBookingWhatToWear\r\n\r\n if ( $scope.newBookingBirthday == true && $scope.orderInfo.Schedules.length > 0){\r\n $scope.newBookingBirthdayBooked = true;\r\n }else{\r\n var datepicker = '#newBookingDatepicker' + item.VisitDefinitionID;\r\n var date = $(datepicker).val();\r\n // var date = new Date(date1);\r\n var justDate = moment(date).startOf('day');\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay){\r\n dateTime = dateTime.add(1, 'hours');\r\n }\r\n\r\n $scope.orderInfo.Date = moment(dateTime);\r\n $scope.orderInfo.StartDate = moment(dateTime);\r\n $scope.orderInfo.People = item.Quantity;\r\n $scope.orderInfo.ParentsAttending = item.PeopleQuantity;\r\n $scope.orderInfo.PriceTotal = item.PriceTotal;\r\n $scope.orderInfo.PriceTotalWithoutTax = item.PriceTotalWithoutTax;\r\n $scope.orderInfo.VisitID = item.VisitDefinitionID;\r\n $scope.selectedIndex = -1;\r\n $scope.orderInfo.Capacity = item.Capacity;\r\n $scope.bookVisit($scope.orderInfo);\r\n $scope.ready = false;\r\n }\r\n }\r\n\r\n $scope.bookVisit = function (item) {\r\n var dateLocal = moment(new Date(item.Date)).format($scope.dateTimeFormat);\r\n $scope.bookedItem = { VisitID: item.id, VisitName: $scope.visit.VisitName, UniqueID: item.id + dateLocal, people: item.People, Date: item.Date, Price: $scope.visit.PriceCurrent, TotalPrice: $scope.visit.PriceCurrent, PriceWithoutTax: $scope.visit.PriceWithoutTax, Duration: $scope.visit.Duration, DateLocal: dateLocal, DateHour: item.Time, TaxIDs: $scope.visit.TaxIDs, Tax: $scope.visit.TaxPercent, OnlineBookingPictureLink: $scope.visit.OnlineBookingPictureLink, Description: $scope.visit.Description, PriceTotal: item.PriceTotal, PriceTotalWithoutTax: item.PriceTotalWithoutTax, MinimalPackagePriceByPeople: $scope.visit.MinimalPackagePriceByPeople, Capacity: item.Capacity, OnlineBookingDiscount: $scope.visit.OnlineBookingDiscount, ServiceCategoryID: $scope.visit.ServiceCategoryID, quantityDiscount: $scope.visit.quantityDiscount }\r\n\r\n var result = $.grep($scope.booked, function (e) { return e.UniqueID == $scope.bookedItem.UniqueID; });\r\n\r\n if (result.length > 0) {\r\n $scope.removeByAttr($scope.booked, 'UniqueID', $scope.bookedItem.UniqueID)\r\n removeQuantityFromDiscCat($scope.bookedItem.ServiceCategoryID, $scope.bookedItem.people);\r\n }\r\n\r\n addQuantityToDiscCat($scope.bookedItem.ServiceCategoryID, $scope.bookedItem.people);\r\n $scope.booked.push($scope.bookedItem);\r\n\r\n toSchedules();\r\n }\r\n\r\n var n = 0;\r\n var toSchedules = function (bookInfo) {\r\n $scope.orderInfo.Schedules = [];\r\n $scope.bookedInfo = $scope.booked.map(function (bookedItem) {\r\n n++;\r\n\r\n var sessionID = bookedItem.VisitID + bookedItem.VisitName + n;\r\n\r\n return {\r\n VisitID: bookedItem.VisitID,\r\n VisitName: bookedItem.VisitName,\r\n PeopleAttending: bookedItem.people,\r\n Date: moment(bookedItem.Date).toISOString(),\r\n DateHourFormated: moment(bookedItem.Date).format($scope.timeFormat),\r\n Price: bookedItem.TotalPrice,\r\n PriceWithoutTax: bookedItem.PriceWithoutTax,\r\n PriceTotal: bookedItem.PriceTotal,\r\n PriceTotalWithoutTax: bookedItem.PriceTotalWithoutTax,\r\n Duration: bookedItem.Duration,\r\n DateLocal: bookedItem.DateLocal,\r\n DateHour: bookedItem.DateHour,\r\n TaxIDs: bookedItem.TaxIDs,\r\n Capacity: bookedItem.Capacity,\r\n SessionID: sessionID,\r\n UniqueID: bookedItem.VisitID + bookedItem.DateLocal,\r\n MinimalPackagePriceByPeople: bookedItem.MinimalPackagePriceByPeople,\r\n OnlineBookingDiscount: bookedItem.OnlineBookingDiscount,\r\n ServiceCategoryID: bookedItem.ServiceCategoryID,\r\n quantityDiscount: bookedItem.quantityDiscount\r\n };\r\n });\r\n\r\n if ( !$scope.newBookingBirthday ){\r\n for(var i = 0; i < $scope.orderInfo.Areas.length; i++) {\r\n if ($scope.orderInfo.Areas[i].VisitID == $scope.tempAreas[0].VisitID && $scope.orderInfo.Areas[i].DateBegin == $scope.tempAreas[0].DateBegin && $scope.orderInfo.Areas[i].DateEnd == $scope.tempAreas[0].DateEnd) {\r\n $scope.orderInfo.Areas.splice(i, 1);\r\n }\r\n }\r\n $scope.orderInfo.Areas.push($scope.tempAreas[0]);\r\n }else{\r\n $scope.orderInfo.Areas = $scope.tempAreas;\r\n }\r\n\r\n $scope.orderInfo.Schedules = $scope.bookedInfo;\r\n\r\n $scope.calculatePrice($scope.visit);\r\n discountSchedule();\r\n\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n\r\n\r\n if ($scope.orderInfo.Schedules.length > 0) {\r\n $scope.showCart = true;\r\n }\r\n\r\n $('.neworder-wrapper.newbooking .shopping-cart').addClass('addOne');\r\n setTimeout(function() {\r\n $('.neworder-wrapper.newbooking .shopping-cart').removeClass('addOne');\r\n }, 820);\r\n\r\n checkCartHeight()\r\n };\r\n\r\n $scope.getTotal = function () {\r\n $scope.orderInfo.TotalPriceWithoutTax = 0;\r\n\r\n for (var i = 0; i < $scope.booked.length; i++) {\r\n if ($scope.booked[i].Discount != undefined && $scope.booked[i].Discount > 0) {\r\n $scope.booked[i].PriceWithoutTax = $scope.booked[i].PriceWithoutTax - ($scope.booked[i].PriceWithoutTax / 100 * $scope.booked[i].Discount);\r\n }\r\n // else if($scope.orderInfo.Discount != true && $scope.booked[i].OnlineBookingDiscount > 0){\r\n // $scope.booked[i].PriceTotalWithoutTax = $scope.booked[i].PriceWithoutTax - ($scope.booked[i].PriceWithoutTax / 100 * $scope.booked[i].OnlineBookingDiscount);\r\n // }\r\n $scope.orderInfo.TotalPriceWithoutTax += $scope.booked[i].PriceTotalWithoutTax;\r\n }\r\n $scope.orderInfo.TotalPriceWithoutTax += $scope.orderInfo.addonsSum;\r\n $scope.orderInfo.TotalPriceDisc = $scope.orderInfo.TotalPrice;\r\n $scope.orderInfo.TotalPriceDiscWT = $scope.orderInfo.TotalPriceWT;\r\n };\r\n\r\n $scope.getTotalWithTax = function () {\r\n $scope.orderInfo.TotalPrice = 0;\r\n\r\n for (var i = 0; i < $scope.booked.length; i++) {\r\n if ($scope.booked[i].Discount != undefined && $scope.booked[i].Discount > 0) {\r\n $scope.booked[i].TotalPrice = $scope.booked[i].TotalPrice - ($scope.booked[i].TotalPrice / 100 * $scope.booked[i].Discount);\r\n }\r\n // else if ($scope.orderInfo.Discount != true && $scope.booked[i].OnlineBookingDiscount > 0 ){\r\n // $scope.booked[i].PriceTotal = $scope.booked[i].Price - ($scope.booked[i].Price / 100 * $scope.booked[i].OnlineBookingDiscount);\r\n // }\r\n $scope.orderInfo.TotalPrice += $scope.booked[i].PriceTotal;\r\n }\r\n $scope.orderInfo.TotalPrice += $scope.orderInfo.addonsSumWT;\r\n $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPrice;\r\n $scope.orderInfo.TotalPriceDisc = $scope.orderInfo.TotalPrice;\r\n $scope.orderInfo.TotalPriceDiscWT = $scope.orderInfo.TotalPriceWT;\r\n };\r\n\r\n function daysInMonth(m, y) { // m is 0 indexed: 0-11\r\n switch (m) {\r\n case 1:\r\n return (y % 4 == 0 && y % 100) || y % 400 == 0 ? 29 : 28;\r\n case 8: case 3: case 5: case 10:\r\n return 30;\r\n default:\r\n return 31\r\n }\r\n }\r\n\r\n\r\n function isValid(d, m, y) {\r\n return m >= 0 && m < 12 && d > 0 && d <= daysInMonth(m, y);\r\n }\r\n\r\n $scope.readyToSendMain = true;\r\n\r\n $scope.sendData = function (t) {\r\n\r\n if ( $scope.newBookingBirthday ){\r\n $scope.orderInfo.ChildName = $scope.orderInfo.FirstName + \" \" + $scope.orderInfo.LastName;\r\n $scope.orderInfo.ParentName = $scope.orderInfo.EmergencyName1 + \" \" + $scope.orderInfo.EmergencyName2;\r\n $scope.orderInfo.EmergencyName = $scope.orderInfo.ParentName;\r\n $scope.orderInfo.Language = 1;\r\n }\r\n\r\n if( $scope.newBookingVisit ){\r\n $scope.paymentPageText = infoData.Settings.PaymentPageText;\r\n $scope.orderInfo.TotalPriceWOTax = $scope.orderInfo.TotalPriceWithoutTax;\r\n $scope.orderInfo.Tax = $scope.orderInfo.TotalPrice - $scope.orderInfo.TotalPriceWithoutTax;\r\n }\r\n $scope.orderInfo.Valid = true;\r\n\r\n $scope.error = false;\r\n var data = {\r\n Email: $scope.orderInfo.Email,\r\n GymID: params.GymID,\r\n Namespace: params.NameSpace\r\n }\r\n\r\n if ($scope.newBookingBirthday) {\r\n if (isValid($scope.clientBirthdayDay, $scope.clientBirthdayMonth - 1, $scope.clientBirthdayYear)) {\r\n $scope.readyToSendMain = true;\r\n $scope.orderInfo.BirthDate = $scope.clientBirthdayMonth + '-' + $scope.clientBirthdayDay + '-' + $scope.clientBirthdayYear;\r\n } else {\r\n $scope.readyToSendMain = false;\r\n }\r\n }\r\n\r\n if ($scope.readyToSendMain == true) {\r\n $http.post('/OnlineBooking/AddClient', $scope.orderInfo)\r\n .then(function successCallback(response) {\r\n if (parseInt(response.data == 0) || response.data == null || response.data < 0) {\r\n $scope.error = true;\r\n $scope.formRegister.$invalid = false;\r\n // $window.location.reload();\r\n } else if (response.data > 0) {\r\n $scope.orderInfo.ClientID = parseInt(response.data);\r\n $scope.error = false;\r\n\r\n if ( $scope.infoData.Settings.GeneralConditionsText ) {\r\n $scope.vaapShow = true;\r\n }else{\r\n $scope.changeStep(4);\r\n }\r\n }\r\n }, function (d) {\r\n $scope.formRegister.$invalid = false;\r\n $scope.error = true;\r\n // $window.location.reload();\r\n });\r\n }\r\n };\r\n\r\n $scope.removeByAttr = function (arr, attr, value) {\r\n var i = arr.length;\r\n while (i--) {\r\n if (arr[i]\r\n && arr[i].hasOwnProperty(attr)\r\n && (arguments.length > 2 && arr[i][attr] === value)) {\r\n arr.splice(i, 1);\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n $scope.removeVisit = function (visit) {\r\n $scope.removeByAttr($scope.booked, 'UniqueID', visit.UniqueID)\r\n $scope.removeByAttr($scope.orderInfo.Schedules, 'UniqueID', visit.UniqueID)\r\n $scope.orderInfo.ParentsAttending = 0;\r\n\r\n removeQuantityFromDiscCat(visit.ServiceCategoryID, visit.PeopleAttending);\r\n discountSchedule();\r\n $scope.calculatePrice($scope.visit);\r\n\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n\r\n if ($scope.orderInfo.Schedules.length == 0) {\r\n $scope.showCart = false;\r\n $scope.newBookingBirthdayBooked = false;\r\n $('body').removeClass('show-shopping-cart');\r\n $scope.vaapShow = false;\r\n $scope.changeStep(2);\r\n $scope.showAddOn = false;\r\n $scope.ready = false;\r\n }\r\n };\r\n\r\n\r\n $scope.plusAddon = function (item) {\r\n item.Quantity++;\r\n $scope.saveAdd(item);\r\n };\r\n $scope.minusAddon = function (item) {\r\n if (item.Quantity != 0) {\r\n item.Quantity--;\r\n $scope.saveAdd(item);\r\n }\r\n };\r\n\r\n $scope.saveAdd = function (i) {\r\n $scope.calculatePrice(i);\r\n $scope.deleteAdd(i.VisitDefinitionID);\r\n $scope.item = i;\r\n $scope.item.Amount = $scope.item.Quantity;\r\n\r\n if ($scope.item.Amount > 0) {\r\n $scope.item.Total = $scope.item.Amount * $scope.item.PriceWithoutTax;\r\n $scope.item.TotalWT = $scope.item.Amount * $scope.item.TotalPrice;\r\n\r\n dataShare.addAddon(i);\r\n\r\n if ( $scope.item.ProductID ) {\r\n // dataShare.addProduct(i);\r\n $scope.orderInfo.ExtraProducts.push($scope.item);\r\n }else{\r\n // dataShare.addAddon(i);\r\n $scope.orderInfo.ExtraVisits.push($scope.item);\r\n }\r\n\r\n updateAddonsSum();\r\n checkCartHeight();\r\n }\r\n }\r\n\r\n $scope.deleteAdd = function (k) {\r\n var key;\r\n for (key in $scope.adds) {\r\n if ($scope.adds[key].VisitDefinitionID == k)\r\n $scope.adds.splice(key, 1);\r\n }\r\n\r\n for (key in $scope.orderInfo.ExtraProducts) {\r\n if ($scope.orderInfo.ExtraProducts[key].VisitDefinitionID == k)\r\n $scope.orderInfo.ExtraProducts.splice(key, 1);\r\n }\r\n\r\n for (key in $scope.orderInfo.ExtraVisits) {\r\n if ($scope.orderInfo.ExtraVisits[key].VisitDefinitionID == k)\r\n $scope.orderInfo.ExtraVisits.splice(key, 1);\r\n }\r\n\r\n updateAddonsSum();\r\n };\r\n\r\n var updateAddonsSum = function () {\r\n $scope.addonsSum = 0;\r\n $scope.addonsSumWT = 0;\r\n $scope.Price = 0;\r\n\r\n // $scope.adds = data.addons;\r\n // $scope.adds = $scope.adds.concat(data.products);\r\n\r\n var i;\r\n for (i = 0; i < $scope.adds.length; i++) {\r\n $scope.addonsSum += $scope.adds[i].PriceWithoutTax * $scope.adds[i].Amount;\r\n $scope.addonsSumWT += $scope.adds[i].TotalPrice * $scope.adds[i].Amount;\r\n }\r\n\r\n if ($scope.addonsSum > 0) {\r\n $scope.full = true;\r\n } else {\r\n $scope.full = false;\r\n }\r\n\r\n $scope.Price = $scope.orderInfo.TotalPrice + $scope.addonsSum;\r\n\r\n $scope.orderInfo.addonsSum = $scope.addonsSum;\r\n $scope.orderInfo.addonsSumWT = $scope.addonsSumWT;\r\n $scope.orderInfo.Addons = $scope.adds;\r\n\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n };\r\n updateAddonsSum();\r\n\r\n $scope.reload = function () {\r\n var href = window.location.origin + '/onlinebooking/newbooking?GymID=' + infoData.GymID + '&NameSpace=' + infoData.NameSpace;\r\n if (customCurrency ){\r\n href += '&customCurrency=';\r\n href += customCurrency;\r\n }\r\n console.log(href)\r\n window.location.replace(href);\r\n }\r\n\r\n // Payment Step\r\n var startYear = new Date().getFullYear().toString().substr(-2);\r\n var currentYear = new Number(startYear);\r\n currentYear += 20;\r\n $scope.years = [];\r\n\r\n while (startYear <= currentYear) {\r\n $scope.years.push(startYear++);\r\n }\r\n\r\n $scope.paySafeInit = false;\r\n $scope.orderInfo.Valid = true;\r\n $scope.ZIP = '';\r\n $scope.orderInfo.PromoCode = '';\r\n $scope.orderInfo.DiscountPromoCode = 0;\r\n $scope.promocodeFalse = false;\r\n $scope.promocodeTrue = false;\r\n\r\n $scope.$watch('e', function (v) {\r\n if (v == 1) {\r\n $scope.orderInfo.deposit = true;\r\n } else {\r\n $scope.orderInfo.deposit = false;\r\n }\r\n });\r\n\r\n $scope.$watch('orderInfo.PaymentType', function (v) {\r\n $scope.orderInfo.PaymentType = v;\r\n if (v == 4) {\r\n $('#payNow').addClass('show');\r\n if (!$scope.paySafeInit) {\r\n if ($scope.infoData.PaySafeCard == true && $scope.infoData.PaySafeApiKeyFrontEnd != '') {\r\n $scope.paySafeInit = true;\r\n // Base64 encoded version the Single-use Token API key.\r\n // Create the key below by concatenating the API username and password\r\n // separated by a colon and Base64-encoding the result\r\n var apiKey = $scope.infoData.PaySafeApiKeyFrontEnd;\r\n var Enviroment = \"TEST\";\r\n if ($scope.Enviroment == true)\r\n Enviroment = \"LIVE\";\r\n var options = {\r\n\r\n // select the Paysafe test / sandbox environment\r\n environment: Enviroment,\r\n\r\n // set the CSS selectors to identify the payment field divs above\r\n // set the placeholder text to display in these fields\r\n fields: {\r\n cardNumber: {\r\n selector: \"#cardNumber\",\r\n placeholder: \"Card number\"\r\n },\r\n expiryDate: {\r\n selector: \"#expiryDate\",\r\n placeholder: \"Expiry date\"\r\n },\r\n cvv: {\r\n selector: \"#cvv\",\r\n placeholder: \"CVV\"\r\n }\r\n }\r\n };\r\n\r\n paysafe.fields.setup(apiKey, options, function (instance, error) {\r\n document.getElementById(\"payNow\").addEventListener(\"click\", function (event) {\r\n instance.tokenize(function (instance, error, result) {\r\n $scope.orderLoading = true;\r\n if (error) {\r\n $('.payment-status .error-msg').addClass('show').append('

' + error.message + '

');\r\n $scope.orderLoading = false;\r\n } else {\r\n $scope.orderInfo.Token = result.token;\r\n $scope.orderInfo.Comment = $scope.svComment;\r\n $scope.placeOrder();\r\n }\r\n });\r\n }, false);\r\n });\r\n }\r\n }\r\n }\r\n else {\r\n $('#payNow').removeClass('show');\r\n $scope.ShowPaySafe = false;\r\n }\r\n\r\n if (v == 66) {\r\n $('#process-payment-btn-hp').addClass('show');\r\n $('#process-payment-btn-hp').on('click', function(){\r\n /**\r\n * Configure hosted payments callback.\r\n */\r\n let price;\r\n\r\n if ((!$scope.onlyEarnest || $scope.newBookingVisit) && !$scope.orderInfo.deposit) {\r\n price = $scope.orderInfo.TotalPrice;\r\n }else{\r\n price = $scope.orderInfo.Earnest;\r\n }\r\n\r\n $scope.finalBankPrice = price.toFixed(2).split('.').join(\"\");\r\n $scope.finalBankPrice = parseInt($scope.finalBankPrice);\r\n\r\n var hostedPayments = SimplifyCommerce.hostedPayments(\r\n function(response) {\r\n\r\n if ( response.close != true ) {\r\n var cardToken = response.cardToken;\r\n // TODO: Pass token to the server & use Simplify's API to make a payment\r\n\r\n $scope.orderInfo.Token = cardToken;\r\n $scope.placeOrder();\r\n }\r\n },\r\n {\r\n scKey: infoData.CommBankPublicApiKey,\r\n amount: $scope.finalBankPrice,\r\n operation: 'create.token',\r\n name: infoData.SubscriptionName,\r\n description: ''\r\n\r\n }\r\n ).closeOnCompletion();\r\n /**\r\n * Handle the error response from the server call that\r\n * failed to make a payment from the card token.\r\n */\r\n function apiPaymentErrorHandler() {\r\n // re-enable the payment button, so the user can try again.\r\n hostedPayments.enablePayBtn();\r\n // TODO: Handle error\r\n }\r\n\r\n \r\n $(\".neworder-wrapper.newbooking .payment-methods-list label.bank-label button\").trigger('click');\r\n })\r\n }else{\r\n $('#process-payment-btn-hp').removeClass('show');\r\n }\r\n\r\n\r\n if (v == 6) {\r\n $(\"#process-payment-btn\").addClass('show');\r\n $(\"#process-payment-btn\").on(\"click\", function () {\r\n $scope.orderLoading = true;\r\n $('.payment-form.cbform, .loader-container.cbform-loader').addClass('loading');\r\n // Disable the submit button\r\n $(\"#process-payment-btn\").attr(\"disabled\", \"disabled\");\r\n // Generate a card token & handle the response\r\n SimplifyCommerce.generateToken({\r\n key: infoData.CommBankPublicApiKey,\r\n card: {\r\n number: $(\"#cc-number\").val(),\r\n cvc: $(\"#cc-cvc\").val(),\r\n expMonth: $(\"#cc-exp-month\").val(),\r\n expYear: $(\"#cc-exp-year\").val()\r\n }\r\n }, simplifyResponseHandler);\r\n // Prevent the form from submitting\r\n return false;\r\n });\r\n\r\n function simplifyResponseHandler(data) {\r\n var $paymentForm = $(\"#payment-form\");\r\n // Remove all previous errors\r\n $(\".error\").remove();\r\n // Check for errors\r\n if (data.error) {\r\n // Show any validation errors\r\n if (data.error.code == \"validation\") {\r\n var fieldErrors = data.error.fieldErrors,\r\n fieldErrorsLength = fieldErrors.length,\r\n errorList = \"\";\r\n for (var i = 0; i < fieldErrorsLength; i++) {\r\n errorList += \"
Field: '\" + fieldErrors[i].field +\r\n \"' is invalid - \" + fieldErrors[i].message + \"
\";\r\n }\r\n\r\n // console.log(errorList);\r\n // Display the errors\r\n $('.payment-form.cbform .payment-status').html('
');\r\n $('.payment-form.cbform .payment-status .error-msg').after('
' + errorList + '
');\r\n }\r\n // Re-enable the submit button\r\n $scope.orderLoading = false;\r\n $(\"#process-payment-btn\").removeAttr(\"disabled\");\r\n } else {\r\n // The token contains id, last4, and card type\r\n var token = data[\"id\"];\r\n // Insert the token into the form so it gets submitted to the server\r\n $('.payment-form.cbform .payment-status').append(\"\");\r\n // Submit the form to the server\r\n\r\n $scope.orderInfo.Token = token;\r\n $scope.placeOrder();\r\n // $paymentForm.get(0).submit();\r\n }\r\n $('.payment-form.cbform, .loader-container.cbform-loader').removeClass('loading');\r\n }\r\n }else{\r\n $(\"#process-payment-btn\").removeClass('show');\r\n }\r\n\r\n if (v == 7) {\r\n $scope.orderInfo.PaymentProvider = \"paylogin\";\r\n }\r\n if (v == 71) {\r\n $scope.orderInfo.PaymentProvider = \"credit_paydirect\";\r\n }\r\n\r\n if (v == 8) {\r\n $('#stripe-button').addClass('show');\r\n // Create a Stripe client.\r\n var stripe = Stripe($scope.infoData.StripePublishKey);\r\n // Create an instance of Elements.\r\n var elements = stripe.elements();\r\n // Custom styling can be passed to options when creating an Element.\r\n // (Note that this demo uses a wider set of styles than the guide below.)\r\n var style = {\r\n base: {\r\n color: '#32325d',\r\n lineHeight: '18px',\r\n fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\r\n fontSmoothing: 'antialiased',\r\n fontSize: '16px',\r\n '::placeholder': {\r\n color: '#aab7c4'\r\n }\r\n },\r\n invalid: {\r\n color: '#fa755a',\r\n iconColor: '#fa755a'\r\n }\r\n };\r\n\r\n\r\n // Create an instance of the card Element.\r\n if ($scope.currencyCode == 'EUR') {\r\n var card = elements.create('card', { style: style, hidePostalCode: true });\r\n } else {\r\n var card = elements.create('card', { style: style });\r\n }\r\n\r\n // Add an instance of the card Element into the `card-element`
.\r\n card.mount('#card-element');\r\n\r\n // Handle real-time validation errors from the card Element.\r\n card.on('change', function(event) {\r\n var displayError = document.getElementById('card-errors');\r\n if (event.error) {\r\n displayError.textContent = event.error.message;\r\n } else {\r\n displayError.textContent = '';\r\n }\r\n });\r\n\r\n // Handle form submission.\r\n var form = document.getElementById('payment-form');\r\n\r\n $('#stripe-button').on('click', function (e) {\r\n $scope.orderLoading = true;\r\n e.preventDefault();\r\n\r\n stripe.createToken(card).then(function (result) {\r\n if (result.error) {\r\n // Inform the user if there was an error.\r\n var errorElement = document.getElementById('card-errors');\r\n errorElement.textContent = result.error.message;\r\n $scope.orderLoading = false;\r\n } else {\r\n // Send the token to your server.\r\n $scope.orderInfo.Token = result.token.id;\r\n $scope.placeOrder();\r\n }\r\n });\r\n\r\n })\r\n } else {\r\n $('#stripe-button').removeClass('show');\r\n }\r\n\r\n if (v == 3 || v == 10) {\r\n $scope.orderInfo.Valid = false;\r\n $scope.membershipPayment = false;\r\n }else{\r\n $scope.orderInfo.Valid = true;\r\n $scope.membershipPayment = false;\r\n }\r\n });\r\n\r\n $scope.membershipPayment = false;\r\n $scope.membershipPaymentCost = 0;\r\n\r\n\r\n //setup before functions\r\n var typingTimerMembership; //timer identifier\r\n var doneTypingIntervalMembership = 2000; //time in ms, 5 second for example\r\n var $inputMembership = $('#membershipCardField');\r\n $scope.membershipCodeValid = true;\r\n\r\n //on keyup, start the countdown\r\n $inputMembership.on('keyup', function () {\r\n clearTimeout(typingTimerMembership);\r\n typingTimerMembership = setTimeout(doneTypingMembership, doneTypingIntervalMembership);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $inputMembership.on('keydown', function () {\r\n clearTimeout(typingTimerMembership);\r\n });\r\n\r\n //user is \"finished typing,\" do something\r\n function doneTypingMembership () {\r\n //do something\r\n\r\n if ( $scope.orderInfo.CardNumber == '' ) {\r\n $scope.membershipCodeValid = true;\r\n }else{\r\n if ($scope.orderInfo.PaymentType == 3 && $scope.orderInfo.CardNumber != '' && $scope.orderInfo.CardNumber != undefined) {\r\n $scope.orderInfo.Valid = false;\r\n $scope.membershipPayment = false;\r\n $http.post('/OnlineBooking/ValidateMembership', $scope.orderInfo)\r\n .then(function successCallback(response) {\r\n if (response.data == 'True') {\r\n $scope.orderInfo.Valid = true;\r\n $scope.membershipCodeValid = true;\r\n $scope.membershipPayment = true;\r\n } else{\r\n $scope.orderInfo.Valid = false;\r\n $scope.membershipCodeValid = false;\r\n $scope.membershipPayment = false;\r\n }\r\n })\r\n }\r\n }\r\n $scope.$apply();\r\n }\r\n\r\n //setup before functions\r\n var typingTimerGiftCard; //timer identifier\r\n var doneTypingIntervalGiftCard = 2000; //time in ms, 5 second for example\r\n var $inputGiftCard = $('#giftCodeCardField');\r\n $scope.giftCodeValid = true;\r\n\r\n //on keyup, start the countdown\r\n $inputGiftCard.on('keyup', function () {\r\n clearTimeout(typingTimerGiftCard);\r\n typingTimerGiftCard = setTimeout(doneTypingGiftCard, doneTypingIntervalGiftCard);\r\n });\r\n\r\n //on keydown, clear the countdown \r\n $inputGiftCard.on('keydown', function () {\r\n clearTimeout(typingTimerGiftCard);\r\n });\r\n\r\n //user is \"finished typing,\" do something\r\n function doneTypingGiftCard () {\r\n //do something\r\n\r\n if ( $scope.orderInfo.GiftCardCode == '' ) {\r\n $scope.giftCodeValid = true;\r\n }else{\r\n if ($scope.orderInfo.PaymentType == 10 && $scope.orderInfo.GiftCardCode != '' && $scope.orderInfo.GiftCardCode != undefined) {\r\n $scope.orderInfo.Valid = true;\r\n var dataObject = {\r\n Code: $scope.orderInfo.GiftCardCode,\r\n Amount: $scope.orderInfo.TotalPrice,\r\n GymID: infoData.GymID,\r\n Namespace: infoData.NameSpace\r\n }\r\n\r\n $http.post('/OnlineBooking/ValidateGiftCode', dataObject)\r\n .then(function successCallback(response) {\r\n if (response.data == 'true') {\r\n $scope.orderInfo.Valid = true;\r\n $scope.giftCodeValid = true;\r\n } else{\r\n $scope.orderInfo.Valid = false;\r\n $scope.giftCodeValid = false;\r\n }\r\n })\r\n }\r\n }\r\n $scope.$apply();\r\n }\r\n\r\n $scope.final = [];\r\n\r\n $scope.changePromoStatus = function () {\r\n $scope.promocodeTrue = false;\r\n }\r\n\r\n $scope.changePromoCode = function (value) {\r\n if ( value == 'empty' ) {\r\n $scope.orderInfo.PromoCode = null;\r\n }\r\n\r\n if ( $scope.newBookingBirthday ){\r\n $scope.orderInfo.DiscountPromoCode = 0;\r\n\r\n $scope.final.Price = $scope.orderInfo.TotalPrice;\r\n $scope.final.PriceWT = $scope.orderInfo.TotalPriceWT;\r\n $scope.final.PriceDisc = $scope.orderInfo.TotalPriceDisc;\r\n $scope.final.PriceDiscWT = $scope.orderInfo.TotalPriceDiscWT;\r\n\r\n $scope.promocodeFalse = false;\r\n $scope.promocodeTrue = false;\r\n if ($scope.orderInfo.PromoCode != null && $scope.orderInfo.PromoCode.length > 3) {\r\n $scope.orderInfo.Date = $scope.orderInfo.StartDate;\r\n $http({\r\n method: 'POST',\r\n url: '/onlinebooking/ValidatePromoCode',\r\n data: $scope.orderInfo\r\n }).success(function (data) {\r\n\r\n if (data.length > 0) {\r\n for (let i = 0; i < data.length; i++) {\r\n if (data[i].VisitID == $scope.orderInfo.VisitID) {\r\n $scope.orderInfo.DiscountPromoCode = data[i].Discount;\r\n }\r\n }\r\n if ($scope.orderInfo.DiscountPromoCode > 0) {\r\n $scope.final.Price = ($scope.orderInfo.PriceTotal - ($scope.orderInfo.PriceTotal / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSumWT;\r\n $scope.final.PriceWT = ($scope.orderInfo.PriceTotalWithoutTax - ($scope.orderInfo.PriceTotalWithoutTax / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSum;\r\n $scope.final.PriceDisc = ($scope.orderInfo.PriceTotal - ($scope.orderInfo.PriceTotal / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSumWT;\r\n $scope.final.PriceDiscWT = ($scope.orderInfo.PriceTotalWithoutTax - ($scope.orderInfo.PriceTotalWithoutTax / 100 * $scope.orderInfo.DiscountPromoCode)) + $scope.orderInfo.addonsSum;\r\n\r\n // $scope.orderInfo.TotalPriceWithoutTax = $scope.final.PriceWT;\r\n\r\n $scope.promocodeTrue = true;\r\n $scope.promocodeFalse = false;\r\n } else {\r\n if (!$scope.promocodeTrue) {\r\n $scope.promocodeTrue = false;\r\n $scope.promocodeFalse = true;\r\n }\r\n }\r\n } else {\r\n $scope.promocodeFalse = true;\r\n }\r\n }).error(function () {\r\n });\r\n }\r\n }\r\n\r\n if( $scope.newBookingVisit ){\r\n $scope.promocodeFalse = false;\r\n $scope.promocodeTrue = false;\r\n if ($scope.orderInfo.PromoCode != null && $scope.orderInfo.PromoCode.length > 3) {\r\n for (let b = 0; b < $scope.orderInfo.Schedules.length; b++) {\r\n $scope.orderInfo.Schedules[b].PriceTotalWithoutPC = $scope.orderInfo.Schedules[b].PriceTotal;\r\n }\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/onlinebooking/ValidatePromoCode',\r\n data: $scope.orderInfo\r\n }).success(function (data) {\r\n\r\n if (data.length > 0) {\r\n for (let i = 0; i < data.length; i++) {\r\n for (let b = 0; b < $scope.orderInfo.Schedules.length; b++) {\r\n if (data[i].VisitID == $scope.orderInfo.Schedules[b].VisitID) {\r\n $scope.orderInfo.Schedules[b].Discount = data[i].Discount;\r\n $scope.orderInfo.Schedules[b].PriceTotalWithoutTax = $scope.orderInfo.Schedules[b].PriceTotalWithoutTax - ($scope.orderInfo.Schedules[b].PriceTotalWithoutTax / 100 * data[i].Discount);\r\n $scope.orderInfo.Schedules[b].PriceTotal = $scope.orderInfo.Schedules[b].PriceTotal - ($scope.orderInfo.Schedules[b].PriceTotal / 100 * data[i].Discount);\r\n $scope.orderInfo.Schedules[b].PriceOriginal = $scope.orderInfo.Schedules[b].Price;\r\n $scope.orderInfo.Schedules[b].Price = $scope.orderInfo.Schedules[b].Price - ($scope.orderInfo.Schedules[b].Price / 100 * data[i].Discount);\r\n $scope.promocodeTrue = true;\r\n $scope.promocodeFalse = false;\r\n }\r\n else {\r\n if (!$scope.promocodeTrue) {\r\n $scope.promocodeTrue = false;\r\n $scope.promocodeFalse = true;\r\n }\r\n }\r\n }\r\n for (let b = 0; b < $scope.booked.length; b++) {\r\n if (data[i].VisitID == $scope.booked[b].VisitID) {\r\n $scope.booked[b].Discount = data[i].Discount;\r\n $scope.booked[b].PriceTotalWithoutTax = $scope.booked[b].PriceTotalWithoutTax - ($scope.booked[b].PriceTotalWithoutTax / 100 * data[i].Discount);\r\n $scope.booked[b].PriceTotal = $scope.booked[b].PriceTotal - ($scope.booked[b].PriceTotal / 100 * data[i].Discount);\r\n $scope.booked[b].PriceWithoutTaxOriginal = $scope.booked[b].PriceWithoutTax;\r\n $scope.booked[b].TotalPriceOriginal = $scope.booked[b].TotalPrice;\r\n $scope.promocodeTrue = true;\r\n $scope.promocodeFalse = false;\r\n } else {\r\n\r\n if (!$scope.promocodeTrue) {\r\n $scope.promocodeTrue = false;\r\n $scope.promocodeFalse = true;\r\n }\r\n }\r\n }\r\n }\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n } else {\r\n $scope.promocodeFalse = true;\r\n }\r\n\r\n }).error(function () {\r\n });\r\n\r\n }\r\n else {\r\n for (let b = 0; b < $scope.orderInfo.Schedules.length; b++) {\r\n if ($scope.orderInfo.Schedules[b].PriceOriginal != undefined) {\r\n $scope.orderInfo.Schedules[b].Discount = false;\r\n $scope.orderInfo.Schedules[b].Price = $scope.orderInfo.Schedules[b].PriceOriginal;\r\n $scope.orderInfo.Schedules[b].PriceTotalWithoutTax = $scope.orderInfo.Schedules[b].PriceWithoutTax;\r\n $scope.orderInfo.Schedules[b].PriceTotal = $scope.orderInfo.Schedules[b].PriceTotalWithoutPC;\r\n }\r\n }\r\n\r\n for (let l = 0; l < $scope.booked.length; l++) {\r\n if ($scope.booked[l].TotalPriceOriginal != undefined) {\r\n $scope.booked[l].Discount = false;\r\n $scope.booked[l].PriceTotalWithoutTax = $scope.booked[l].PriceWithoutTaxOriginal;\r\n $scope.booked[l].PriceTotal = $scope.booked[l].Price;\r\n $scope.booked[l].PriceWithoutTax = $scope.booked[l].PriceWithoutTaxOriginal;\r\n $scope.booked[l].TotalPrice = $scope.booked[l].TotalPriceOriginal;\r\n }\r\n }\r\n\r\n $scope.getTotal();\r\n $scope.getTotalWithTax();\r\n }\r\n }\r\n };\r\n\r\n function orderInfoReset(){\r\n $scope.orderInfo = {};\r\n $scope.orderInfo.Time = '';\r\n $scope.orderInfo.Discount = false;\r\n $scope.orderInfo.People = 0;\r\n $scope.orderInfo.ParentsAttending = 0;\r\n $scope.orderInfo.deposit = false;\r\n $scope.orderInfo.TotalPrice = 0;\r\n $scope.orderInfo.TotalPriceWT = 0;\r\n $scope.orderInfo.TotalPriceDisc = 0;\r\n $scope.orderInfo.TotalPriceDiscWT = 0;\r\n $scope.orderInfo.Comment = '';\r\n $scope.orderInfo.addonsSum = 0;\r\n $scope.orderInfo.addonsSumWT = 0;\r\n $scope.orderInfo.Areas = new Array();\r\n $scope.orderInfo.Schedules = [];\r\n $scope.orderInfo.Addons = [];\r\n $scope.orderInfo.GymID = params.GymID;\r\n $scope.orderInfo.NameSpace = params.NameSpace;\r\n $scope.orderInfo.Earnest = infoData.Settings.Earnest;\r\n $scope.orderInfo.OnlineBookingWhatToWear = '';\r\n $scope.orderInfo.ParentsAttending = 0;\r\n $scope.booked = [];\r\n $scope.showCart = false;\r\n $scope.newBookingBirthdayBooked = false;\r\n $scope.orderInfo.ExtraProducts = [];\r\n $scope.orderInfo.ExtraVisits = [];\r\n }\r\n\r\n var url = '/onlinebooking/bookvisits/';\r\n $scope.placeOrder = function(){\r\n\r\n if ($scope.orderInfo.PaymentType == 71) {\r\n $scope.orderInfo.PaymentType = 7;\r\n }\r\n\r\n if ( $scope.newBookingBirthday ){\r\n $scope.orderInfo.ChildName = $scope.orderInfo.FirstName + \" \" + $scope.orderInfo.LastName;\r\n $scope.orderInfo.ParentName = $scope.orderInfo.EmergencyName1 + \" \" + $scope.orderInfo.EmergencyName2;\r\n $scope.orderInfo.EmergencyName = $scope.orderInfo.ParentName;\r\n $scope.orderInfo.Language = 1;\r\n url = '/onlinebooking/SaveBirthDay/';\r\n }\r\n\r\n if( $scope.newBookingVisit ){\r\n $scope.paymentPageText = infoData.Settings.PaymentPageText;\r\n $scope.orderInfo.TotalPriceWOTax = $scope.orderInfo.TotalPriceWithoutTax;\r\n $scope.orderInfo.Tax = $scope.orderInfo.TotalPrice - $scope.orderInfo.TotalPriceWithoutTax;\r\n for (var i = 0; i < $scope.orderInfo.Schedules.length; i++) {\r\n if ($scope.orderInfo.Schedules[i].Discount && $scope.orderInfo.Schedules[i].OnlineBookingDiscount > 0 ){\r\n $scope.orderInfo.Schedules[i].Price = $scope.orderInfo.Schedules[i].Price - ($scope.orderInfo.Schedules[i].Price / 100 * $scope.orderInfo.Schedules[i].OnlineBookingDiscount);\r\n }\r\n }\r\n $scope.orderInfo.Valid = true;\r\n }\r\n\r\n $scope.sendOrderInfo($scope.orderInfo, url);\r\n }\r\n\r\n $scope.sendOrderInfo = function (data, url) {\r\n $scope.sendOrderFail = false;\r\n $scope.showCart = false;\r\n $scope.orderLoading = true;\r\n var justDate = moment($scope.orderInfo.StartDate).startOf('day');\r\n\r\n var justTime = moment($scope.orderInfo.Time, $scope.timeFormat);\r\n var dateTime = moment(justDate).add(justTime.hours(), 'hours').add(justTime.minutes(), 'minutes');\r\n\r\n $scope.orderSent = true;\r\n if (data.Schedules.length > 0) {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPriceWithoutTax;\r\n } else {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPrice;\r\n }\r\n\r\n if ($scope.orderInfo.DiscountPromoCode > 0 && data.deposit === false && $scope.onlyEarnest !== true) {\r\n $scope.orderInfo.TotalPriceWithoutTax = $scope.orderInfo.TotalPriceWithoutTax - ($scope.orderInfo.TotalPriceWithoutTax / 100 * $scope.orderInfo.DiscountPromoCode);\r\n // $scope.orderInfo.TotalPrice = $scope.orderInfo.TotalPrice - ($scope.orderInfo.TotalPrice / 100 * $scope.orderInfo.DiscountPromoCode);\r\n // $scope.orderInfo.TotalPriceWT = $scope.orderInfo.TotalPriceWT - ($scope.orderInfo.TotalPriceWT / 100 * $scope.orderInfo.DiscountPromoCode);\r\n }\r\n\r\n var isDstChangeDay = moment(justDate, \"DD.MM.YYYY\").isDST() !== moment(justDate, \"DD.MM.YYYY\").add(1, \"day\").isDST();\r\n if (isDstChangeDay)\r\n dateTime = dateTime.add(1, 'hours');\r\n $scope.orderInfo.StartDate = moment(dateTime).format($scope.dateTimeFormat).toString();\r\n\r\n if (data.deposit === false && $scope.onlyEarnest !== true){\r\n data.Earnest = 0;\r\n }else{\r\n data.Earnest = infoData.Settings.Earnest;\r\n data.DiscountPromoCode = 0;\r\n //data.PromoCode = '';\r\n }\r\n\r\n if ( $scope.membershipPayment ) {\r\n data.PriceTotal = 0\r\n data.PriceTotalWithoutTax = 0\r\n data.TotalPrice = 0\r\n data.TotalPriceDisc = 0\r\n data.TotalPriceDiscWT = 0\r\n data.TotalPriceWOTax = 0\r\n data.TotalPriceWT = 0\r\n data.TotalPriceWithoutTax = 0\r\n data.addonsSum = 0\r\n data.addonsSumWT = 0\r\n\r\n if (data.Schedules.length > 0) {\r\n for (var i = 0; i < data.Schedules.length; i++) {\r\n data.Schedules[i].Price = 0;\r\n data.Schedules[i].PriceTotal = 0;\r\n data.Schedules[i].PriceTotalWithoutTax = 0;\r\n data.Schedules[i].PriceWithoutTax = 0;\r\n }\r\n }\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: data\r\n }).then(function (d) {\r\n if (d.data === '' || d.data.toString().indexOf('Error') !== -1) {\r\n $scope.fail = d.data;\r\n $scope.changeStep(6);\r\n $scope.orderLoading = false;\r\n } else if (typeof d.data === 'string' || d.data instanceof String) {\r\n if ($scope.orderInfo.PaymentType == \"4\" || $scope.orderInfo.PaymentType == \"6\" || $scope.orderInfo.PaymentType == \"66\") {\r\n $('.payment-status .error-msg').addClass('show').append('

' + d.data + '

');\r\n $scope.orderSent = false;\r\n $scope.orderLoading = false;\r\n }\r\n else {\r\n $window.location.href = d.data;\r\n }\r\n }\r\n else {\r\n\r\n $scope.backInfo = d.data;\r\n var realSchedules = [];\r\n var addOns = [];\r\n\r\n var schedules = d.data.Schedules;\r\n\r\n if ( schedules.length > 0 ) {\r\n for (var i = 0; i < schedules.length; i++) {\r\n schedules[i].TotalPrice = schedules[i].PeopleAttending*schedules[i].Price;\r\n if ( schedules[i].MainVisit == true ) {\r\n schedules[i].Date = moment(schedules[i].Date).format($scope.dateTimeFormat); \r\n schedules[i].DateEnd = moment(schedules[i].DateEnd).format($scope.dateTimeFormat);\r\n schedules[i].DateStart = moment(schedules[i].DateStart).format($scope.dateTimeFormat);\r\n realSchedules.push(schedules[i]);\r\n }else{\r\n addOns.push(schedules[i]);\r\n }\r\n }\r\n }\r\n\r\n $scope.backInfo.DateEnd = moment($scope.backInfo.DateEnd).format($scope.dateTimeFormat);\r\n $scope.backInfo.DateStart = moment($scope.backInfo.DateStart).format($scope.dateTimeFormat);\r\n\r\n $scope.backInfo.Schedules = realSchedules;\r\n $scope.backInfo.addOns = addOns;\r\n\r\n if ($scope.backInfo.Schedules && $scope.backInfo.Schedules.length > 0)\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPrice - $scope.backInfo.TotalPriceWithoutTax;\r\n else {\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPriceWithProducts - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n\r\n if ($scope.backInfo.IsBirthday) {\r\n $scope.backInfo.visit = 'Birthday Booking';\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPriceWithProducts - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n else {\r\n $scope.backInfo.visit = 'Session Booking';\r\n $scope.visits = true;\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPrice - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n\r\n $scope.backInfo.type = 'Card';\r\n $scope.changeStep(5);\r\n $scope.orderLoading = false;\r\n }\r\n }, function () {\r\n $scope.sendOrderFail = true;\r\n $scope.orderSent = false;\r\n $scope.loading = false;\r\n });\r\n\r\n };\r\n\r\n $scope.orderLoading = false;\r\n\r\n if ( FailedPayment == true ) {\r\n $scope.currentStep = 6;\r\n $('body').addClass('loaded');\r\n }\r\n\r\n if ( orderID != null ) {\r\n $scope.backInfo = [];\r\n $scope.currentStep = 5;\r\n $scope.bank = false;\r\n $scope.card = true;\r\n\r\n $http({\r\n method: 'GET',\r\n url: '/onlinebooking/GetBookigByOrderID/',\r\n params: { OrderID: orderID, GymID: params.GymID, NameSpace: params.NameSpace }\r\n }).then(function (data) {\r\n\r\n $scope.backInfo = data.data;\r\n\r\n if ( $scope.backInfo.Finished == false ) {\r\n $scope.currentStep = 6;\r\n\r\n setTimeout(function() {\r\n $('body').addClass('loaded');\r\n }, 1000);\r\n }else{\r\n var realSchedules = [];\r\n var addOns = [];\r\n\r\n var schedules = data.data.Schedules;\r\n\r\n if ( schedules.length > 0 ) {\r\n for (var i = 0; i < schedules.length; i++) {\r\n schedules[i].TotalPrice = schedules[i].PeopleAttending*schedules[i].Price;\r\n if ( schedules[i].MainVisit == true ) {\r\n schedules[i].Date = moment(schedules[i].Date).format($scope.dateTimeFormat); \r\n schedules[i].DateEnd = moment(schedules[i].DateEnd).format($scope.dateTimeFormat);\r\n schedules[i].DateStart = moment(schedules[i].DateStart).format($scope.dateTimeFormat);\r\n realSchedules.push(schedules[i]);\r\n }else{\r\n addOns.push(schedules[i]);\r\n }\r\n\r\n }\r\n }\r\n\r\n $scope.backInfo.DateEnd = moment($scope.backInfo.DateEnd).format($scope.dateTimeFormat);\r\n $scope.backInfo.DateStart = moment($scope.backInfo.DateStart).format($scope.dateTimeFormat);\r\n\r\n $scope.backInfo.Schedules = realSchedules;\r\n $scope.backInfo.addOns = addOns;\r\n\r\n if ($scope.backInfo.IsBirthday) {\r\n $scope.backInfo.visit = 'Birthday Booking';\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPriceWithProducts - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n else {\r\n $scope.backInfo.visit = 'Session Booking';\r\n $scope.visits = true;\r\n $scope.backInfo.Tax = $scope.backInfo.TotalPrice - $scope.backInfo.TotalPriceWithoutTax;\r\n }\r\n\r\n $scope.backInfo.type = 'Card';\r\n\r\n setTimeout(function() {\r\n $('body').addClass('loaded');\r\n }, 1000);\r\n }\r\n\r\n });\r\n }\r\n \r\n $('.newbooking-body .neworder-wrapper.newbooking a.menu-trigger').on('click', function(e){\r\n e.preventDefault();\r\n\r\n $('body').toggleClass('show-menu');\r\n })\r\n\r\n $('.shopping-cart').on('click', function(e){\r\n e.preventDefault()\r\n\r\n $(window).scrollTop(0);\r\n $('body').toggleClass('show-shopping-cart');\r\n })\r\n\r\n $('.neworder-wrapper .cart-box .cart-actions strong').on('click', function(){\r\n if ( $('.newbooking-body').is('.show-shopping-cart') ) {\r\n $('.newbooking-body').removeClass('show-shopping-cart');\r\n }\r\n })\r\n\r\n $scope.whatToWearPopup = function(){\r\n $translate('What to wear')\r\n .then(function (translatedValue) {\r\n Swal.fire({\r\n title: translatedValue,\r\n html: $scope.orderInfo.OnlineBookingWhatToWear,\r\n })\r\n });\r\n }\r\n\r\n function calcPopupHeight(){\r\n let windowHeight = $(window).height();\r\n let popupHeight = $('.login-popup .popup .section-authorize').height();\r\n\r\n if(popupHeight + 40 >= windowHeight){\r\n $('.login-popup .popup').addClass('overflowScroll');\r\n }else{\r\n $('.login-popup .popup').removeClass('overflowScroll');\r\n }\r\n }\r\n\r\n $scope.loginModal = function () {\r\n\t\t$scope.modalLoading = true;\r\n\r\n\t\t$('#login-popup').addClass('show');\r\n $('#login-popup .popup').addClass('show');\r\n calcPopupHeight();\r\n\t\t$timeout(function() {\r\n\t\t\t$scope.modalLoading = false; \r\n\t\t}, 100);\r\n }\r\n \r\n $scope.closePopup = function () {\r\n\t\t$('.popup-wrapper, #shcedule-popup .success-msg').removeClass('show');\r\n\t\t$('.popup-wrapper .popup-body').find('input').val('');\r\n\t\t$scope.formLoaded = true;\r\n\t\t$('#shcedule-popup .success-msg').removeClass('green');\r\n }\r\n\r\n $('.popup-wrapper .close, .popup-wrapper .popup-overlay').on('click', function (e) {\r\n\t\t$scope.closePopup();\r\n })\r\n\r\n function getURLParameter(name) {\r\n return decodeURI((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]);\r\n }\r\n function hideURLParams() {\r\n //Parameters to hide (ie ?success=value, ?error=value, etc)\r\n var hide = ['OrderID'];\r\n for(var h in hide) {\r\n if(getURLParameter(h)) {\r\n history.replaceState(null, document.getElementsByTagName(\"title\")[0].innerHTML, window.location.pathname);\r\n }\r\n }\r\n }\r\n\r\n $(window).on('load', function(){\r\n if ( orderID != null ) {\r\n hideURLParams();\r\n }\r\n\r\n if ($scope.Language.indexOf('bg') > -1){\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"bg\" ] );\r\n $.datepicker.setDefaults( $.datepicker.regional[ \"bg\" ] );\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1){\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"pl\" ] );\r\n $.datepicker.setDefaults( $.datepicker.regional[ \"pl\" ] );\r\n }\r\n else if ($scope.Language.indexOf('esn') > -1 || $scope.Language.indexOf('euq') > -1){\r\n // element.datepicker( \"option\", $.datepicker.regional[ \"es\" ] );\r\n $.datepicker.setDefaults( $.datepicker.regional[ \"es\" ] );\r\n }else if($scope.Language.indexOf('cat') > -1 || $scope.Language.indexOf('glc') > -1){\r\n $.datepicker.setDefaults( $.datepicker.regional[ \"ca\" ] );\r\n }\r\n else{\r\n $.datepicker.setDefaults( $.datepicker.regional[ \"\" ] );\r\n }\r\n\r\n if ( FailedPayment == false && orderID == null ) {\r\n $('body').addClass('loaded');\r\n }\r\n\r\n if( client != null ){\r\n $scope.orderInfo.FirstName = client.FirstName;\r\n $scope.orderInfo.LastName = client.LastName;\r\n $scope.orderInfo.EmergencyPhone = client.Telephone;\r\n $scope.orderInfo.Email = client.Email;\r\n \r\n let clientBirthDate = new Date(client.Birthdate);\r\n let d = ('0' + clientBirthDate.getDate()).slice(-2);\r\n let m = (clientBirthDate.getMonth() + 1).toString();\r\n let y = (clientBirthDate.getFullYear()).toString();\r\n\r\n $scope.clientBirthdayDay = d;\r\n $scope.clientBirthdayMonth = m;\r\n $scope.clientBirthdayYear = y;\r\n }\r\n }).on('resize', function(){\r\n calcPopupHeight();\r\n });\r\n\r\n function checkCartHeight(){\r\n var visibleWindowHeight = $(window).height() - 420;\r\n var cartHeight = $('.neworder-wrapper .cart-box .cart-body ul').height() + 100;\r\n\r\n if ( $(window).width() > 900 ) {\r\n if ( cartHeight > visibleWindowHeight ){\r\n $('.neworder-wrapper.newbooking .inner-wrapper .cart-box .cart-body').addClass('scroll').css('max-height', visibleWindowHeight);\r\n }else{\r\n $('.neworder-wrapper.newbooking .inner-wrapper .cart-box .cart-body').removeClass('scroll').css('max-height', 'initial');\r\n }\r\n }else{\r\n $('.neworder-wrapper.newbooking .inner-wrapper .cart-box .cart-body').removeClass('scroll').css('max-height', 'initial');\r\n }\r\n }\r\n\r\n $(window).on('load resize', function(){\r\n checkCartHeight()\r\n })\r\n\r\n}]);\r\n\r\napp.controller('GiftCardController', ['$scope', '$http', '$routeParams', '$translate', '$window', '$timeout', function ($scope, $http, $routeParams, $translate, $window, $timeout) {\r\n $scope.Language = infoData.Country;\r\n $scope.info = infoData;\r\n // $scope.info.StripePublishKey = 'pk_test_gfgN1HoPs1PhcySxOdvZ8EOW';\r\n $scope.vouchers = vouchers;\r\n $scope.cartArray = [];\r\n $scope.cartFormArray = [];\r\n $scope.totalPrice = 0; \r\n var startYear = new Date().getFullYear().toString().substr(-2);\r\n var currentYear = new Number(startYear);\r\n currentYear += 20;\r\n $scope.currentStep = 1;\r\n $scope.success = false;\r\n $scope.beyondTheOcean = false;\r\n\r\n $scope.Language = infoData.Country;\r\n \r\n if (gym) {\r\n\t\t$scope.gym = gym;\r\n\t\t$($scope.gym[0].BODYPart).prependTo('.body-scripts');\r\n $($scope.gym[0].HEADPart).appendTo(document.head);\r\n }\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('esm') > -1 || $scope.Language.indexOf('esn') > -1) {\r\n $translate.use('es')\r\n }else if($scope.Language.indexOf('cat') > -1){\r\n $translate.use('esc')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n if ($scope.Language.indexOf('ena') > -1 || $scope.Language.indexOf('enu') > -1) {\r\n $scope.beyondTheOcean = true;\r\n }\r\n\r\n\r\n $scope.text = 'me@example.com';\r\n $scope.emailFormat = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n\r\n $scope.removeByAttr = function (arr, attr, value) {\r\n var i = arr.length;\r\n while (i--) {\r\n if (arr[i]\r\n && arr[i].hasOwnProperty(attr)\r\n && (arguments.length > 2 && arr[i][attr] === value)) {\r\n arr.splice(i, 1);\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n $scope.years = [];\r\n while (startYear <= currentYear) {\r\n $scope.years.push(startYear++);\r\n }\r\n\r\n\r\n $scope.changeStep = function (n) {\r\n if ($scope.success == true) {\r\n location.reload();\r\n $scope.success = false;\r\n }\r\n\r\n $scope.currentStep = n;\r\n }\r\n\r\n $scope.getCards = function (id) {\r\n $('.vouchers .voucher[data-voucherId=\"' + id + '\"]').addClass('active');\r\n }\r\n\r\n $scope.increase = function (item) {\r\n item.quantity = parseInt(item.quantity);\r\n item.quantity = item.quantity + 1;\r\n }\r\n $scope.decrease = function (item) {\r\n item.quantity = parseInt(item.quantity);\r\n if (item.quantity > 1) {\r\n item.quantity = item.quantity - 1;\r\n }\r\n }\r\n\r\n $scope.addToCard = function (id, quantity) {\r\n var id = id;\r\n var demoresult = $.grep($scope.cartArray, function (e) { return e.VoucherID == id; });\r\n\r\n if (demoresult.length != 0) {\r\n $scope.removeByAttr($scope.cartArray, 'VoucherID', id);\r\n $scope.removeByAttr($scope.cartFormArray, 'VoucherID', id);\r\n }\r\n\r\n var result = $.grep($scope.vouchers, function (e) { return e.VoucherID == id; });\r\n result[0].Quantity = quantity;\r\n result[0].TotalPrice = quantity * result[0].Price;\r\n $scope.cartArray.push(result[0]);\r\n\r\n for (var i = 0; i < quantity; i++) {\r\n var giftCardItem = { VoucherID: result[0].VoucherID, VoucherInnerID: result[0].VoucherID + '100' + i, ToFirstName: '', ToLastName: '', ToEmail: '', SendToEmail: false, Name: result[0].Name, Price: result[0].Price };\r\n $scope.cartFormArray.push(giftCardItem);\r\n }\r\n\r\n $('.giftcardForm .box-actions').removeClass('disabled-button');\r\n\r\n $scope.makeTotal();\r\n }\r\n\r\n $scope.makeTotal = function () {\r\n $scope.totalPrice = 0;\r\n if ($scope.cartArray.length > 0) {\r\n for (var i = 0; i < $scope.cartArray.length; i++) {\r\n $scope.totalPrice += $scope.cartArray[i].TotalPrice;\r\n }\r\n }\r\n }\r\n\r\n $scope.deleteCartItem = function (id) {\r\n $scope.removeByAttr($scope.cartArray, 'VoucherID', id);\r\n $scope.removeByAttr($scope.cartFormArray, 'VoucherID', id);\r\n // $('.vouchers .voucher[data-voucherId=\"' + id + '\"]').find('.qunatity-box input').value('1');\r\n $('.vouchers .voucher[data-voucherId=\"' + id + '\"]').removeClass('active');\r\n $scope.makeTotal();\r\n\r\n if ($scope.cartArray.length < 1) {\r\n $('.giftcardForm .box-actions').addClass('disabled-button');\r\n\r\n if ($scope.currentStep == 2 || $scope.currentStep == 3) {\r\n $scope.changeStep(1);\r\n }\r\n }\r\n }\r\n\r\n $scope.deleteSingleCartItem = function (id, innerId) {\r\n var quantity = $.grep($scope.cartArray, function (e) { return e.VoucherID == id; });\r\n\r\n if ($scope.cartFormArray.length == 1) {\r\n $scope.changeStep(1);\r\n $('.giftcardForm .box-actions').addClass('disabled-button');\r\n }\r\n\r\n if (quantity[0].Quantity == 1) {\r\n $scope.removeByAttr($scope.cartArray, 'VoucherID', id);\r\n $scope.removeByAttr($scope.cartFormArray, 'VoucherID', id);\r\n } else {\r\n quantity[0].Quantity = quantity[0].Quantity - 1;\r\n quantity[0].TotalPrice = quantity[0].Quantity * quantity[0].Price;\r\n $scope.removeByAttr($scope.cartFormArray, 'VoucherInnerID', innerId);\r\n }\r\n\r\n\r\n $scope.makeTotal();\r\n }\r\n\r\n $scope.placeOrder = function (token) {\r\n if ( $scope.loading != true ) {\r\n $scope.loading = true;\r\n $('body .giftcard-wrapper .payment-form .form-actions').addClass('disabled');\r\n\r\n if ($scope.paymentType == 7) {\r\n $scope.paymentTypeProvider = \"paylogin\";\r\n }\r\n if ($scope.paymentType == 8) {\r\n $scope.paymentType = 7;\r\n $scope.paymentTypeProvider = \"credit_paydirect\";\r\n }\r\n var dateObjectOrder = { FromFirstName: $scope.fromFirstName, FromLastName: $scope.fromLastName, FromTelephone: $scope.fromTelephone, FromEmail: $scope.fromEmail, PaymentType: $scope.paymentType, Token: token, GiftCards: $scope.cartFormArray, Namespace: infoData.NameSpace, GymID: infoData.GymID, ZIP: $scope.zip, Token: token, PaymentProvider: $scope.paymentTypeProvider }\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/GiftCard/Buy',\r\n data: dateObjectOrder,\r\n dataType: 'json',\r\n headers: {\r\n \"Content-Type\": \"application/json\"\r\n }\r\n }).success(function (data) {\r\n\r\n if ((data.Error != undefined && data.Error != '') || data == \"Error\" || data == \"False\") {\r\n $('.payment-form.cbform .payment-status').html('
');\r\n if (data.Error != undefined)\r\n $('.payment-form.cbform .payment-status .error-msg').after('
' + data.Error + '
');\r\n else\r\n $('.payment-form.cbform .payment-status .error-msg').after('
There was a problem while processing the credit card! Please check all fields and credit card funds!
');\r\n\r\n $('.steps-body .step-actions button.pay').removeClass('disabled');\r\n $scope.loading = false;\r\n $('body .giftcard-wrapper .payment-form .form-actions').removeClass('disabled');\r\n $('.payment-form.cbform, .loader-container.cbform-loader').removeClass('loading');\r\n } else {\r\n if ($scope.paymentType == \"1\" || $scope.paymentType == \"5\" || $scope.paymentType == \"7\" || $scope.paymentType == \"8\") {\r\n window.location.href = data;\r\n }\r\n else {\r\n $scope.finalVouchers = data.GiftCards;\r\n $scope.success = true;\r\n\r\n $('.steps-body .step-actions button.pay').removeClass('disabled');\r\n $scope.loading = false;\r\n $('body .giftcard-wrapper .payment-form .form-actions').removeClass('disabled');\r\n $('.payment-form.cbform, .loader-container.cbform-loader').removeClass('loading');\r\n }\r\n }\r\n }).error(function () {\r\n $('.steps-body .step-actions button.pay').removeClass('disabled');\r\n $scope.loading = false;\r\n $('body .giftcard-wrapper .payment-form .form-actions').removeClass('disabled');\r\n });\r\n }\r\n }\r\n\r\n $scope.$watch('paymentType', function (v) {\r\n $scope.paymentType = v;\r\n\r\n if (v == 4) {\r\n if (!$scope.paySafeInit) {\r\n if ($scope.info.PaySafeCard == true && $scope.info.PaySafeApiKeyFrontEnd != '') {\r\n $scope.paySafeInit = true;\r\n // Base64 encoded version the Single-use Token API key.\r\n // Create the key below by concatenating the API username and password\r\n // separated by a colon and Base64-encoding the result\r\n var apiKey = $scope.info.PaySafeApiKeyFrontEnd;\r\n var Enviroment = \"TEST\";\r\n if ($scope.Enviroment == true)\r\n Enviroment = \"LIVE\";\r\n var options = {\r\n\r\n // select the Paysafe test / sandbox environment\r\n environment: Enviroment,\r\n\r\n // set the CSS selectors to identify the payment field divs above\r\n // set the placeholder text to display in these fields\r\n fields: {\r\n cardNumber: {\r\n selector: \"#cardNumber\",\r\n placeholder: \"Card number\"\r\n },\r\n expiryDate: {\r\n selector: \"#expiryDate\",\r\n placeholder: \"Expiry date\"\r\n },\r\n cvv: {\r\n selector: \"#cvv\",\r\n placeholder: \"CVV\"\r\n }\r\n }\r\n };\r\n\r\n paysafe.fields.setup(apiKey, options, function (instance, error) {\r\n document.getElementById(\"payNow\").addEventListener(\"click\", function (event) {\r\n $('body .giftcard-wrapper .payment-form .form-actions').addClass('disabled');\r\n instance.tokenize(function (instance, error, result) {\r\n if (error) {\r\n $('body .giftcard-wrapper .payment-form .form-actions').removeClass('disabled');\r\n $('.payment-status .error-msg').addClass('show').append('

' + error.message + '

');\r\n } else {\r\n $scope.placeOrder(result.token);\r\n }\r\n });\r\n }, false);\r\n });\r\n }\r\n }\r\n }\r\n else {\r\n $scope.ShowPaySafe = false;\r\n }\r\n\r\n if (v == 66) {\r\n let price = $scope.totalPrice;\r\n let finalBankPrice;\r\n finalBankPrice = price.toFixed(2).split('.').join(\"\");\r\n finalBankPrice = parseInt(finalBankPrice);\r\n\r\n var hostedPayments = SimplifyCommerce.hostedPayments(\r\n function(response) {\r\n var cardToken = response.cardToken;\r\n // TODO: Pass token to the server & use Simplify's API to make a payment\r\n $scope.placeOrder(cardToken);\r\n },\r\n {\r\n scKey: infoData.CommBankPublicApiKey,\r\n amount: finalBankPrice,\r\n operation: 'create.token',\r\n name: infoData.SubscriptionName,\r\n description: ''\r\n\r\n }\r\n ).closeOnCompletion();\r\n /**\r\n * Handle the error response from the server call that\r\n * failed to make a payment from the card token.\r\n */\r\n function apiPaymentErrorHandler() {\r\n // re-enable the payment button, so the user can try again.\r\n hostedPayments.enablePayBtn();\r\n // TODO: Handle error\r\n }\r\n\r\n $(\"#process-payment-hp\").on(\"click\", function () {\r\n $(\".giftcard-wrapper .payment-form .form-head .rb-commbankhp button\").trigger('click');\r\n })\r\n }\r\n\r\n if (v == 6) {\r\n $(\"#process-payment-btn\").on(\"click\", function () {\r\n $('body .giftcard-wrapper .payment-form .form-actions').addClass('disabled');\r\n $('.payment-form.cbform, .loader-container.cbform-loader').addClass('loading');\r\n // Generate a card token & handle the response\r\n SimplifyCommerce.generateToken({\r\n key: infoData.CommBankPublicApiKey,\r\n card: {\r\n number: $(\"#cc-number\").val(),\r\n cvc: $(\"#cc-cvc\").val(),\r\n expMonth: $(\"#cc-exp-month\").val(),\r\n expYear: $(\"#cc-exp-year\").val()\r\n }\r\n }, simplifyResponseHandler);\r\n // Prevent the form from submitting\r\n return false;\r\n });\r\n\r\n function simplifyResponseHandler(data) {\r\n var $paymentForm = $(\"#payment-form\");\r\n // Remove all previous errors\r\n $(\".error\").remove();\r\n // Check for errors\r\n if (data.error) {\r\n // Show any validation errors\r\n if (data.error.code == \"validation\") {\r\n var fieldErrors = data.error.fieldErrors,\r\n fieldErrorsLength = fieldErrors.length,\r\n errorList = \"\";\r\n for (var i = 0; i < fieldErrorsLength; i++) {\r\n errorList += \"
Field: '\" + fieldErrors[i].field +\r\n \"' is invalid - \" + fieldErrors[i].message + \"
\";\r\n }\r\n\r\n // console.log(errorList);\r\n // Display the errors\r\n $('.payment-form.cbform .payment-status').html('
');\r\n $('.payment-form.cbform .payment-status .error-msg').after('
' + errorList + '
');\r\n\r\n $('.steps-body .step-actions button.pay').removeClass('disabled');\r\n $('.payment-form.cbform, .loader-container.cbform-loader').removeClass('loading');\r\n }\r\n // Re-enable the submit button\r\n $scope.loading = false;\r\n $('body .giftcard-wrapper .payment-form .form-actions').removeClass('disabled');\r\n $(\"#process-payment-btn\").removeAttr(\"disabled\");\r\n } else {\r\n // The token contains id, last4, and card type\r\n var token = data[\"id\"];\r\n // Insert the token into the form so it gets submitted to the server\r\n $('.payment-form.cbform .payment-status').append(\"\");\r\n // Submit the form to the server\r\n\r\n $scope.placeOrder(token);\r\n // $paymentForm.get(0).submit();\r\n }\r\n }\r\n }\r\n\r\n if (v == 9) {\r\n $('#stripe-button').addClass('show');\r\n // Create a Stripe client.\r\n var stripe = Stripe($scope.info.StripePublishKey);\r\n // Create an instance of Elements.\r\n var elements = stripe.elements();\r\n // Custom styling can be passed to options when creating an Element.\r\n // (Note that this demo uses a wider set of styles than the guide below.)\r\n var style = {\r\n base: {\r\n color: '#32325d',\r\n lineHeight: '18px',\r\n fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\r\n fontSmoothing: 'antialiased',\r\n fontSize: '16px',\r\n '::placeholder': {\r\n color: '#aab7c4'\r\n }\r\n },\r\n invalid: {\r\n color: '#fa755a',\r\n iconColor: '#fa755a'\r\n }\r\n };\r\n\r\n\r\n // Create an instance of the card Element.\r\n if ($scope.currencyCode == 'EUR') {\r\n var card = elements.create('card', { style: style, hidePostalCode: true });\r\n } else {\r\n var card = elements.create('card', { style: style });\r\n }\r\n\r\n // Add an instance of the card Element into the `card-element`
.\r\n card.mount('#card-element');\r\n\r\n // Handle real-time validation errors from the card Element.\r\n card.on('change', function(event) {\r\n var displayError = document.getElementById('card-errors');\r\n if (event.error) {\r\n displayError.textContent = event.error.message;\r\n } else {\r\n displayError.textContent = '';\r\n }\r\n });\r\n\r\n // Handle form submission.\r\n var form = document.getElementById('payment-form');\r\n\r\n $('#stripe-button').on('click', function (e) {\r\n $scope.orderLoading = true;\r\n e.preventDefault();\r\n\r\n stripe.createToken(card).then(function (result) {\r\n if (result.error) {\r\n // Inform the user if there was an error.\r\n var errorElement = document.getElementById('card-errors');\r\n errorElement.textContent = result.error.message;\r\n $scope.orderLoading = false;\r\n } else {\r\n // Send the token to your server.\r\n $scope.placeOrder(result.token.id);\r\n }\r\n });\r\n\r\n })\r\n } else {\r\n $('#stripe-button').removeClass('show');\r\n }\r\n\r\n });\r\n\r\n $('.giftcard-wrapper .box-head i').on('click', function () {\r\n $('.giftcard-wrapper').toggleClass('show-cart');\r\n });\r\n\r\n $('.menu-trigger').on('click', function (e) {\r\n e.preventDefault();\r\n $('.header').toggleClass('show-menu');\r\n });\r\n\r\n $(window).on('load', function(){\r\n if (giftCard) {\r\n $timeout(() => {\r\n $scope.getCards(giftCard);\r\n $scope.giftCard = giftCard;\r\n })\r\n }\r\n })\r\n\r\n\r\n // $scope.activeStep = function(n){\r\n // $('.step').eq(n).addClass('active');\r\n\r\n // return false;\r\n // }\r\n\r\n}]);\r\n\r\napp.controller('GiftCardStatusController', ['$scope', '$http', '$routeParams', '$translate', '$window', function ($scope, $http, $routeParams, $translate, $window) {\r\n $scope.order = order;\r\n $scope.info = infoData;\r\n\r\n $scope.hrefStart = window.location.origin + '/giftcard/index?GymID=' + infoData.GymID + '&NameSpace=' + infoData.NameSpace;\r\n\r\n $scope.Language = infoData.Country;\r\n\r\n if ($scope.Language.indexOf('bg') > -1) {\r\n $translate.use('bg')\r\n }\r\n else if ($scope.Language.indexOf('esm') > -1 || $scope.Language.indexOf('esn') > -1) {\r\n $translate.use('es')\r\n }else if($scope.Language.indexOf('cat') > -1){\r\n $translate.use('esc')\r\n }\r\n else if ($scope.Language.indexOf('pl') > -1) {\r\n $translate.use('pl')\r\n }\r\n else {\r\n $translate.use('en')\r\n }\r\n\r\n if ($scope.Language.indexOf('ena') > -1 || $scope.Language.indexOf('enu') > -1) {\r\n $scope.beyondTheOcean = true;\r\n }\r\n\r\n\r\n}]);","\"use strict\";\r\n\r\napp.directive('newBookingDatepicker', function () {\r\n return {\r\n restrict: 'A',\r\n controllerAs: 'dir',\r\n scope: { date: '=newBookingDatepicker', minDate: '=minDate', offDays: '=offDays', dataLang: '=dataLang'},\r\n link: function (scope, element, attrs, ngModelCtrl) {\r\n element.datepicker( {\r\n inline: true,\r\n firstDay: 1,\r\n showOtherMonths: true,\r\n minDate: minDate,\r\n dateFormat: 'yy-mm-dd',\r\n onSelect: function (date) {\r\n scope.date = element.datepicker('getDate');\r\n scope.$apply();\r\n },\r\n });\r\n\r\n\r\n var language = attrs.lang;\r\n\r\n if (language.indexOf('bg') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"bg\" ] );\r\n }\r\n else if (language.indexOf('pl') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"pl\" ] );\r\n }\r\n else if (language.indexOf('cat') > -1 || language.indexOf('esn') > -1 || language.indexOf('euq') > -1 || language.indexOf('glc') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"es\" ] );\r\n }\r\n else{\r\n element.datepicker( \"option\", $.datepicker.regional[ \"en\" ] );\r\n }\r\n\r\n scope.date = element.datepicker('getDate');\r\n\r\n scope.$watch('minDate', function (minDate) {\r\n if (minDate === undefined) return;\r\n\r\n var dateOpt = moment.isMoment(minDate) ? minDate.toDate() : minDate;\r\n element.datepicker('option', 'minDate', dateOpt);\r\n\r\n recalculateCurrentDate();\r\n });\r\n\r\n scope.$watch('offDays', function (offDays) {\r\n if (offDays === undefined) return;\r\n\r\n element.datepicker('option', 'beforeShowDay', filterDays);\r\n recalculateCurrentDate();\r\n });\r\n\r\n function recalculateCurrentDate() {\r\n var currentDate = moment(element.datepicker('getDate'));\r\n var maxTries = 30;\r\n\r\n // Try to find the next date which is allowed by the days filter;\r\n while (!filterDays(currentDate.toDate())[0] && maxTries--) {\r\n currentDate.add(1, 'days');\r\n }\r\n element.datepicker('setDate', currentDate.toDate());\r\n scope.date = currentDate.toDate();\r\n }\r\n\r\n function filterDays(date) {\r\n if (scope.offDays == 'all' || scope.offDays === undefined) return [true, '', ''];\r\n var day = date.getDay();\r\n var dayIsAllowed = scope.offDays.indexOf(day) != -1;\r\n\r\n return [dayIsAllowed, '', ''];\r\n }\r\n }\r\n };\r\n});\r\n\r\n\r\napp.directive('jqdatepicker', function () {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function (scope, element, attrs, ngModelCtrl) {\r\n element.datepicker( {\r\n firstDay: 1,\r\n showOtherMonths: true,\r\n changeYear: true,\r\n yearRange: \"-90:+0\",\r\n dateFormat: 'mm-dd-yy',\r\n onSelect: function (date) {\r\n scope.orderInfo.bdDate = date;\r\n scope.$apply();\r\n }\r\n });\r\n\r\n var language = attrs.lang;\r\n\r\n if (language.indexOf('bg') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"bg\" ] );\r\n }\r\n else if (language.indexOf('pl') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"pl\" ] );\r\n }\r\n else if (language.indexOf('cat') > -1 || language.indexOf('esn') > -1 || language.indexOf('euq') > -1 || language.indexOf('glc') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"es\" ] );\r\n }\r\n else{\r\n element.datepicker( \"option\", $.datepicker.regional[ \"en\" ] );\r\n }\r\n\r\n }\r\n };\r\n});\r\n\r\napp.directive('jqcalendar', function () {\r\n return {\r\n restrict: 'A',\r\n controllerAs: 'dir',\r\n scope: { date: '=jqcalendar', minDate: '=minDate', offDays: '=offDays', dataLang: '=dataLang'},\r\n link: function (scope, element, attrs, ngModelCtrl) {\r\n element.datepicker( {\r\n inline: true,\r\n firstDay: 1,\r\n showOtherMonths: true,\r\n minDate: minDate,\r\n dateFormat: 'yy-mm-dd',\r\n onSelect: function (date) {\r\n scope.date = element.datepicker('getDate');\r\n scope.$apply();\r\n },\r\n });\r\n\r\n\r\n var language = attrs.lang;\r\n\r\n if (language.indexOf('bg') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"bg\" ] );\r\n }\r\n else if (language.indexOf('pl') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"pl\" ] );\r\n }\r\n else if (language.indexOf('cat') > -1 || language.indexOf('esn') > -1 || language.indexOf('euq') > -1 || language.indexOf('glc') > -1){\r\n element.datepicker( \"option\", $.datepicker.regional[ \"es\" ] );\r\n }\r\n else{\r\n element.datepicker( \"option\", $.datepicker.regional[ \"en\" ] );\r\n }\r\n\r\n scope.date = element.datepicker('getDate');\r\n\r\n scope.$watch('minDate', function (minDate) {\r\n if (minDate === undefined) return;\r\n\r\n var dateOpt = moment.isMoment(minDate) ? minDate.toDate() : minDate;\r\n element.datepicker('option', 'minDate', dateOpt);\r\n\r\n recalculateCurrentDate();\r\n });\r\n\r\n scope.$watch('offDays', function (offDays) {\r\n if (offDays === undefined) return;\r\n\r\n element.datepicker('option', 'beforeShowDay', filterDays);\r\n recalculateCurrentDate();\r\n });\r\n\r\n function recalculateCurrentDate() {\r\n var currentDate = moment(element.datepicker('getDate'));\r\n var maxTries = 30;\r\n\r\n // Try to find the next date which is allowed by the days filter;\r\n while (!filterDays(currentDate.toDate())[0] && maxTries--) {\r\n currentDate.add(1, 'days');\r\n }\r\n element.datepicker('setDate', currentDate.toDate());\r\n scope.date = currentDate.toDate();\r\n }\r\n\r\n function filterDays(date) {\r\n if (scope.offDays == 'all' || scope.offDays === undefined) return [true, '', ''];\r\n var day = date.getDay();\r\n var dayIsAllowed = scope.offDays.indexOf(day) != -1;\r\n\r\n return [dayIsAllowed, '', ''];\r\n }\r\n }\r\n };\r\n});\r\n\r\n\r\n\r\napp.directive('currency', function () {\r\n return {\r\n require: 'ngModel',\r\n\r\n link: function (elem, $scope, attrs, ngModelCtrl) {\r\n var tpl = '';\r\n\r\n var Currency = infoData.Currency;\r\n\r\n if (Currency == null)\r\n var Currency = \"$\";\r\n\r\n if (Currency == '$' || Currency == '€' || Currency == '£') {\r\n tpl = Currency + '{val}';\r\n }\r\n else {\r\n tpl = '{val} ' + Currency;\r\n }\r\n\r\n ngModelCtrl.$formatters.push(function (val) {\r\n //console.log(val)\r\n return tpl.replace('{val}', val.toFixed(2));\r\n });\r\n\r\n ngModelCtrl.$parsers.unshift(function (val) {\r\n //var regexp = new RegExp(\"\\\\\" + Currency);\r\n //console.log(val)\r\n return 666;//val.replace(regexp, '');\r\n });\r\n\r\n }\r\n }\r\n})\r\n\r\napp.directive('numbersOnly', function () {\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, element, attr, ngModelCtrl) {\r\n function fromUser(text) {\r\n if (text) {\r\n var transformedInput = text.replace(/[^0-9]/g, '');\r\n\r\n if (transformedInput !== text) {\r\n ngModelCtrl.$setViewValue(transformedInput);\r\n ngModelCtrl.$render();\r\n }\r\n return transformedInput;\r\n }\r\n return undefined;\r\n }\r\n ngModelCtrl.$parsers.push(fromUser);\r\n }\r\n };\r\n});","\"use strict\";\r\n\r\napp.filter('toTrusted', ['$sce', function ($sce) {\r\n return function (value) {\r\n return $sce.trustAsHtml(value);\r\n };\r\n}]);\r\n\r\napp.filter('toTrustedMore', ['$sce', function ($sce) {\r\n return function (value) { \r\n // var values = value.split('

');\r\n // if ( values.length > 2 ) {\r\n // var short = values[0] + values[1];\r\n // for (var i = 2; i < values.length; i++) {\r\n // if ( values[i] != undefined ){\r\n // var more = more + values[i]\r\n // }\r\n // }\r\n // return '
' + $sce.trustAsHtml(short) + '
' + $sce.trustAsHtml(more) + '
';\r\n // }else{\r\n // }\r\n return '
' + $sce.trustAsHtml(value) + '
'; \r\n };\r\n}]);\r\n\r\napp.filter('customCurrency', function () {\r\n return function (input, symbol, toInt) {\r\n\r\n if (input) //!= undefined && toInt != 1)\r\n input = parseFloat(input).toFixed(2);\r\n\r\n if (isNaN(input)) {\r\n return input;\r\n } else {\r\n var symbol = symbol || '$';\r\n\r\n if (symbol == '$' || symbol == '�' || symbol == '�') {\r\n return symbol + input;\r\n }\r\n else if (toInt == 1) {\r\n return input + symbol;\r\n }\r\n else {\r\n return input + \" \" + symbol;\r\n }\r\n }\r\n }\r\n})","/* global app */\r\n/* global infoData */\r\n\"use strict\";\r\n\r\napp.factory('dataShare', function () {\r\n var service = {};\r\n service.data = [];\r\n service.data.addons = [];\r\n service.data.products = [];\r\n service.data.client = [];\r\n service.data.orderInfo = [];\r\n\r\n return {\r\n data: {\r\n NameSpace: infoData.NameSpace,\r\n GymID: infoData.GymID\r\n },\r\n addClient: function (d) {\r\n return service.data.client.push(d);\r\n },\r\n addAddon: function (d) {\r\n return service.data.addons.push(d);\r\n },\r\n addProduct: function (d) {\r\n return service.data.products.push(d);\r\n },\r\n addData: function (d) {\r\n return service.data.push(d);\r\n },\r\n addInfo: function (d) {\r\n return service.data.orderInfo = d;\r\n },\r\n getData: function () {\r\n return service.data;\r\n }\r\n };\r\n});\r\n\r\napp.factory('getServicesAndProducts', ['$http', function ($http) {\r\n var url = new URL(window.location.href);\r\n var categoryID = url.searchParams.get(\"CategoryID\");\r\n var subCategoryID = url.searchParams.get(\"SubCategoryID\");\r\n\r\n var parameters = {\r\n NameSpace: infoData.NameSpace,\r\n GymID: infoData.GymID,\r\n CategoryID: categoryID,\r\n SubCategoryID: subCategoryID\r\n };\r\n var config = {\r\n params: parameters\r\n };\r\n\r\n var getServicesAndProducts = {\r\n async: function () {\r\n // $http returns a promise, which has a then function, which also returns a promise\r\n var promise = $http.get('/OnlineBooking/GetServicesAndProducts', config).then(function (d) {\r\n // The return value gets picked up by the then in the controller.\r\n return d.data;\r\n });\r\n // Return the promise to the controller\r\n return promise;\r\n }\r\n };\r\n return getServicesAndProducts;\r\n}]);\r\n\r\napp.factory('Backend', ['$http', function ($http) {\r\n var service = {};\r\n\r\n service.getServicesAndProductsAsync = function getServicesAndProductsAsync() {\r\n var params = {\r\n NameSpace: infoData.NameSpace,\r\n GymID: infoData.GymID\r\n };\r\n return $http.get('/OnlineBooking/GetServicesAndProducts', { params: params })\r\n .then(function success(response) {\r\n return response.data;\r\n });\r\n };\r\n\r\n service.checkConflictAsync = function checkConflictAsync(orderInfo) {\r\n return $http.post('/OnlineBooking/CheckConflictList', orderInfo)\r\n .then(function success(response) {\r\n var data = response.data;\r\n\r\n var result = {\r\n data: data\r\n };\r\n\r\n if (data === null) {\r\n result.isConflict = true;\r\n return result;\r\n }\r\n else if (Array.isArray(data) === false) {\r\n result.isConflict = true;\r\n result.limit = data;\r\n return result;\r\n }\r\n else if (data.length === 0) {\r\n result.isConflict = true;\r\n return result;\r\n }\r\n else {\r\n result.isConflict = false;\r\n return result;\r\n }\r\n });\r\n };\r\n\r\n return service;\r\n}]);","angular.\r\n module('app').\r\n component('authorization', { // This name is what AngularJS uses to match to the `` element.\r\n templateUrl: '../Frontend/CustomersPortal/src/partials/authorization.template.html',\r\n controller: ['$scope', '$http', '$translate', '$filter', '$timeout', AuthorizationController],\r\n bindings: {\r\n login: '<'\r\n }\r\n});\r\n\r\nfunction AuthorizationController($scope, $http, $translate, $filter, $timeout){\r\n if (typeof infoData !== 'undefined') {\r\n $scope.Namespace = infoData.NameSpace;\r\n $scope.GymID = infoData.GymID;\r\n }else{\r\n $scope.Namespace = namespace;\r\n $scope.GymID = gymid;\r\n }\r\n\r\n $scope.dashLogin = this.login ? this.login : false;\r\n\r\n if ( isMobile ){\r\n $scope.mobileApp = isMobile;\r\n }\r\n\r\n if (gym)\r\n $scope.gym = gym;\r\n\r\n if (learnedFrom)\r\n $scope.learnedFrom = learnedFrom\r\n\r\n var $translateThis = $filter('translate');\r\n\r\n $scope.showLogin = function () {\r\n $scope.dashLogin = true;\r\n }\r\n\r\n $scope.hideLogin = function () {\r\n $scope.dashLogin = false;\r\n }\r\n\r\n\r\n // Get Gyms\r\n getGyms = function () {\r\n var dataObject = {\r\n Namespace: $scope.Namespace\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/Membership/GetGyms',\r\n data: dataObject\r\n }).success(function (data) {\r\n $scope.membershipGyms = data;\r\n \r\n //$scope.$apply();\r\n\r\n if ($scope.membershipGyms.length == 1) {\r\n $timeout(function () {\r\n $scope.RegGymName = $scope.membershipGyms[0].GymID;\r\n })\r\n }\r\n }).error(function () {\r\n // console.log('error');\r\n });\r\n }\r\n\r\n getGyms();\r\n\r\n $scope.accRegister = function () {\r\n $scope.loading = true;\r\n $scope.currentLang = $translate.proposedLanguage() || $translate.use();\r\n var GymID = $scope.GymID;\r\n var Namespace = $scope.Namespace;\r\n var regbirthdate = $('#RegBirthdate').val();\r\n var res = regbirthdate.split(\"/\");\r\n var date = res[1] + '/' + res[0] + '/' + res[2];\r\n var intlNumber = $(\".flag-container .selected-dial-code\").html() + $('#RegPhone').val();\r\n\r\n if ($scope.gym[0].Culture == 'en-US') {\r\n date = regbirthdate;\r\n } else {\r\n date = date;\r\n }\r\n\r\n var dataObject = {\r\n RegEmail: $('#RegEmail').val(),\r\n RegPassword: $('#RegPassword').val(),\r\n RegConfirmPassword: $('#RegConfirmPassword').val(),\r\n RegFirstName: $('#RegFirstName').val(),\r\n RegLastName: $('#RegLastName').val(),\r\n Namespace: $scope.Namespace,\r\n GymID: $scope.GymID,\r\n Male: $scope.regSexRadio,\r\n Telephone: intlNumber,\r\n DivisionID: $('#RegGym').val(),\r\n Birthdate: date,\r\n LearnedFrom: $('#RegLearnedFrom').val(),\r\n WorkAddress: $('#RegWorkAddress').val(),\r\n RecommendBy: $('#RegRecommendBy').val(),\r\n\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/account/register/',\r\n data: dataObject\r\n }).success(function (data) {\r\n var data = data;\r\n\r\n if (data == 'Success') {\r\n var currentHref = window.location;\r\n var href = currentHref.origin + '/Account/ConfirmYourEmail?nameSpace=' + $scope.Namespace + '&gymId=' + $scope.GymID;\r\n if ( isMobile == true ) {\r\n href += '&isMobile=true';\r\n } \r\n\r\n window.location.replace(href);\r\n } else {\r\n var n = data.search(\"com is already taken\");\r\n\r\n if (n > 0) {\r\n var translated = $translateThis('User Taken');\r\n $('.validation-errors').html('

' + translated + '

');\r\n } else {\r\n var res = data.split(\".\");\r\n\r\n if (res.length > 2) {\r\n $('.validation-errors').html('
');\r\n for (var i = 0; i < res.length - 1; i++) {\r\n var msg = res[i] + '.';\r\n var translated = $translateThis(msg);\r\n $('.validation-errors .section-valid').append('

' + translated + '

');\r\n }\r\n } else {\r\n var translated = $translateThis(data);\r\n $('.validation-errors').html('

' + translated + '

');\r\n }\r\n }\r\n }\r\n $scope.loading = false;\r\n\r\n }).error(function () {\r\n // console.log('error');\r\n });\r\n };\r\n\r\n $scope.accLogin = function () {\r\n\r\n $scope.loading = true;\r\n var gymid = $('#accGymID').val();\r\n var namespace = $('#Namespace').val();\r\n\r\n var email = $('#Email').val();\r\n email = email.replace(/ /g,'');\r\n var password = $('#Password').val();\r\n var rememberme = $('#rememberMe').val();\r\n\r\n var dataObject = {\r\n Email: email,\r\n Password: password,\r\n RememberMe: rememberme,\r\n Namespace: namespace,\r\n GymID: gymid\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/account/login/',\r\n data: dataObject\r\n }).success(function (data) {\r\n var data = data;\r\n var currentHref = window.location;\r\n var href = currentHref.origin + '/Account/Dashboard?nameSpace=' + namespace + '&gymId=' + gymid;\r\n\r\n if (data == 'Success') {\r\n window.location.reload();\r\n } else {\r\n var translated = $translateThis(data);\r\n $('.validation-errors').html('

' + translated + '

');\r\n }\r\n $scope.loading = false;\r\n\r\n }).error(function () {\r\n // console.log('error');\r\n });\r\n };\r\n\r\n\r\n function setCookie(key, value) {\r\n var val = value;\r\n var expires = new Date();\r\n expires.setTime(expires.getTime() + (1 * 24 * 60 * 60 * 1000));\r\n document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/';\r\n if (val != \"true\") {\r\n $('body').addClass('pound-currency');\r\n } else {\r\n $('body').removeClass('pound-currency');\r\n }\r\n }\r\n\r\n function getCookie(key) {\r\n var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');\r\n return keyValue ? keyValue[2] : null;\r\n }\r\n\r\n var today = new Date();\r\n var datepicker = $('#RegBirthdate');\r\n var lastDate = getCookie('setDate');\r\n\r\n datepicker.datepicker({\r\n changeMonth: true,\r\n changeYear: true,\r\n yearRange: \"1920:2040\",\r\n numberOfMonths: 1,\r\n onSelect: function (dateText, inst) {\r\n $scope.currentLang = $translate.proposedLanguage() || $translate.use();\r\n var date = $(this).val();\r\n\r\n if ($scope.gym[0].Culture != 'en-US') {\r\n var res = date.split(\"/\");\r\n var date = res[1] + '/' + res[0] + '/' + res[2];\r\n }\r\n $scope.cardStartDate = new Date(date);\r\n $scope.membershipStartDate = $scope.cardStartDate;\r\n\r\n if ($('.section-authorize').length && !$('#RegBirthdayVal').is(':checked')) {\r\n $('#RegBirthdayVal').trigger('click');\r\n }\r\n \r\n if ( $('.onepage-wrapper').length ) {\r\n $scope.theChoosenMembershipDate = $scope.cardStartDate;\r\n }\r\n $scope.$apply();\r\n }\r\n });\r\n $scope.currentLang = $translate.proposedLanguage() || $translate.use();\r\n\r\n if ($('.section-authorize').length) {\r\n datepicker.datepicker(\"option\", \"maxDate\", 0);\r\n }\r\n\r\n datepicker.next('i').on('click', function () {\r\n datepicker.datepicker('show');\r\n });\r\n\r\n\r\n if ($scope.currentLang == 'en') {\r\n datepicker.datepicker(\"option\", $.datepicker.regional['en']);\r\n }else if ($scope.currentLang == 'es' || $scope.currentLang == 'esc'){\r\n datepicker.datepicker(\"option\", $.datepicker.regional['es']);\r\n }else {\r\n datepicker.datepicker(\"option\", $.datepicker.regional['bg']);\r\n }\r\n\r\n if ( $scope.gym[0].Culture == 'en-US' ) {\r\n datepicker.datepicker(\"option\", \"dateFormat\", 'mm/dd/yy');\r\n }else{\r\n datepicker.datepicker(\"option\", \"dateFormat\", 'dd/mm/yy');\r\n }\r\n\r\n $(window).on('load', function () {\r\n\r\n let phoneLang = $scope.currentLang;\r\n if($scope.currentLang == 'en'){\r\n phoneLang = 'us';\r\n }else if($scope.currentLang == 'esc'){\r\n phoneLang = 'es';\r\n }\r\n\r\n $('#RegPhone').intlTelInput({\r\n autoHideDialCode: false,\r\n preferredCountries: [phoneLang],\r\n separateDialCode: true\r\n });\r\n });\r\n}","/* global moment, _ */\r\n/* global infoData */\r\n\r\n$(document).ready(function () {\r\n $('.modal').modal('show');\r\n});\r\n\r\nDate.prototype.addHours = function (h) {\r\n //this.setHours(this.getHours() + h);\r\n this.setTime(this.getTime() + (h * 60 * 60 * 1000));\r\n return this;\r\n};\r\n\r\nfunction insertString(a, at) {\r\n var start = 1,\r\n tokens = a.split(at);\r\n\r\n var temp = '';\r\n\r\n if (tokens[2]) {\r\n temp = \"
\" + tokens[1] + \"
\" + tokens[2] + \"
\";\r\n } else if (tokens[1]) {\r\n temp = \"
\" + tokens[1] + \"
\";\r\n } else {\r\n temp = \"
\";\r\n }\r\n\r\n return temp;\r\n}\r\n\r\nfunction addZero(i) {\r\n if (i < 10) {\r\n i = \"0\" + i;\r\n }\r\n return i;\r\n}\r\n\r\nfunction getHours(h, date) {\r\n //h = '10:00, 11:00, 12:00, 10:30, 11:30, 12:30'\r\n var hours = h.split(',');\r\n\r\n var newDates = _.map(hours, function (hour) {\r\n return newDate = new Date('01/01/2011 ' + hour);\r\n });\r\n\r\n newDates.sort(function (a, b) {\r\n return a - b;\r\n });\r\n\r\n hours = _.map(newDates, function (date) {\r\n return newDate = moment(date).format('HH:mm');\r\n });\r\n\r\n if (infoData.Country.indexOf('enu') > -1 || infoData.Country.indexOf('ius') > -1) {\r\n hours = getUSHours(hours);\r\n }\r\n return hours;\r\n}\r\n\r\nfunction getHoursArr(h, date) {\r\n\r\n var hours = h;\r\n\r\n var newDates = _.map(hours, function (hour) {\r\n return newDate = new Date('01/01/2011 ' + hour);\r\n });\r\n\r\n newDates.sort(function (a, b) {\r\n return a - b;\r\n });\r\n\r\n hours = _.map(newDates, function (date) {\r\n return newDate = moment(date).format('HH:mm');\r\n });\r\n\r\n if (infoData.Country.indexOf('enu') > -1 || infoData.Country.indexOf('ius') > -1) {\r\n hours = getUSHours(hours);\r\n }\r\n return hours;\r\n}\r\n\r\nfunction getUSHours(hours) {\r\n return _.map(hours, function (hour) {\r\n return moment(hour, 'HH:mm').format('hh:mm a');\r\n });\r\n}\r\n\r\nfunction parseLocation(location) {\r\n var pairs = location.substring(1).split(\"&\");\r\n var obj = {};\r\n var pair;\r\n var i;\r\n\r\n for (i in pairs) {\r\n if (pairs[i] === \"\") continue;\r\n\r\n pair = pairs[i].split(\"=\");\r\n obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\r\n }\r\n\r\n return obj;\r\n}\r\n\r\nvar params = parseLocation(window.location.search);\r\n\r\nfunction reload() {\r\n location.reload();\r\n}\r\n\r\nfunction getTime(h) {\r\n var timeArea = '';\r\n var t = '';\r\n\r\n if (h.indexOf('am') > -1) {\r\n timeArea = 'am';\r\n } else if(h.indexOf('pm') > -1){\r\n timeArea = 'pm';\r\n } \r\n\r\n var time = h.substring(0, 5);\r\n time = time.split(\":\");\r\n\r\n if(timeArea != 'pm'){\r\n t = time[0] + \":\" + time[1];\r\n } else if (timeArea == 'pm') {\r\n if (parseInt(time[0]) == 12)\r\n time[0] = 0;\r\n\r\n time[0] = parseInt(time[0]) + 12;\r\n t = time[0] + \":\" + time[1];\r\n }\r\n\r\n return t;\r\n}\r\n\r\nfunction formatInvitationLinks(l) {\r\n if(l != null )\r\n var links = l.split(',');\r\n\r\n return links;\r\n}"],"sourceRoot":"/source/"}