{"version":3,"sources":["functions.src.js"],"names":["smCalendarWidget","initialLoad","selectedStartTime","selectedEndTime","settings","initialCss","addInlineCss","loadCss","primaryColour","undefined","borderColour","css","LightenDarkenColor","excludeBootstrapGrid","gridCss","document","createElement","rel","type","href","scriptUrl","getElementsByTagName","appendChild","styles","styleSheet","cssText","createTextNode","initLocationSettings","requestDate","Date","toJSON","earliestAvailableStart","jobMins","locationData","apiKey","locationId","currentDateTime","bayIds","existingLoadingWrapper","getElementById","loadingWrapper","buildElement","languageCulture","updateSettingProperty","buildLoadingScreen","serviceWidget","classList","remove","postAjax","initServiceSettings","serviceData","widgetConfigId","buildService","wrapper","buildHiddenField","serviceTimeEstimate","jobSheetTemplateId","autoSendToCustomer","serviceWrapper","serviceRow","serviceIcon","serviceIconWrapper","serviceInner","serviceName","serviceDescription","servicePrice","formRow","buildTextField","smLangTranslate","includeCustomerAddressFields","buildButton","createWidgetContainer","loaderId","loaderContainer","buildWidget","currentWeekNo","GetWeekNumber","numberOfWeeksToDisplay","weeksToPopulate","weeksToDisplay","daysForLatestBooking","GetMaxWeeks","i","push","step1","activeStep","add","returnBtn","GetSVGMarkup","setAttribute","GenerateAvailableWeeks","continueBtnContainer","continueMsg","insertBefore","firstChild","showOperatingHours","operatingHoursDisplay","buildOperatingHoursDisplay","buildErrorMessage","errorText","today","setHours","inactiveDates","querySelectorAll","projXtimer","forEach","element","getAttribute","initAjax","addEventListener","contains","date","refreshTimeSlot","initCustomerInfoSubmission","querySelector","requiredFields","customerEmailAddress","value","test","alert","missingFields","length","textContent","join","initSlotSelection","removeAttribute","selectedCustomSlotId","selectedDate","timeSlot","toLocaleTimeString","hour","minute","innerHTML","toLocaleDateString","weekday","year","month","day","selectedSlotFromOutputId","selectedSlotToOutputId","fireEvent","clearTimeout","minsToResetSelection","setTimeout","resetForm","initBookingSubmission","step1Return","returnToStep","completeOrderBtn","completeBtnText","disabled","addPriceDescription","bookingData","BayIds","BookingSource","Description","PreferredStartDateTime","PreferredEndDateTime","CustomBookingSlotId","TimeEstimate","JobSheetTemplateId","AutoSendToCustomer","RegistrationNo","SlotType","slotType","ForceTimeSlotAllocation","forceTimeSlotAllocation","CustomerDetails","FirstName","LastName","Email","PhoneNumber","BookingDetails","PriceExVAT","servicePriceSolus","PriceIncVAT","AddressLine1","AddressLine2","Town","County","Postcode","init","config","this","widgetMinsToReset","minsToReset","setInterval","calendarWrapper","previousSelectedDate","intervalMins","data","QueryDate","JobMins","IntervalMins","IgnoreJobAvailability","ignoreJobAvailability","timeSlotContainer","continueBtn","loader","alterElementsClassList","getSelectedDate","selectedSlot","getSelectedStartTime","getSelectedEndTime","isValid","on","event","callback","eventContainer","container","availableWeeks","item","index","visibilityClass","singleColumn","weekCol","weekTitleContainer","GenerateWeekChangeButton","weekTitle","weekNo","useWeekNumbers","availableDates","GenerateWeekAvailableDates","startDate","children","endDate","innerText","isPrev","weeksToPopulateLength","button","weekToPopulate","dateContainer","dateRange","GetDateRangeOfWeek","split","weekdays","smLangGetWeekdays","months","smLangGetMonths","gmsEarliestAvailableDate","gmsEarliestAvailableStart","toDateString","earliestAvailableDate","maxDate","d","setDate","getDate","dateFormatted","getFullYear","prependZero","getMonth","dateSelector","currentDate","loopDate","id","daysOfWeekClosed","indexOf","getDay","datesToExclude","Array","isArray","n","d1","numOfdaysPastSinceLastMonday","eval","weekNoToday","weeksInTheFuture","rangeIsFrom","rangeIsTo","d2","initChangeWeeks","parseInt","closest","advanceWeek","decreaseWeek","selectedWeek","nextWeek","previousWeek","adjustClassList","action","className","elements","classToUpdate","additionalClasses","col","amt","num","toString","UTC","setUTCDate","getUTCDate","getUTCDay","yearStart","getUTCFullYear","Math","ceil","textToTranslate","isInteger","hiddenInput","displayName","required","description","fieldContainer","text","buttonInner","elementType","classes","newStep","step2","existingContainer","settingsContainer","defaultContainerId","body","url","request","XMLHttpRequest","open","setRequestHeader","onerror","xhr","console","log","responseText","onload","serviceSettingsSuccess","response","locationSettingsSuccess","timeSlotSuccess","bookingSuccess","onloadend","timeSlotDone","bookingDone","send","JSON","stringify","obj","parse","StatusResult","Success","ContainerId","PrimaryColour","ServiceName","ServiceIcon","ServicePrice","ServicePriceSolus","SingleColumn","IncludeCustomerAddressFields","EarliestAvailableDate","WidgetWeeksToDisplay","WidgetMinsToReset","WidgetDefaultDay","DaysOfWeekClosed","UseWeekNumbers","ShowAllDayOption","ShowOperatingHours","OperatingHoursDisplay","ShowSlotEnd","allDayTitleOverride","allDayTextOverride","AllDayDisplayText","selectDefaultDay","timeSlotRow","allDayCol","allDayText","AvailabilityItems","displayAsNoResults","timeSlotTitle","timeSlotTitleInner","timeSlotTitleDate","allDayStart","DayOpeningTime","allDayEnd","DayClosingTime","StartTime","showSlotEnd","EndTime","timeSlotCol","startTime","slotStartTime","setMinutes","getMinutes","timeSlotRadioContainer","LocationCustomBookingSlotId","showAllDayOption","allDayOnly","isToday","toLowerCase","allDayRadioContainer","allDayTitleText","allDayDisplayText","eventName","dispatchEvent","CustomEvent","detail","selectPreviousSlot","hasSlot","slotDateDisplay","slotTimeDisplay","orderReference","confirmationWrapper","JobSheet","SlotStart","slotDate","JobSheetId","confirmationInner","confirmationRow","buildOrderConfirmationMessage","slots","defaultDay","currentWeek","diffTime","abs","el","availableDate","diffDays","weekDifference","click","previousTimeSlot","name","updatedValue","forceUpdate","slotTime","orderRef","confirmationMsg","operatingHours","operatingHoursObj","dayOperatingHours","buildOperatingHoursDay","DayOfWeek","Start","End","Closed","dayOfWeek","start","end","closed","slice"],"mappings":"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kBACX,IAAK,iBACD,MAAO,kBACX,IAAK,iBACD,MAAO,kBACX,IAAK,YACD,MAAO,QACX,IAAK,kBACD,MAAO,kBACX,IAAK,oBACD,MAAO,MACX,IAAK,4DACD,MAAO,sDACX,IAAK,8DACD,MAAO,0EACX,IAAK,wDACD,MAAO,4CACX,IAAK,6BACD,MAAO,+BACX,IAAK,cACD,MAAO,WACX,IAAK,0BACD,MAAO,+BACX,IAAK,sDACD,MAAO,2DACX,IAAK,uBACD,MAAO,4BACX,IAAK,SACD,MAAO,UACX,IAAK,gEACD,MAAO,uEACX,IAAK,+BACD,MAAO,mCACX,IAAK,wBACD,MAAO,0BACX,IAAK,sGACD,MAAO,0GAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,OACX,IAAK,uBACD,MAAO,mBACX,IAAK,mBACD,MAAO,0BACX,IAAK,qGACD,MAAO,6FACX,IAAK,qCACD,MAAO,kCACX,IAAK,OACD,MAAO,OACX,IAAK,4FACD,MAAO,4FACX,IAAK,wBACD,MAAO,oBACX,IAAK,mBACD,MAAO,eACX,IAAK,iBACD,MAAO,gBACX,IAAK,uDACD,MAAO,2DACX,IAAK,yDACD,MAAO,4DACX,IAAK,8BACD,MAAO,qCACX,IAAK,mBACD,MAAO,kBACX,IAAK,aACD,MAAO,YACX,IAAK,UACD,MAAO,UACX,IAAK,aACD,MAAO,UACX,IAAK,YACD,MAAO,YACX,IAAK,gBACD,MAAO,gBACX,IAAK,aACD,MAAO,cACX,IAAK,mBACD,MAAO,sBACX,IAAK,iBACD,MAAO,kBACX,IAAK,iBACD,MAAO,iBACX,IAAK,YACD,MAAO,KACX,IAAK,kBACD,MAAO,cACX,IAAK,oBACD,MAAO,aACX,IAAK,4DACD,MAAO,yDACX,IAAK,8DACD,MAAO,6DACX,IAAK,wDACD,MAAO,uDACX,IAAK,6BACD,MAAO,8BACX,IAAK,cACD,MAAO,cACX,IAAK,0BACD,MAAO,wBACX,IAAK,sDACD,MAAO,6DACX,IAAK,uBACD,MAAO,6BACX,IAAK,SACD,MAAO,SACX,IAAK,gEACD,MAAO,wEACX,IAAK,+BACD,MAAO,wBACX,IAAK,wBACD,MAAO,uBACX,IAAK,sGACD,MAAO,kGAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,SACX,IAAK,uBACD,MAAO,yBACX,IAAK,mBACD,MAAO,4BACX,IAAK,qGACD,MAAO,kIACX,IAAK,qCACD,MAAO,2CACX,IAAK,OACD,MAAO,QACX,IAAK,4FACD,MAAO,yHACX,IAAK,wBACD,MAAO,wBACX,IAAK,mBACD,MAAO,qBACX,IAAK,iBACD,MAAO,yBACX,IAAK,uDACD,MAAO,yEACX,IAAK,yDACD,MAAO,yEACX,IAAK,8BACD,MAAO,+BACX,IAAK,mBACD,MAAO,sBACX,IAAK,aACD,MAAO,mBACX,IAAK,UACD,MAAO,UACX,IAAK,aACD,MAAO,UACX,IAAK,YACD,MAAO,WACX,IAAK,gBACD,MAAO,kBACX,IAAK,aACD,MAAO,eACX,IAAK,mBACD,MAAO,sBACX,IAAK,iBACD,MAAO,oBACX,IAAK,iBACD,MAAO,gBACX,IAAK,YACD,MAAO,YACX,IAAK,kBACD,MAAO,oBACX,IAAK,oBACD,MAAO,mBACX,IAAK,4DACD,MAAO,kEACX,IAAK,8DACD,MAAO,2FACX,IAAK,wDACD,MAAO,uDACX,IAAK,6BACD,MAAO,8BACX,IAAK,cACD,MAAO,aACX,IAAK,0BACD,MAAO,2BACX,IAAK,sDACD,MAAO,yDACX,IAAK,uBACD,MAAO,uCACX,IAAK,SACD,MAAO,gBACX,IAAK,gEACD,MAAO,8FACX,IAAK,+BACD,MAAO,+BACX,IAAK,wBACD,MAAO,6BACX,IAAK,sGACD,MAAO,oIAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,UACX,IAAK,uBACD,MAAO,0BACX,IAAK,mBACD,MAAO,kCACX,IAAK,qGACD,MAAO,+GACX,IAAK,qCACD,MAAO,kDACX,IAAK,OACD,MAAO,MACX,IAAK,4FACD,MAAO,qHACX,IAAK,wBACD,MAAO,+BACX,IAAK,mBACD,MAAO,uBACX,IAAK,iBACD,MAAO,iBACX,IAAK,uDACD,MAAO,mEACX,IAAK,yDACD,MAAO,4DACX,IAAK,8BACD,MAAO,qCACX,IAAK,mBACD,MAAO,mBACX,IAAK,aACD,MAAO,cACX,IAAK,UACD,MAAO,UACX,IAAK,aACD,MAAO,SACX,IAAK,YACD,MAAO,WACX,IAAK,gBACD,MAAO,kCACX,IAAK,aACD,MAAO,2BACX,IAAK,mBACD,MAAO,qBACX,IAAK,iBACD,MAAO,oBACX,IAAK,iBACD,MAAO,oBACX,IAAK,YACD,MAAO,gBACX,IAAK,kBACD,MAAO,iBACX,IAAK,oBACD,MAAO,gBACX,IAAK,4DACD,MAAO,uDACX,IAAK,8DACD,MAAO,+DACX,IAAK,wDACD,MAAO,sDACX,IAAK,6BACD,MAAO,kCACX,IAAK,cACD,MAAO,cACX,IAAK,0BACD,MAAO,gCACX,IAAK,sDACD,MAAO,0DACX,IAAK,uBACD,MAAO,8BACX,IAAK,SACD,MAAO,UACX,IAAK,gEACD,MAAO,yEACX,IAAK,+BACD,MAAO,2BACX,IAAK,wBACD,MAAO,wBACX,IAAK,sGACD,MAAO,qIAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,UACX,IAAK,uBACD,MAAO,kBACX,IAAK,mBACD,MAAO,cACX,IAAK,qGACD,MAAO,0FACX,IAAK,qCACD,MAAO,6BACX,IAAK,OACD,MAAO,QACX,IAAK,4FACD,MAAO,+EACX,IAAK,wBACD,MAAO,oBACX,IAAK,mBACD,MAAO,mBACX,IAAK,iBACD,MAAO,aACX,IAAK,uDACD,MAAO,2CACX,IAAK,yDACD,MAAO,+CACX,IAAK,8BACD,MAAO,0BACX,IAAK,mBACD,MAAO,qBACX,IAAK,aACD,MAAO,eACX,IAAK,UACD,MAAO,YACX,IAAK,aACD,MAAO,UACX,IAAK,YACD,MAAO,WACX,IAAK,gBACD,MAAO,mBACX,IAAK,aACD,MAAO,qBACX,IAAK,mBACD,MAAO,kBACX,IAAK,iBACD,MAAO,eACX,IAAK,iBACD,MAAO,eACX,IAAK,YACD,MAAO,WACX,IAAK,kBACD,MAAO,WACX,IAAK,oBACD,MAAO,cACX,IAAK,4DACD,MAAO,oCACX,IAAK,8DACD,MAAO,yDACX,IAAK,wDACD,MAAO,8DACX,IAAK,6BACD,MAAO,qBACX,IAAK,cACD,MAAO,SACX,IAAK,0BACD,MAAO,sBACX,IAAK,sDACD,MAAO,uDACX,IAAK,uBACD,MAAO,4BACX,IAAK,SACD,MAAO,WACX,IAAK,gEACD,MAAO,uEACX,IAAK,+BACD,MAAO,6BACX,IAAK,wBACD,MAAO,0BACX,IAAK,sGACD,MAAO,kGAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,cACX,IAAK,uBACD,MAAO,6BACX,IAAK,mBACD,MAAO,wBACX,IAAK,qGACD,MAAO,maACX,IAAK,qCACD,MAAO,iDACX,IAAK,OACD,MAAO,MACX,IAAK,4FACD,MAAO,+HACX,IAAK,wBACD,MAAO,kCACX,IAAK,mBACD,MAAO,8BACX,IAAK,iBACD,MAAO,wBACX,IAAK,uDACD,MAAO,qFACX,IAAK,yDACD,MAAO,4EACX,IAAK,8BACD,MAAO,iCACX,IAAK,mBACD,MAAO,uBACX,IAAK,aACD,MAAO,kBACX,IAAK,UACD,MAAO,YACX,IAAK,aACD,MAAO,SACX,IAAK,YACD,MAAO,iBACX,IAAK,gBACD,MAAO,iBACX,IAAK,aACD,MAAO,qBACX,IAAK,mBACD,MAAO,0BACX,IAAK,iBACD,MAAO,YACX,IAAK,iBACD,MAAO,YACX,IAAK,YACD,MAAO,QACX,IAAK,kBACD,MAAO,iBACX,IAAK,oBACD,MAAO,cACX,IAAK,4DACD,MAAO,4EACX,IAAK,8DACD,MAAO,yFACX,IAAK,wDACD,MAAO,mEACX,IAAK,6BACD,MAAO,+BACX,IAAK,cACD,MAAO,cACX,IAAK,0BACD,MAAO,kCACX,IAAK,sDACD,MAAO,6DACX,IAAK,uBACD,MAAO,qCACX,IAAK,SACD,MAAO,SACX,IAAK,gEACD,MAAO,gFACX,IAAK,+BACD,MAAO,gCACX,IAAK,wBACD,MAAO,kCACX,IAAK,sGACD,MAAO,0HAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,OACX,IAAK,uBACD,MAAO,gCACX,IAAK,mBACD,MAAO,gBACX,IAAK,qGACD,MAAO,wHACX,IAAK,qCACD,MAAO,+CACX,IAAK,OACD,MAAO,YACX,IAAK,4FACD,MAAO,sGACX,IAAK,wBACD,MAAO,wBACX,IAAK,mBACD,MAAO,qBACX,IAAK,iBACD,MAAO,kBACX,IAAK,uDACD,MAAO,qDACX,IAAK,yDACD,MAAO,+DACX,IAAK,8BACD,MAAO,8BACX,IAAK,mBACD,MAAO,kBACX,IAAK,aACD,MAAO,eACX,IAAK,UACD,MAAO,UACX,IAAK,aACD,MAAO,aACX,IAAK,YACD,MAAO,aACX,IAAK,gBACD,MAAO,YACX,IAAK,aACD,MAAO,aACX,IAAK,mBACD,MAAO,qBACX,IAAK,iBACD,MAAO,WACX,IAAK,iBACD,MAAO,YACX,IAAK,YACD,MAAO,QACX,IAAK,kBACD,MAAO,kBACX,IAAK,oBACD,MAAO,eACX,IAAK,4DACD,MAAO,uDACX,IAAK,8DACD,MAAO,kEACX,IAAK,wDACD,MAAO,gDACX,IAAK,6BACD,MAAO,2BACX,IAAK,cACD,MAAO,SACX,IAAK,0BACD,MAAO,+BACX,IAAK,sDACD,MAAO,iDACX,IAAK,uBACD,MAAO,8BACX,IAAK,SACD,MAAO,QACX,IAAK,gEACD,MAAO,mFACX,IAAK,+BACD,MAAO,iCACX,IAAK,wBACD,MAAO,2BACX,IAAK,sGACD,MAAO,sGAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,aACX,IAAK,uBACD,MAAO,yBACX,IAAK,mBACD,MAAO,2BACX,IAAK,qGACD,MAAO,+XACX,IAAK,qCACD,MAAO,mBACX,IAAK,OACD,MAAO,MACX,IAAK,4FACD,MAAO,+GACX,IAAK,wBACD,MAAO,6BACX,IAAK,mBACD,MAAO,uBACX,IAAK,iBACD,MAAO,oBACX,IAAK,uDACD,MAAO,0FACX,IAAK,yDACD,MAAO,uFACX,IAAK,8BACD,MAAO,mCACX,IAAK,mBACD,MAAO,0BACX,IAAK,aACD,MAAO,kBACX,IAAK,UACD,MAAO,UACX,IAAK,aACD,MAAO,OACX,IAAK,YACD,MAAO,UACX,IAAK,gBACD,MAAO,SACX,IAAK,aACD,MAAO,YACX,IAAK,mBACD,MAAO,mBACX,IAAK,iBACD,MAAO,oBACX,IAAK,iBACD,MAAO,oBACX,IAAK,YACD,MAAO,QACX,IAAK,kBACD,MAAO,YACX,IAAK,oBACD,MAAO,MACX,IAAK,4DACD,MAAO,kDACX,IAAK,8DACD,MAAO,8FACX,IAAK,wDACD,MAAO,0DACX,IAAK,6BACD,MAAO,wCACX,IAAK,cACD,MAAO,WACX,IAAK,0BACD,MAAO,gCACX,IAAK,sDACD,MAAO,0DACX,IAAK,uBACD,MAAO,yCACX,IAAK,SACD,MAAO,SACX,IAAK,gEACD,MAAO,0GACX,IAAK,+BACD,MAAO,mCACX,IAAK,wBACD,MAAO,kCACX,IAAK,sGACD,MAAO,qFAEnB,IAAK,QACD,OAAQA,GACJ,IAAK,QACD,MAAO,OACX,IAAK,uBACD,MAAO,2BACX,IAAK,mBACD,MAAO,mBACX,IAAK,qGACD,MAAO,gGACX,IAAK,qCACD,MAAO,kCACX,IAAK,OACD,MAAO,OACX,IAAK,4FACD,MAAO,6EACX,IAAK,wBACD,MAAO,sBACX,IAAK,mBACD,MAAO,gBACX,IAAK,iBACD,MAAO,qBACX,IAAK,uDACD,MAAO,0DACX,IAAK,yDACD,MAAO,8DACX,IAAK,8BACD,MAAO,mCACX,IAAK,mBACD,MAAO,kBACX,IAAK,aACD,MAAO,eACX,IAAK,UACD,MAAO,WACX,IAAK,aACD,MAAO,UACX,IAAK,YACD,MAAO,YACX,IAAK,gBACD,MAAO,eACX,IAAK,aACD,MAAO,cACX,IAAK,mBACD,MAAO,sBACX,IAAK,iBACD,MAAO,iBACX,IAAK,iBACD,MAAO,iBACX,IAAK,YACD,MAAO,KACX,IAAK,kBACD,MAAO,gBACX,IAAK,oBACD,MAAO,aACX,IAAK,4DACD,MAAO,+DACX,IAAK,8DACD,MAAO,qFACX,IAAK,wDACD,MAAO,sDACX,IAAK,6BACD,MAAO,gCACX,IAAK,cACD,MAAO,aACX,IAAK,0BACD,MAAO,8BACX,IAAK,sDACD,MAAO,qDACX,IAAK,uBACD,MAAO,0BACX,IAAK,SACD,MAAO,SACX,IAAK,gEACD,MAAO,0EACX,IAA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","file":"functions.js","sourcesContent":["var smCalendarWidget = (function () {\r\n\r\n var initialLoad = true;\r\n var selectedStartTime;\r\n var selectedEndTime;\r\n var settings;\r\n\r\n /* Settings Options\r\n * Here is an example of how to create the calendar widget with all options*/\r\n /*\r\n smCalendarWidget.init({\r\n // These fields are required \r\n scriptUrl: 'https://projectx-devtest.azurewebsites.net', // The Url of for the environment. Used for looking up CSS and Ajax calls \r\n apiKey: '00000000-0000-0000-0000-000000000000', // API Key, used for security\r\n locationId: 1, // Location Id of the calendar involved. API Key must have access\r\n container: \"calendar-container\", // The Id of a div to place the widget inside\r\n primaryColour: \"#123456\", // The primary colour of the widget to help blend it into a theme\r\n \r\n // These fields are recommended\r\n selectedSlotFromOutputId: 'BookingSlot_SlotFrom', // When a slot is picked, the value of the slot start time will be passed into a div with this Id.\r\n selectedSlotToOutputId: 'BookingSlot_SlotTo', // When a slot is picked, the value of the slot end time will be passed into a div with this Id.\r\n jobMins: 60, // The length of time that this job will take to complete. Used for getting an appropriate booking slot. Defaults to 60.\r\n intervalMins: 60, // The time difference between each slot offered, typically 15, 30 or 60 min. Defaults to 60.\r\n bayIds: [], // Restrict availability to specific bays by adding bay ids, separated by a comma here. e.g. [1, 2, 3]\r\n \r\n // These fields are controlled by the Location Settings, but can be overriden\r\n weeksToDisplay: 4, // Optional, determines the number of weeks in advance that a booking can be made. Defaults to settings in the calendar system.\r\n daysOfWeekClosed: [0, 1], // Optional, days of the week that the calendar does not work. Defaults to settings in the calendar system\r\n minsToReset: 4 * 60, // Optional, after this number of minutes after loading, the widget will reset itself. This prevents a date being selected for too long. Defaults to 4 hours.\r\n minsToResetSelection: 10, // Optional, after selecting a booking slot, a timer will begin and the widget will be reset after this number of minutes\r\n defaultDay: 1, // Optional, the number of days in advance of today to be selectable\r\n useWeekNumbers: false, // Optional, this will instead display the week no (e.g. Week 1) instead of the date range (e.g. 1 Jan - 7 Jan)\r\n \r\n // These fields are optional\r\n serviceWidget: false, // Optional, determines whether an intermediary step to provide customer info exists w/ a service-centric view\r\n widgetConfigId: 1, // Optional, Id for the service widget config (needs serviceWidget to be \"true\") -- required if using the service widget\r\n showSlotEnd: true, // Optional, show the time slot expected finish time - may cause issues for centres so by default is false\r\n languageCulture: 'sv-SE', // Optional, change the text used within the system. Defaults to en-GB\r\n earliestAvailableStart: '2020-10-14T11:00', // Optional, prevent any bookings earlier than this date/time\r\n daysForLatestBooking: 28, // Optional, sets the number of days from 'today' to allow a booking. Requires a minimum value of 7.\r\n datesToExclude: ['2020-10-16', '2020-10-20'], // Optional, prevent any bookings on this particular dates\r\n singleColumn: true, // Optional, when true 1 week will be displayed across the top, otherwise 2. Used when fitting into half width screens\r\n excludeBootstrapGrid: true, // Optional, if the bootstrap theme is already on the page, setting this to true will prevent any duplicate styling issues\r\n showOperatingHours: true, // Optional, this will display the location's operating hours (used primarily for fixed slot/all day logic)\r\n allDayOnly: true, // Optional, this will only show all-day as an available slot and hide the actual time slots\r\n allDayTitleOverride: 'Leaving loose wheels, picking up later', // Optional, this will override the all-day slot title if required\r\n allDayTextOverride: 'Drop off by 8am', // Optional, this will override the all-day slot text if required\r\n forceTimeSlotAllocation: true, // Optional, overrides the disable auto-assignment widget setting to force a time slot to be selected for a job if available\r\n ignoreJobAvailability: true, // Optional, will ignore any jobs on the calendar itself and allow the user to select any time slot (depending on opening hours/holidays)\r\n });\r\n\r\n * Events\r\n\r\n smCalendarWidget.on({eventName}, functionToPerform() { });\r\n\r\n * Event Names\r\n 'timeSlotChange': Each time the time slots have been retrieved for a date\r\n 'timeSlotSelected': Each time a time slot is selected\r\n*/\r\n\r\n var initialCss = function () {\r\n\r\n var css = '@keyframes spinner-grow {' +\r\n '0% {' +\r\n 'transform: scale(0);' +\r\n '}' +\r\n '50% {' +\r\n 'opacity: 1;' +\r\n 'transform: none;' +\r\n '}' +\r\n '}' +\r\n '.gms-spinner-container {' +\r\n 'padding: 20px 0;' +\r\n 'text-align: center;' +\r\n '}' +\r\n '.gms-spinner-grow {' +\r\n 'background-color: #333;' +\r\n 'display: inline-block;' +\r\n 'width: 32px;' +\r\n 'height: 32px;' +\r\n 'vertical-align: text-bottom;' +\r\n 'border-radius: 50%;' +\r\n '-webkit-animation: spinner-grow .75s linear infinite;' +\r\n 'animation: spinner-grow .75s linear infinite;' +\r\n '}' +\r\n '.gms-text-center {' +\r\n 'text-align: center;' +\r\n '}' +\r\n '.gms-error-icon {' +\r\n 'color: #fa5c7c;' +\r\n 'height: 30px;' +\r\n 'margin-bottom: 10px;' +\r\n 'width: 30px;' +\r\n '}' +\r\n '.gms-spinner-msg {' +\r\n 'color: #333;' +\r\n 'display: block;' +\r\n 'font-size: 14px;' +\r\n 'font-weight: 700;' +\r\n 'margin-top: 15px;' +\r\n '}';\r\n\r\n // Create style tag.\r\n addInlineCss(css);\r\n\r\n }\r\n\r\n var loadCss = function () {\r\n\r\n var primaryColour = settings.primaryColour !== undefined ? settings.primaryColour : '#0065ad',\r\n greyColour = '#f7f7f5',\r\n borderColour = '#dbdbdb';\r\n\r\n var css = '.gms-d-none {' +\r\n 'display: none !important;' +\r\n '}' +\r\n '.gms-d-block {' +\r\n 'display: block;' +\r\n '}' +\r\n '.gms-mb-0 {' +\r\n 'margin-bottom: 0 !important;' +\r\n '}' +\r\n '.gms-font-weight-normal {' +\r\n 'font-weight: 400;' +\r\n '}' +\r\n '.gms-font-weight-bold {' +\r\n 'font-weight: 700;' +\r\n '}' +\r\n '.gms-color-primary {' +\r\n 'color: ' + primaryColour + ';' +\r\n '}' +\r\n '.gms-form-group {' +\r\n 'margin-bottom: 1.35rem;' +\r\n '}' +\r\n '.gms-form-control {' +\r\n 'display: block;' +\r\n 'width: 100%;' +\r\n 'height: calc(2.25rem + 2px);' +\r\n 'padding: .45rem .9rem;' +\r\n 'line-height: 1.5;' +\r\n 'background-color: #fff;' +\r\n 'background-clip: padding-box;' +\r\n 'border: 1px solid #dee2e6;' +\r\n 'border-radius: .25rem;' +\r\n 'transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;' +\r\n '}' +\r\n '.gms-form-control:focus {' +\r\n 'border-color: #0065ad;' +\r\n 'outline: 0;' +\r\n '}' +\r\n '.gms-service-container {' +\r\n 'background-color: #fff;' +\r\n 'border: solid 1px #dee2e6;' +\r\n 'border-radius: 4px;' +\r\n 'margin-bottom: 30px;' +\r\n 'padding: 30px 40px;' +\r\n '' +\r\n '}' +\r\n '.gms-icon, .gms-icon svg {' +\r\n 'height: 60px;' +\r\n 'width: 60px;' +\r\n '}' +\r\n '.gms-step-container {' +\r\n 'background-color: ' + greyColour + ';' +\r\n 'padding: 24px;' +\r\n '}' +\r\n '.gms-date-container {' +\r\n 'display: flex;' +\r\n 'margin-bottom: 20px;' +\r\n '}' +\r\n '.gms-date-container.gms-disabled {' +\r\n 'opacity: .8;' +\r\n 'pointer-events: none;' +\r\n '}' +\r\n '.gms-week-title {' +\r\n 'background-color: #fff;' +\r\n 'border: solid 1px ' + borderColour + ';' +\r\n 'border-radius: 3px;' +\r\n 'font-weight: 700;' +\r\n 'margin-bottom: 10px;' +\r\n 'overflow: hidden;' +\r\n 'padding: 10px;' +\r\n 'position: relative;' +\r\n 'text-align: center;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change {' +\r\n 'background-color: transparent;' +\r\n 'border: none;' +\r\n 'color: ' + primaryColour + ';' +\r\n 'cursor: pointer;' +\r\n 'padding: 10px 12px;' +\r\n 'position: absolute;' +\r\n 'top: 0;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change:not(.gms-disabled):hover {' +\r\n 'background-color: ' + primaryColour + ';' +\r\n '}' +\r\n '.gms-week-title .gms-week-change:not(.gms-disabled):hover .gms-week-icon {' +\r\n 'color: #fff;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change:focus {' +\r\n 'outline: 0;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change.gms-disabled {' +\r\n 'opacity: .3;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change.gms-disabled:hover {' +\r\n 'cursor: not-allowed;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change.gms-week-prev {' +\r\n 'left: 0;' +\r\n '}' +\r\n '.gms-last .gms-week-title .gms-week-change.gms-week-prev {' +\r\n 'display: none;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change.gms-week-next {' +\r\n 'right: 0;' +\r\n '}' +\r\n '.gms-first .gms-week-title .gms-week-change.gms-week-next {' +\r\n 'display: none;' +\r\n '}' +\r\n '.gms-week-title .gms-week-change .gms-week-icon {' +\r\n 'height: 20px;' +\r\n 'transform: translateY(1px);' +\r\n 'width: 20px;' +\r\n '}' +\r\n '#gms-complete-order {' +\r\n 'margin-top: 10px;' +\r\n '}' +\r\n '.gms-continue-btn {' +\r\n 'background-color: ' + primaryColour + ';' +\r\n 'border: none;' +\r\n 'border-radius: 3px;' +\r\n 'color: #fff;' +\r\n 'cursor: pointer;' +\r\n 'display: block;' +\r\n 'font-size: 14px;' +\r\n 'font-weight: 700;' +\r\n 'margin: 0 auto;' +\r\n 'max-width: 350px;' +\r\n 'padding: 14px 24px;' +\r\n 'text-transform: uppercase;' +\r\n 'width: 100%;' +\r\n '}' +\r\n '.gms-continue-btn:hover {' +\r\n 'background-color: ' + LightenDarkenColor(primaryColour, 10) + ';' +\r\n '}' +\r\n '.gms-continue-btn,' +\r\n '.gms-continue-btn:hover {' +\r\n 'transition: all .2s ease-in-out;' +\r\n '}' +\r\n '.gms-continue-btn:disabled {' +\r\n 'cursor: not-allowed;' +\r\n 'opacity: .5;' +\r\n '}' +\r\n '.gms-continue-btn .gms-btn-inner {' +\r\n 'align-items: center;' +\r\n 'display: flex;' +\r\n 'justify-content: space-between;' +\r\n '}' +\r\n '.gms-btn-icon svg {' +\r\n 'height: 18px;' +\r\n 'width: 18px;' +\r\n '}' +\r\n '.gms-continue-msg {' +\r\n 'display: flex;' +\r\n 'justify-content: center;' +\r\n 'margin-top: 10px;' +\r\n '}' +\r\n '#gms-selected-slot-msg p {' +\r\n 'margin-bottom: 0px;' +\r\n '}' +\r\n '#gms-operating-hours {' +\r\n 'font-size: 13px;' +\r\n 'margin-top: 10px;' +\r\n 'text-transform: uppercase;' +\r\n '}' +\r\n '.gms-operating-hours-day {' +\r\n 'display: block;' +\r\n '}' +\r\n '.gms-day-lbl {' +\r\n 'display: inline-block;' +\r\n 'font-weight: bold;' +\r\n 'min-width: 50px;' +\r\n '}' +\r\n '.gms-text-center {' +\r\n 'text-align: center;' +\r\n '}' +\r\n '.gms-warning-icon {' +\r\n 'color: #fa5c7c;' +\r\n 'height: 16px;' +\r\n 'margin-right: 5px;' +\r\n 'width: 16px;' +\r\n '}' +\r\n '.gms-return {' +\r\n 'align-items: center;' +\r\n 'color: #666;' +\r\n 'display: flex;' +\r\n 'font-size: 13px;' +\r\n 'padding-bottom: 10px;' +\r\n '}' +\r\n '.gms-return svg {' +\r\n 'margin-right: 10px;' +\r\n '}' +\r\n '.gms-date-select {' +\r\n 'align-items: center;' +\r\n 'background-color: #fff;' +\r\n 'border: solid 1px ' + borderColour + ';' +\r\n 'border-radius: 3px;' +\r\n 'cursor: pointer;' +\r\n 'display: inline-flex;' +\r\n 'flex-basis: 13%;' +\r\n 'flex-direction: column;' +\r\n 'flex-grow: 1;' +\r\n 'font-size: 12px;' +\r\n 'justify-content: center;' +\r\n 'padding: 5px 8px;' +\r\n 'text-transform: uppercase;' +\r\n '}' +\r\n '.gms-date-select:hover {' +\r\n 'background-color: #e0e0e0;' +\r\n '}' +\r\n '.gms-date-select:not(.gms-disabled):not(.gms-selected) .gms-date {' +\r\n 'color: ' + primaryColour + ';' +\r\n '}' +\r\n '.gms-date-select .gms-date {' +\r\n 'font-size: 20px;' +\r\n 'font-weight: 700;' +\r\n '}' +\r\n '.gms-date-select.gms-selected {' +\r\n 'background-color: ' + primaryColour + ';' +\r\n 'border-color: transparent;' +\r\n 'color: #fff;' +\r\n 'position: relative;' +\r\n '}' +\r\n '.gms-date-select.gms-selected:after {' +\r\n 'border: 8px solid transparent;' +\r\n 'border-top-color: ' + primaryColour + ';' +\r\n 'content: \"\";' +\r\n 'left: 50%;' +\r\n 'position: absolute;' +\r\n 'top: 100%;' +\r\n 'transform: translateX(-50%);' +\r\n '}' +\r\n '.gms-date-select.gms-selected .gms-date {' +\r\n 'color: #fff;' +\r\n '}' +\r\n '.gms-date-select + .gms-date-select {' +\r\n 'margin-left: 2px;' +\r\n '}' +\r\n '.gms-date-select.gms-disabled {' +\r\n 'background-color: ' + borderColour + ';' +\r\n 'cursor: not-allowed;' +\r\n '}' +\r\n '#gms-timeslot-results {' +\r\n 'background-color: #fff;' +\r\n 'border: solid 1px ' + borderColour + ';' +\r\n 'border-radius: 3px;' +\r\n 'display: none;' +\r\n 'padding: 24px;' +\r\n 'text-align: center;' +\r\n '}' +\r\n '#gms-timeslot-results.gms-expanded {' +\r\n 'display: block;' +\r\n 'margin-bottom: 30px;' +\r\n '}' +\r\n '.gms-border-bg {' +\r\n 'font-weight: 700;' +\r\n 'margin: 0 auto 20px;' +\r\n 'max-width: 500px;' +\r\n 'position: relative;' +\r\n 'text-align: center;' +\r\n '}' +\r\n '.gms-border-bg:before {' +\r\n 'background-color: ' + borderColour + ';' +\r\n 'content: \"\";' +\r\n 'display: block;' +\r\n 'height: 1px;' +\r\n 'position: absolute;' +\r\n 'top: 50%;' +\r\n 'transform: translateY(-50%);' +\r\n 'width: 100%;' +\r\n '}' +\r\n '.gms-border-bg .gms-inner {' +\r\n 'background-color: #fff;' +\r\n 'display: inline-block;' +\r\n 'padding: 0 15px;' +\r\n 'position: relative;' +\r\n 'z-index: 1;' +\r\n '}' +\r\n '.gms-slot-radio {' +\r\n 'margin-bottom: 10px;' +\r\n 'position: relative;' +\r\n '}' +\r\n '.gms-slot-radio label {' +\r\n 'background-color: #fff;' +\r\n 'border: solid 1px ' + borderColour + ';' +\r\n 'border-radius: 3px;' +\r\n 'display: block;' +\r\n 'font-size: 13px;' +\r\n 'font-weight: 700;' +\r\n 'margin-bottom: 5px;' +\r\n 'padding: 8px 10px 8px 16px;' +\r\n 'text-align: center;' +\r\n '}' +\r\n '.gms-slot-radio.gms-slot-radio-left label {' +\r\n 'padding-left: 35px;' +\r\n 'text-align: left;' +\r\n '}' +\r\n '.gms-slot-radio.gms-disabled {' +\r\n 'cursor: not-allowed;' +\r\n '}' +\r\n '.gms-slot-radio.gms-disabled label {' +\r\n 'background-color: ' + borderColour + ';' +\r\n 'cursor: not-allowed;' +\r\n 'pointer-events: none;' +\r\n '}' +\r\n '.gms-slot-radio.gms-disabled input[type=\"radio\"] {' +\r\n 'pointer-events: none;' +\r\n '}' +\r\n '.gms-slot-radio,' +\r\n '.gms-slot-radio * {' +\r\n 'cursor: pointer;' +\r\n '}' +\r\n '.gms-slot-radio input[type=\"radio\"] {' +\r\n 'left: 12px;' +\r\n 'margin: 0 5px 0 0;' +\r\n 'position: absolute;' +\r\n 'top: 50%;' +\r\n 'transform: translateY(-50%);' +\r\n 'z-index: 10;' +\r\n '}' +\r\n '.gms-slot-radio input[type=\"radio\"]:checked + label {' +\r\n 'background-color: ' + primaryColour + ';' +\r\n 'border-color: ' + primaryColour + ';' +\r\n 'color: #fff;' +\r\n '}' +\r\n '.gms-required-lbl:after {' +\r\n 'content: \"*\";' +\r\n 'display: inline-block;' +\r\n 'margin-left: 3px;' +\r\n '}' +\r\n '@media (max-width: 480px) {' +\r\n '#gms-timeslot-results {' +\r\n 'padding: 10px;' +\r\n '}' +\r\n '.gms-step-container {' +\r\n 'padding: 10px;' +\r\n '}' +\r\n '.gms-date-select {' +\r\n 'font-size: 11px;' +\r\n 'padding: 5px 2px;' +\r\n '}' +\r\n '}';\r\n\r\n // Include the Bootstrap grid (unless opted out)\r\n if (settings.excludeBootstrapGrid === undefined || settings.excludeBootstrapGrid === false) {\r\n\r\n var gridCss = document.createElement('link');\r\n gridCss.rel = \"stylesheet\";\r\n gridCss.type = \"text/css\";\r\n gridCss.href = settings.scriptUrl + \"/css/bundles/widget.css\";\r\n\r\n document.getElementsByTagName('head')[0].appendChild(gridCss);\r\n }\r\n\r\n // Create style tag.\r\n addInlineCss(css);\r\n\r\n }\r\n\r\n var addInlineCss = function (css) {\r\n\r\n // Create style tag.\r\n var styles = document.createElement('style');\r\n styles.type = 'text/css';\r\n\r\n // Add style tag to head.\r\n document.getElementsByTagName('head')[0].appendChild(styles);\r\n\r\n // Load CSS into style tag.\r\n if (styles.styleSheet) {\r\n styles.styleSheet.cssText = css;\t\t\t\t\t\t// IE8\r\n } else {\r\n styles.appendChild(document.createTextNode(css));\t\t// Normality\r\n }\r\n\r\n }\r\n\r\n // Gather all location config settings\r\n var initLocationSettings = function (initialLoad) {\r\n\r\n // Delete after testing\r\n var requestDate = settings.requestDate != null && settings.requestDate != undefined ? settings.requestDate : new Date().toJSON();\r\n requestDate = settings.earliestAvailableStart != null && settings.earliestAvailableStart != undefined ? settings.earliestAvailableStart : settings.requestDate;\r\n \r\n var jobMins = settings.jobMins != null && settings.jobMins != undefined ? settings.jobMins : 0;\r\n var locationData = { apiKey: settings.apiKey, locationId: settings.locationId, currentDateTime: requestDate, jobMins: jobMins, bayIds: settings.bayIds };\r\n\r\n var existingLoadingWrapper = document.getElementById('gms-loading-wrapper');\r\n var loadingWrapper = (existingLoadingWrapper === undefined || existingLoadingWrapper === null ? buildElement('div', 'gms-loading-wrapper', '', '') : existingLoadingWrapper);\r\n\r\n if (settings.languageCulture == undefined) {\r\n updateSettingProperty('languageCulture', 'en-GB');\r\n }\r\n\r\n // Show the initial load screen\r\n if (initialLoad === true) {\r\n buildLoadingScreen(loadingWrapper, 'gms-initialLoad');\r\n }\r\n\r\n var loader;\r\n\r\n // Show the loader if the widget is standalone (i.e. not a service widget)\r\n if (settings.serviceWidget !== true) {\r\n loader = document.getElementById('gms-initialLoad');\r\n loader.classList.remove('gms-d-none');\r\n }\r\n\r\n // Ajax request the location config\r\n var request = postAjax(settings.scriptUrl + '/api/location/getlocationconfig', locationData, 'locationSettings');\r\n\r\n }\r\n\r\n // Gather all widget config settings\r\n var initServiceSettings = function () {\r\n\r\n var serviceData = { apiKey: settings.apiKey, locationId: settings.locationId, widgetConfigId: settings.widgetConfigId, jobMins: settings.jobMins, bayIds: settings.bayIds };\r\n\r\n var request = postAjax(settings.scriptUrl + '/api/widget/getwidgetconfig', serviceData, 'serviceSettings');\r\n\r\n }\r\n\r\n var buildService = function () {\r\n\r\n // Wrapper\r\n var wrapper = buildElement('div', 'gms-service-container', 'gms-step-container');\r\n\r\n // Hidden fields\r\n wrapper.appendChild(buildHiddenField('gms-serviceTimeEstimate', settings.serviceTimeEstimate));\r\n wrapper.appendChild(buildHiddenField('gms-serviceJobSheetTemplateId', settings.jobSheetTemplateId));\r\n wrapper.appendChild(buildHiddenField('gms-serviceBayIds', settings.bayIds));\r\n wrapper.appendChild(buildHiddenField('gms-autoSendToCustomer', settings.autoSendToCustomer));\r\n\r\n // Add service container/row divs\r\n var serviceWrapper = wrapper.appendChild(buildElement('div', '', 'gms-service-container', ''));\r\n var serviceRow = serviceWrapper.appendChild(buildElement('div', '', 'row', ''));\r\n\r\n // Add an icon has been provided\r\n if (settings.serviceIcon != undefined && settings.serviceIcon != '') {\r\n\r\n var serviceIconWrapper = buildElement('div', '', 'col-auto', '');\r\n serviceIconWrapper.appendChild(buildElement('div', 'gms-service-icon', 'gms-icon', settings.serviceIcon));\r\n serviceRow.appendChild(serviceIconWrapper);\r\n\r\n }\r\n\r\n var serviceInner = buildElement('div', '', 'col', '');\r\n\r\n // Service title\r\n serviceInner.appendChild(buildElement('label', 'gms-service-title', 'gms-font-weight-bold gms-color-primary', settings.serviceName));\r\n\r\n // Service description\r\n if (settings.serviceDescription != undefined && settings.serviceDescription != null && settings.serviceDescription != '') {\r\n serviceInner.appendChild(buildElement('p', 'gms-service-desc', '', settings.serviceDescription));\r\n }\r\n\r\n // Service price\r\n if (settings.servicePrice != undefined && settings.servicePrice != null) {\r\n serviceInner.appendChild(buildElement('p', 'gms-service-price', 'gms-font-weight-bold gms-mb-0', settings.servicePrice));\r\n }\r\n\r\n serviceRow.appendChild(serviceInner);\r\n serviceWrapper.appendChild(serviceRow);\r\n wrapper.appendChild(serviceWrapper);\r\n\r\n\r\n var formRow = buildElement('div', '', 'row', '');\r\n\r\n // Add all customer fields\r\n formRow.appendChild(buildTextField('gms-customerFirstName', smLangTranslate('First name'), true));\r\n formRow.appendChild(buildTextField('gms-customerLastName', smLangTranslate('Last name'), true));\r\n formRow.appendChild(buildTextField('gms-customerEmailAddress', smLangTranslate('Email address'), false));\r\n formRow.appendChild(buildTextField('gms-customerPhoneNumber', smLangTranslate('Mobile no.'), true));\r\n\r\n if (settings.includeCustomerAddressFields == true) {\r\n formRow.appendChild(buildTextField('gms-customerAddressLine1', smLangTranslate('Address Line 1'), true));\r\n formRow.appendChild(buildTextField('gms-customerAddressLine2', smLangTranslate('Address Line 2')));\r\n formRow.appendChild(buildTextField('gms-customerTown', smLangTranslate('Town/City'), true));\r\n formRow.appendChild(buildTextField('gms-customerCounty', smLangTranslate('County/Province')));\r\n formRow.appendChild(buildTextField('gms-customerPostcode', smLangTranslate('Postcode/Zip code'), true));\r\n }\r\n\r\n formRow.appendChild(buildTextField('gms-customerVrn', smLangTranslate('Registration no.'), true));\r\n\r\n // Add the styled row to the wrapper\r\n wrapper.appendChild(formRow);\r\n\r\n // Add continue button and message re: SMS notification\r\n wrapper.appendChild(buildButton('gms-choose-slot', 'Choose time slot', false));\r\n\r\n if (settings.autoSendToCustomer == true) {\r\n wrapper.appendChild(buildElement('small', '', 'gms-continue-msg', smLangTranslate('We will send you an SMS confirmation of your booking.')));\r\n }\r\n\r\n // Append wrapper to container.\r\n createWidgetContainer(wrapper);\r\n\r\n }\r\n\r\n var buildLoadingScreen = function (wrapper, loaderId) {\r\n\r\n // Loading spinner container\r\n var loaderContainer = buildElement('div', loaderId, 'gms-spinner-container gms-d-none', '');\r\n\r\n // Loading spinner\r\n loaderContainer.appendChild(buildElement('div', '', 'gms-spinner-grow', ''));\r\n\r\n // Loading text\r\n loaderContainer.appendChild(buildElement('span', '', 'gms-spinner-msg', smLangTranslate('Finding time slots...')));\r\n\r\n // Add the loader to the wrapper\r\n wrapper.appendChild(loaderContainer);\r\n\r\n createWidgetContainer(wrapper);\r\n\r\n }\r\n\r\n var buildWidget = function () {\r\n\r\n // Get the current week number\r\n var currentWeekNo = GetWeekNumber(new Date())[1];\r\n\r\n var numberOfWeeksToDisplay = 4;\r\n var weeksToPopulate = [];\r\n\r\n // Determine the array of weeks to populate based on the settings (defaults to 4 otherwise)\r\n if (settings.weeksToDisplay !== undefined && settings.weeksToDisplay > 1) {\r\n numberOfWeeksToDisplay = settings.weeksToDisplay;\r\n }\r\n\r\n // If a number of days has been specified, calculate the number of weeks to display\r\n if (settings.daysForLatestBooking !== undefined && settings.daysForLatestBooking >= 7) {\r\n numberOfWeeksToDisplay = GetMaxWeeks(settings.daysForLatestBooking);\r\n } \r\n\r\n // Get a list of weeks to populate\r\n for (i = currentWeekNo; i < (currentWeekNo + numberOfWeeksToDisplay); i++) {\r\n weeksToPopulate.push(i);\r\n }\r\n\r\n // Wrapper\r\n var wrapper = buildElement('div', 'gms-slot-container', 'gms-step-container', '');\r\n\r\n // Hide the slot wrapper by default if using the service widget\r\n if (settings.serviceWidget == true) {\r\n\r\n var step1 = document.getElementById('gms-service-container');\r\n\r\n // Re-display the previously active step\r\n if (initialLoad != true) {\r\n if (settings.activeStep == 1) {\r\n step1.classList.remove('gms-d-none');\r\n wrapper.classList.add('gms-d-none');\r\n } else {\r\n wrapper.classList.remove('gms-d-none');\r\n step1.classList.add('gms-d-none');\r\n }\r\n } else {\r\n wrapper.classList.add('gms-d-none');\r\n }\r\n\r\n // Also add a button to go back to step 1\r\n var returnBtn = buildElement('a', 'gms-return-step-1', 'gms-btn-icon gms-step gms-return', GetSVGMarkup('long-arrow-left', '') + smLangTranslate(' Return to customer details'));\r\n returnBtn.setAttribute('data-step', 1);\r\n returnBtn.href = 'javascript:void(0)';\r\n\r\n wrapper.appendChild(returnBtn);\r\n }\r\n\r\n // Add weeks available\r\n wrapper.appendChild(GenerateAvailableWeeks(weeksToPopulate));\r\n\r\n // Add the results container (initially empty)\r\n wrapper.appendChild(buildElement('div', 'gms-timeslot-results', '', ''));\r\n\r\n // Add the loading icon/text\r\n buildLoadingScreen(wrapper, 'gms-timeslotLoad');\r\n\r\n // Add the selected time slot message (hidden by default)\r\n wrapper.appendChild(buildElement('div', 'gms-selected-slot-msg', 'gms-d-none gms-text-center', ''));\r\n\r\n // Select time slot button and message container\r\n var continueBtnContainer = buildElement('div', '', 'gms-continue-btn-container', '');\r\n\r\n // Select time slot button\r\n if (settings.serviceWidget == true) {\r\n continueBtnContainer.appendChild(buildButton('gms-complete-order', smLangTranslate('Complete booking'), true));\r\n }\r\n\r\n // Add the warning message\r\n var continueMsg = buildElement('small', 'gms-continue-msg', 'gms-continue-msg', ' ' + smLangTranslate('A time slot must be selected before proceeding. Please select a date and time slot above.'));\r\n\r\n // Append the warning icon/message to the message container\r\n continueMsg.insertBefore(buildElement('span', '', 'gms-warning-icon', GetSVGMarkup('exclamation-circle', 'gms-warning-icon')), continueMsg.firstChild);\r\n\r\n continueBtnContainer.appendChild(continueMsg);\r\n\r\n // Add the location's operating hours (if opted-in)\r\n if (settings.showOperatingHours == true && settings.operatingHoursDisplay != undefined && settings.operatingHoursDisplay != '') {\r\n continueBtnContainer.appendChild(buildElement('div', 'gms-operating-hours', '', buildOperatingHoursDisplay(settings.operatingHoursDisplay)));\r\n }\r\n\r\n // Add the time slot button/message to the wrapper\r\n wrapper.appendChild(continueBtnContainer);\r\n\r\n createWidgetContainer(wrapper);\r\n\r\n }\r\n\r\n var buildErrorMessage = function (errorText) {\r\n\r\n // Wrapper\r\n var wrapper = buildElement('div', '', 'gms-step-container gms-text-center', '');\r\n\r\n // Error icon\r\n wrapper.appendChild(buildElement('span', '', '', GetSVGMarkup('exclamation-circle', 'gms-error-icon')));\r\n\r\n // Error message\r\n wrapper.appendChild(buildElement('div', '', '', errorText));\r\n\r\n createWidgetContainer(wrapper);\r\n\r\n }\r\n\r\n // Get today's date and set the time to 0 for date comparison of available dates\r\n var today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n // Get a list of all dates\r\n var inactiveDates = document.querySelectorAll('.gms-date-select');\r\n\r\n // Disable any dates before today\r\n inactiveDates.forEach(function (element) {\r\n\r\n if (new Date(element.getAttribute('data-date')).setHours(0, 0, 0, 0) < today) {\r\n element.classList.add('gms-disabled');\r\n }\r\n\r\n });\r\n\r\n var projXtimer;\r\n\r\n var initAjax = function () {\r\n\r\n var availableDates = document.querySelectorAll('.gms-date-select:not(.gms-disabled)');\r\n\r\n // Init date selection\r\n availableDates.forEach(function (element) {\r\n\r\n element.addEventListener('click', function () {\r\n\r\n if (!element.classList.contains('gms-selected') && !element.classList.contains('gms-disabled')) {\r\n\r\n // Show the date as selected and remove any previously selected date\r\n var dateBtns = document.querySelectorAll('.gms-date-select');\r\n\r\n dateBtns.forEach(function (date) {\r\n\r\n if (date.classList.contains('gms-selected')) {\r\n date.classList.remove('gms-selected');\r\n }\r\n\r\n });\r\n\r\n element.classList.add('gms-selected');\r\n document.getElementById('gms-selected-slot-msg').classList.add('gms-d-none');\r\n\r\n if (smCalendarWidget) {\r\n smCalendarWidget.refreshTimeSlot();\r\n }\r\n\r\n }\r\n\r\n });\r\n\r\n });\r\n\r\n }\r\n\r\n var initCustomerInfoSubmission = function () {\r\n\r\n var slotBtn = document.querySelector('#gms-choose-slot:not(:disabled)');\r\n\r\n slotBtn.addEventListener('click', function () {\r\n\r\n // Check all required customer fields have had info provided for\r\n var requiredFields = ['gms-customerFirstName', 'gms-customerLastName', 'gms-customerPhoneNumber', 'gms-customerVrn'];\r\n\r\n // Add the address fields if required\r\n if (settings.includeCustomerAddressFields == true) {\r\n requiredFields.push('gms-customerAddressLine1', 'gms-customerTown', 'gms-customerPostcode');\r\n }\r\n\r\n // Check that the email address is valid (if provided)\r\n var customerEmailAddress = document.getElementById('gms-customerEmailAddress').value;\r\n\r\n if (customerEmailAddress != null && customerEmailAddress != undefined && customerEmailAddress != '' && /(.+)@(.+){2,}\\.(.+){2,}/.test(customerEmailAddress) != true) {\r\n alert(smLangTranslate(\"The email address provided is invalid, please ensure the format is correct or keep the value blank.\"));\r\n } else {\r\n\r\n // Compile a list of fields requiring info\r\n var missingFields = [];\r\n\r\n // Loop through all required fields and check for any missing info\r\n for (var i = 0; i < requiredFields.length; i++) {\r\n\r\n var requiredField = document.getElementById(requiredFields[i]);\r\n\r\n if (requiredField.value == '') {\r\n // Add the associated field label (for a user-friendly display)\r\n missingFields.push(document.getElementById(requiredFields[i] + '-label').textContent);\r\n }\r\n\r\n }\r\n\r\n // Alert the user if anything is missing\r\n if (missingFields.length) {\r\n\r\n alert(smLangTranslate('Please fill in the missing information for the following:') + '\\n' + missingFields.join('\\n'));\r\n\r\n } else {\r\n\r\n // Hide step 1\r\n document.getElementById('gms-service-container').classList.add('gms-d-none');\r\n\r\n // Show step 2\r\n document.getElementById('gms-slot-container').classList.remove('gms-d-none');\r\n\r\n }\r\n\r\n // Update the active step (used for form reset)\r\n settings.activeStep = 2;\r\n\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n var initSlotSelection = function () {\r\n\r\n var timeSlotRadios = document.querySelectorAll('.gms-slot-radio input[type=\"radio\"]');\r\n\r\n // Enable the button to continue the booking process when selecting a time slot\r\n timeSlotRadios.forEach(function (element) {\r\n\r\n element.addEventListener('change', function () {\r\n\r\n // Perhaps if the button is not enabled, we put in a message instead\r\n if (document.getElementById('gms-complete-order') != null) {\r\n document.getElementById('gms-complete-order').removeAttribute('disabled');\r\n }\r\n\r\n document.getElementById('gms-continue-msg').classList.add('gms-d-none');\r\n\r\n // Set the internal properties\r\n smCalendarWidget.selectedStartTime = document.querySelector('.gms-slot-radio input[type=\"radio\"]:checked').value;\r\n smCalendarWidget.selectedEndTime = document.querySelector('.gms-slot-radio input[type=\"radio\"]:checked').getAttribute('data-end-time');\r\n smCalendarWidget.selectedCustomSlotId = document.querySelector('.gms-slot-radio input[type=\"radio\"]:checked').getAttribute('data-custom-slot-id');\r\n\r\n // Get the selected slot into a more readable format\r\n var selectedDate = new Date(smCalendarWidget.selectedStartTime);\r\n\r\n // Convert the returned time slot into a usable time format - using 24 hour now\r\n var timeSlot = new Date(selectedDate).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' });\r\n\r\n var dtOptions = { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' };\r\n\r\n // Display the selected time slot to the user\r\n document.getElementById('gms-selected-slot-msg').innerHTML = '
' + smLangTranslate('Your selected time slot starts on ') + ' ' + selectedDate.toLocaleDateString(settings.languageCulture, dtOptions) + smLangTranslate(' at ') + timeSlot + '.
';\r\n document.getElementById('gms-selected-slot-msg').classList.remove('gms-d-none');\r\n\r\n // Set the output id (hidden input)\r\n if (smCalendarWidget.settings.selectedSlotFromOutputId !== undefined) {\r\n document.getElementById(smCalendarWidget.settings.selectedSlotFromOutputId).value = smCalendarWidget.selectedStartTime;\r\n\r\n if (smCalendarWidget.settings.selectedSlotToOutputId !== undefined) {\r\n document.getElementById(smCalendarWidget.settings.selectedSlotToOutputId).value = smCalendarWidget.selectedEndTime;\r\n }\r\n\r\n fireEvent('timeSlotSelected', { \"selectedStartTime\": smCalendarWidget.selectedStartTime, \"selectedEndTime\": smCalendarWidget.selectedEndTime });\r\n }\r\n\r\n // Only keep the the selected option only for a short while\r\n // Reset any original timer\r\n clearTimeout(projXtimer);\r\n\r\n if (smCalendarWidget.settings.minsToResetSelection === undefined)\r\n smCalendarWidget.settings.minsToResetSelection = 30;\r\n\r\n // Now set a new one\r\n projXtimer = setTimeout(function () {\r\n smCalendarWidget.resetForm();\r\n }, smCalendarWidget.settings.minsToResetSelection * 60 * 1000);\r\n\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n var initBookingSubmission = function () {\r\n\r\n // Return to step 1 after submitting customer info\r\n if (settings.serviceWidget == true) {\r\n var step1Return = document.querySelector('.gms-step');\r\n\r\n step1Return.addEventListener('click', function () {\r\n\r\n var returnStep = step1Return.getAttribute('data-step');\r\n\r\n returnToStep(returnStep);\r\n\r\n settings.activeStep = 1;\r\n\r\n });\r\n }\r\n\r\n var completeOrderBtn = document.getElementById('gms-complete-order'),\r\n completeBtnText = document.querySelector('#gms-complete-order .gms-btn-text');\r\n\r\n if (completeOrderBtn != undefined && completeOrderBtn != null) {\r\n\r\n completeOrderBtn.addEventListener('click', function () {\r\n\r\n // Disable the button to prevent repeat bookings\r\n completeOrderBtn.disabled = true;\r\n completeBtnText.innerHTML = smLangTranslate('Processing booking...');\r\n\r\n // Add the service price\r\n var addPriceDescription = settings.servicePrice != undefined && settings.servicePrice != null;\r\n\r\n // Compile all relevant booking info\r\n var bookingData = {\r\n apiKey: settings.apiKey,\r\n locationId: settings.locationId,\r\n BayIds: settings.bayIds != null ? settings.bayIds : null,\r\n BookingSource: 'ServiceWidget',\r\n Description: \"Booking created via '\" + settings.serviceName + \"' service widget.\" + (addPriceDescription ? \" Price shown to customer: \" + settings.servicePrice + \" - any invoice should match this amount.\" : \"\"),\r\n PreferredStartDateTime: smCalendarWidget.selectedStartTime,\r\n PreferredEndDateTime: smCalendarWidget.selectedEndTime,\r\n CustomBookingSlotId: smCalendarWidget.selectedCustomSlotId,\r\n TimeEstimate: settings.serviceTimeEstimate,\r\n JobSheetTemplateId: settings.jobSheetTemplateId,\r\n AutoSendToCustomer: settings.autoSendToCustomer,\r\n RegistrationNo: document.getElementById('gms-customerVrn').value,\r\n SlotType: settings.slotType,\r\n ForceTimeSlotAllocation: settings.forceTimeSlotAllocation,\r\n CustomerDetails: {\r\n FirstName: document.getElementById('gms-customerFirstName').value,\r\n LastName: document.getElementById('gms-customerLastName').value,\r\n Email: document.getElementById('gms-customerEmailAddress').value,\r\n PhoneNumber: document.getElementById('gms-customerPhoneNumber').value\r\n },\r\n BookingDetails: {\r\n PriceExVAT: (settings.servicePriceSolus != null ? settings.servicePriceSolus : 0),\r\n PriceIncVAT: (settings.servicePriceSolus != null ? settings.servicePriceSolus : 0)\r\n }\r\n }\r\n\r\n // Add the address data if applicable\r\n if (settings.includeCustomerAddressFields) {\r\n bookingData.CustomerDetails.AddressLine1 = document.getElementById('gms-customerAddressLine1').value;\r\n bookingData.CustomerDetails.AddressLine2 = document.getElementById('gms-customerAddressLine2').value;\r\n bookingData.CustomerDetails.Town = document.getElementById('gms-customerTown').value;\r\n bookingData.CustomerDetails.County = document.getElementById('gms-customerCounty').value;\r\n bookingData.CustomerDetails.Postcode = document.getElementById('gms-customerPostcode').value;\r\n }\r\n\r\n // Insert the new booking\r\n var request = postAjax(settings.scriptUrl + '/api/booking/addbooking', bookingData, 'booking');\r\n\r\n });\r\n\r\n } \r\n\r\n }\r\n\r\n // Public object\r\n return {\r\n\r\n // Start up\r\n init: function (config) {\r\n\r\n // Location config\r\n this.settings = settings = config;\r\n\r\n updateSettingProperty('scriptUrl', 'https://projectx-dev.azurewebsites.net');\r\n\r\n // Set up service form if it has been provided\r\n if (settings.serviceWidget == true) {\r\n initialCss();\r\n initServiceSettings(initialLoad);\r\n } else {\r\n initialCss();\r\n loadCss();\r\n\r\n // Initialise the widget w/ ajax call events only initialised once\r\n initLocationSettings(initialLoad);\r\n }\r\n\r\n // Set the widget to refresh every x minutes (defined in location config - defaults to 4 hours)\r\n var widgetMinsToReset = 60 * 4;\r\n\r\n if (settings.minsToReset !== undefined && settings.minsToReset !== null) {\r\n widgetMinsToReset = settings.minsToReset;\r\n }\r\n\r\n // TODO: This needs to be updated so that it starts after a date has been clicked\r\n setInterval(function () {\r\n\r\n initialLoad = false;\r\n\r\n smCalendarWidget.resetForm();\r\n }, widgetMinsToReset * 60 * 1000);\r\n \r\n },\r\n resetForm: function () {\r\n\r\n // Only refresh if an order hasn't already been generated\r\n if (settings.activeStep != 3) {\r\n\r\n // Decipher the selected date\r\n var selectedDate = document.querySelector('.gms-slot-radio input[type=\"radio\"]:checked');\r\n\r\n if (selectedDate != null && selectedDate != undefined) {\r\n settings.previousSelectedDate = selectedDate.value;\r\n }\r\n\r\n // Remove the previous calendar if this is a repeat call\r\n var calendarWrapper = document.getElementById('gms-slot-container');\r\n\r\n if (calendarWrapper !== undefined && calendarWrapper !== null) {\r\n calendarWrapper.remove();\r\n }\r\n\r\n // Clear the output from value\r\n if (smCalendarWidget.settings.selectedSlotFromOutputId !== undefined) {\r\n document.getElementById(smCalendarWidget.settings.selectedSlotFromOutputId).value = '';\r\n }\r\n\r\n // Clear the output to value\r\n if (smCalendarWidget.settings.selectedSlotToOutputId !== undefined) {\r\n document.getElementById(smCalendarWidget.settings.selectedSlotToOutputId).value = '';\r\n }\r\n\r\n initLocationSettings(false);\r\n }\r\n \r\n },\r\n refreshTimeSlot: function () {\r\n\r\n if (settings.jobMins == undefined)\r\n settings.jobMins = 60;\r\n\r\n if (settings.intervalMins == undefined)\r\n settings.intervalMins = 60;\r\n\r\n var date;\r\n\r\n // Check for a previously selected date and use that if found\r\n if (settings.previousSelectedDate != null && settings.previousSelectedDate != undefined) {\r\n date = new Date(settings.previousSelectedDate);\r\n } else {\r\n date = document.querySelector(\".gms-date-container .gms-date-select.gms-selected\").getAttribute('data-date');\r\n }\r\n\r\n var data = {\r\n apiKey: settings.apiKey,\r\n locationId: settings.locationId,\r\n QueryDate: date,\r\n JobMins: settings.jobMins,\r\n IntervalMins: settings.intervalMins,\r\n BayIds: settings.bayIds,\r\n SlotType: settings.slotType,\r\n IgnoreJobAvailability: settings.ignoreJobAvailability\r\n };\r\n\r\n var timeSlotContainer = document.getElementById('gms-timeslot-results'),\r\n continueBtn = document.getElementById('gms-complete-order'),\r\n continueMsg = document.getElementById('gms-continue-msg'),\r\n loader = document.getElementById('gms-timeslotLoad');\r\n\r\n // Remove any previous results\r\n timeSlotContainer.innerHTML = '';\r\n timeSlotContainer.classList.remove('gms-expanded');\r\n\r\n if (continueBtn != null) {\r\n continueBtn.disabled = true;\r\n }\r\n\r\n // Temporarily disable all dates (prevent multiple simultaneous time slot calls)\r\n alterElementsClassList(document.querySelectorAll('.gms-date-container'), 'gms-disabled', true);\r\n\r\n continueMsg.classList.remove('gms-d-none');\r\n\r\n // Show the loading screen\r\n loader.classList.remove('gms-d-none');\r\n\r\n // Call the calendar API for slot availability\r\n var request = postAjax(settings.scriptUrl + '/api/availability/gettimeslots', data, 'timeSlot');\r\n\r\n },\r\n getSelectedDate: function () {\r\n var selectedSlot = document.querySelector(\".gms-date-container .gms-date-select.gms-selected\");\r\n\r\n return selectedSlot != undefined && selectedSlot != null ? selectedSlot.getAttribute('data-date') : null;\r\n },\r\n getSelectedStartTime: function () {\r\n return this.selectedStartTime;\r\n },\r\n getSelectedEndTime: function() {\r\n return this.selectedEndTime;\r\n },\r\n isValid: function () {\r\n return this.selectedStartTime !== undefined && this.selectedEndTime !== undefined;\r\n },\r\n on: function (event, callback) {\r\n var eventContainer = document.getElementById(settings.container);\r\n\r\n if (eventContainer && eventContainer !== undefined) {\r\n eventContainer.addEventListener(event, callback);\r\n };\r\n }\r\n }\r\n\r\n // Generate the available dates list for the widget\r\n function GenerateAvailableWeeks(weeksToPopulate) {\r\n\r\n // Add a container for all available weeks\r\n var availableWeeks = buildElement('div', '', 'row', '');\r\n\r\n // Loop through the array of available weeks and populate accordingly\r\n weeksToPopulate.forEach(function (item, index) {\r\n\r\n // Determine the visibility status of the week on init\r\n var visibilityClass = 'gms-d-none';\r\n\r\n if (index === 0) {\r\n visibilityClass = (settings.singleColumn == true ? '' : 'gms-first');\r\n } else if (index === 1 && settings.singleColumn != true) {\r\n visibilityClass = 'gms-last';\r\n }\r\n\r\n // Week column\r\n var weekCol = buildElement('div', '', 'col-12 ' + (settings.singleColumn == true ? '' : 'col-md-6') + ' mb-3 mb-md-0 gms-week-container ' + visibilityClass, '');\r\n weekCol.setAttribute('data-week', item);\r\n\r\n // Week title container\r\n var weekTitleContainer = buildElement('div', '', 'gms-week-title', '');\r\n\r\n // Add the week's previous button\r\n weekTitleContainer.appendChild(GenerateWeekChangeButton(true, index, weeksToPopulate.length));\r\n\r\n // Week title\r\n var weekTitle = buildElement('span', 'gms-date-title', '', '');\r\n\r\n // Week #\r\n var weekNo = buildElement('span', '', 'gms-color-primary', '');\r\n\r\n // Determine the week display text\r\n if (settings.useWeekNumbers == true) {\r\n weekTitle.innerHTML = smLangTranslate('Week ');\r\n if (item <= 52)\r\n weekNo.innerHTML = item;\r\n else\r\n weekNo.innerHTML = item - 52;\r\n }\r\n\r\n // Add the week title/no to the container\r\n weekTitle.appendChild(weekNo);\r\n weekTitleContainer.appendChild(weekTitle);\r\n\r\n // Add the week's next button\r\n weekTitleContainer.appendChild(GenerateWeekChangeButton(false, index, weeksToPopulate.length));\r\n\r\n // Add the compiled week selector to the colummn/wrapper\r\n weekCol.appendChild(weekTitleContainer);\r\n availableWeeks.appendChild(weekCol);\r\n\r\n // Add the available week dates\r\n var availableDates = GenerateWeekAvailableDates(item);\r\n\r\n // Generate the title for the date range\r\n if (settings.useWeekNumbers != true) {\r\n\r\n // Get the first and last date within the week\r\n var startDate = availableDates.children[0];\r\n var endDate = availableDates.children[6];\r\n\r\n // Separate the start/end dates within the week range and add the date range to the week title\r\n weekTitle.appendChild(buildElement('span', '', 'gms-color-primary', startDate.querySelector('.gms-date').innerText + \" \"));\r\n weekTitle.appendChild(buildElement('span', '', '', startDate.querySelector('.gms-month').innerText + \" - \"));\r\n weekTitle.appendChild(buildElement('span', '', 'gms-color-primary', endDate.querySelector('.gms-date').innerText + \" \"));\r\n weekTitle.appendChild(buildElement('span', '', '', endDate.querySelector('.gms-month').innerText));\r\n\r\n }\r\n\r\n weekCol.appendChild(availableDates);\r\n\r\n });\r\n\r\n return availableWeeks;\r\n\r\n }\r\n\r\n // Generate the markup for a week prev/next button\r\n function GenerateWeekChangeButton(isPrev, index, weeksToPopulateLength) {\r\n\r\n // Arrow button - disable the first week's previous and last week's next buttons\r\n var button = buildElement('button', '', 'gms-week-change gms-week-' + ((isPrev === true) ? 'prev ' : 'next ') + (((index === 0 && isPrev) || (!isPrev && index + 1 === weeksToPopulateLength)) ? 'gms-disabled' : ''), '');\r\n button.setAttribute(\"type\", \"button\");\r\n\r\n // SVG container\r\n button.appendChild(buildElement('div', '', '', GetSVGMarkup('arrow-circle-' + (isPrev === true ? 'left' : 'right'), 'gms-week-icon')));\r\n\r\n return button;\r\n\r\n }\r\n\r\n // Generate a week's worth of selectable dates based on the week passed in\r\n function GenerateWeekAvailableDates(weekToPopulate) {\r\n\r\n var dateContainer = buildElement('div', '', 'gms-date-container', '');\r\n\r\n // Get the actual dates for the year's week in question\r\n var dateRange = GetDateRangeOfWeek(weekToPopulate);\r\n\r\n var startDate = new Date(dateRange.split('|')[0]);\r\n var endDate = new Date(dateRange.split('|')[1]);\r\n\r\n // Get a list of day and month names to display\r\n var weekdays = smLangGetWeekdays(settings.languageCulture);\r\n var months = smLangGetMonths(settings.languageCulture);\r\n\r\n // Get any \"earliest available date\" parameter\r\n var earliestAvailableStart = settings.earliestAvailableStart != null ? new Date(settings.earliestAvailableStart) : new Date(),\r\n gmsEarliestAvailableDate = settings.gmsEarliestAvailableStart != null ? new Date(new Date(settings.gmsEarliestAvailableStart).toDateString()) : new Date(),\r\n earliestAvailableDate = new Date(earliestAvailableStart.toDateString());\r\n\r\n // Pick the latest of the requested earliest start and the gms earliest start\r\n if (gmsEarliestAvailableDate > earliestAvailableDate)\r\n earliestAvailableDate = gmsEarliestAvailableDate;\r\n\r\n // Check for a maximum date, so that we can block the option on the calendar if needed\r\n var maxDate = null;\r\n if (settings.daysForLatestBooking !== undefined && settings.daysForLatestBooking >= 7) {\r\n const d = new Date();\r\n maxDate = new Date(d.setDate(d.getDate() + settings.daysForLatestBooking));\r\n }\r\n\r\n for (var d = startDate; d <= endDate; d.setDate(d.getDate() + 1)) {\r\n\r\n var dateFormatted = d.getFullYear() + \"-\" + prependZero(d.getMonth() + 1) + \"-\" + prependZero(d.getDate());\r\n\r\n // Create the date selector\r\n var dateSelector = buildElement('span', '', 'gms-date-select', '');\r\n dateSelector.setAttribute('data-date', dateFormatted);\r\n dateSelector.setAttribute('data-week', weekToPopulate);\r\n\r\n var currentDate = new Date(),\r\n loopDate = new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n\r\n // Add a \"today\" attribute to the current date\r\n if (loopDate.toLocaleDateString() == currentDate.toLocaleDateString()) {\r\n dateSelector.id = 'gms-selector-today';\r\n }\r\n\r\n // Disable the date if the location is closed on that day of the week (plus any dates before today)\r\n if ((settings.daysOfWeekClosed != null &&\r\n settings.daysOfWeekClosed.indexOf(d.getDay()) >= 0) ||\r\n loopDate < new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()) ||\r\n (settings.datesToExclude != null && Array.isArray(settings.datesToExclude) && settings.datesToExclude.indexOf(dateFormatted) >= 0) ||\r\n loopDate < earliestAvailableDate ||\r\n (maxDate != null && loopDate > maxDate)) {\r\n dateSelector.setAttribute('disabled', true);\r\n dateSelector.classList.add('gms-disabled');\r\n }\r\n\r\n // Add the day name / date / month\r\n dateSelector.appendChild(buildElement('span', '', 'gms-day', weekdays[d.getDay()]));\r\n dateSelector.appendChild(buildElement('span', '', 'gms-date gms-d-block', d.getDate()));\r\n dateSelector.appendChild(buildElement('span', '', 'gms-month', months[d.getMonth()]));\r\n dateContainer.appendChild(dateSelector);\r\n }\r\n\r\n return dateContainer;\r\n }\r\n\r\n function prependZero(n) {\r\n return n < 10 ? '0' + n : '' + n;\r\n }\r\n\r\n function GetDateRangeOfWeek(weekNo) {\r\n var d1 = new Date();\r\n numOfdaysPastSinceLastMonday = eval(d1.getDay() - 1);\r\n d1.setDate(d1.getDate() - numOfdaysPastSinceLastMonday);\r\n var weekNoToday = GetWeekNumber(d1)[1];\r\n var weeksInTheFuture = eval(weekNo - weekNoToday);\r\n d1.setDate(d1.getDate() + eval(7 * weeksInTheFuture));\r\n var rangeIsFrom = eval(d1.getMonth() + 1) + \"/\" + d1.getDate() + \"/\" + d1.getFullYear();\r\n d1.setDate(d1.getDate() + 6);\r\n var rangeIsTo = eval(d1.getMonth() + 1) + \"/\" + d1.getDate() + \"/\" + d1.getFullYear();\r\n return rangeIsFrom + \"|\" + rangeIsTo;\r\n };\r\n\r\n function GetMaxWeeks(daysForLatestBooking) {\r\n var d1 = new Date();\r\n const d2 = new Date();\r\n d2.setDate(d1.getDate() + daysForLatestBooking);\r\n\r\n var weekNoToday = GetWeekNumber(d1)[1];\r\n var weekNoEnd = GetWeekNumber(d2)[1];\r\n var weeksAhead = weekNoEnd - weekNoToday;\r\n \r\n return weeksAhead + 1;\r\n };\r\n\r\n // Adds the ability to traverse between numbered weeks\r\n function initChangeWeeks() {\r\n\r\n var weekChangeBtns = document.querySelectorAll('.gms-week-change:not(.gms-disabled)');\r\n\r\n weekChangeBtns.forEach(function (element) {\r\n\r\n element.addEventListener('click', function () {\r\n\r\n var weekNo = parseInt(element.closest('.gms-week-container').getAttribute('data-week'));\r\n\r\n // Advance or go back a week\r\n if (element.classList.contains('gms-week-next')) {\r\n advanceWeek(weekNo);\r\n } else {\r\n decreaseWeek(weekNo);\r\n }\r\n\r\n });\r\n\r\n });\r\n\r\n }\r\n\r\n function advanceWeek(weekNo) {\r\n\r\n var selectedWeek = document.querySelector('.gms-week-container[data-week=\"' + weekNo + '\"]'),\r\n nextWeek = document.querySelector('.gms-week-container[data-week=\"' + (weekNo + 1) + '\"]'),\r\n previousWeek = document.querySelector('.gms-week-container[data-week=\"' + (weekNo - 1) + '\"]');\r\n\r\n // Hide the previous week if single column\r\n if (settings.singleColumn == true) {\r\n adjustClassList(selectedWeek, 'add', 'gms-d-none'); \r\n\r\n } else {\r\n\r\n adjustClassList(nextWeek, 'add', 'gms-last');\r\n\r\n // Hide the new week's \"prev\" button\r\n alterElementsClassList(nextWeek.querySelectorAll('.gms-week-prev'), 'gms-d-none', true);\r\n\r\n // Update the previous \"last\" week into the new \"first\" week\r\n adjustClassList(selectedWeek, 'remove', 'gms-last');\r\n adjustClassList(selectedWeek, 'add', 'gms-first');\r\n\r\n // Hide the clicked \"next\" button and display the \"prev\" button\r\n alterElementsClassList(selectedWeek.querySelectorAll('.gms-week-next'), 'gms-d-none', true);\r\n alterElementsClassList(selectedWeek.querySelectorAll('.gms-week-prev'), 'gms-d-none', false);\r\n\r\n // Hide the previous \"first\" week\r\n adjustClassList(previousWeek, 'remove', 'gms-first');\r\n adjustClassList(previousWeek, 'add', 'gms-d-none');\r\n }\r\n\r\n // Display the next week\r\n adjustClassList(nextWeek, 'remove', 'gms-d-none');\r\n }\r\n\r\n function decreaseWeek(weekNo) {\r\n\r\n var selectedWeek = document.querySelector('.gms-week-container[data-week=\"' + weekNo + '\"]'),\r\n nextWeek = document.querySelector('.gms-week-container[data-week=\"' + (weekNo + 1) + '\"]'),\r\n previousWeek = document.querySelector('.gms-week-container[data-week=\"' + (weekNo - 1) + '\"]');\r\n\r\n // Hide the next week if single column\r\n if (settings.singleColumn == true) {\r\n adjustClassList(selectedWeek, 'add', 'gms-d-none');\r\n } else {\r\n adjustClassList(nextWeek, 'remove', 'gms-last');\r\n\r\n // Hide the new week's \"prev\" button\r\n alterElementsClassList(nextWeek.querySelectorAll('.gms-week-prev'), 'gms-d-none', true);\r\n\r\n // Update the previous \"first\" week into the new \"last\" week\r\n adjustClassList(selectedWeek, 'add', 'gms-last');\r\n adjustClassList(selectedWeek, 'remove', 'gms-first');\r\n\r\n // Hide the clicked \"next\" button and display the \"prev\" button\r\n alterElementsClassList(selectedWeek.querySelectorAll('.gms-week-next'), 'gms-d-none', false);\r\n alterElementsClassList(selectedWeek.querySelectorAll('.gms-week-prev'), 'gms-d-none', true);\r\n\r\n // Show the new \"first\" week\r\n adjustClassList(previousWeek, 'add', 'gms-first');\r\n }\r\n\r\n // Hide the next week and show the new week\r\n adjustClassList(nextWeek, 'add', 'gms-d-none');\r\n\r\n adjustClassList(previousWeek, 'remove', 'gms-d-none');\r\n }\r\n\r\n function adjustClassList(element, action, className) {\r\n if (element != undefined && element != null) {\r\n if (action == 'add')\r\n element.classList.add(className);\r\n else if (action == 'remove')\r\n element.classList.remove(className);\r\n }\r\n }\r\n // Add or remove a class from a list of query selector JS elements\r\n function alterElementsClassList(elements, classToUpdate, add) {\r\n\r\n elements.forEach(function (element) {\r\n\r\n if (add == true) {\r\n element.classList.add(classToUpdate);\r\n } else {\r\n element.classList.remove(classToUpdate);\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n // Returns the SVG markup for a specified vector type\r\n function GetSVGMarkup(type, additionalClasses) {\r\n\r\n if (additionalClasses === undefined) {\r\n additionalClasses = '';\r\n }\r\n\r\n switch (type) {\r\n case 'arrow-circle-left':\r\n return '';\r\n case 'arrow-circle-right':\r\n return '';\r\n case 'check-circle':\r\n return '';\r\n case 'exclamation-circle':\r\n return '';\r\n case 'long-arrow-left':\r\n return '';\r\n case 'long-arrow-right':\r\n return '';\r\n }\r\n\r\n return '';\r\n\r\n }\r\n\r\n // Dynamically lighten/darken a colour (akin to Sass) \r\n function LightenDarkenColor(col, amt) {\r\n var num = parseInt(col, 16);\r\n var r = (num >> 16) + amt;\r\n var b = ((num >> 8) & 0x00FF) + amt;\r\n var g = (num & 0x0000FF) + amt;\r\n var newColor = g | (b << 8) | (r << 16);\r\n return newColor.toString(16);\r\n }\r\n\r\n function GetWeekNumber(d) {\r\n // Copy date so don't modify original\r\n d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\r\n // Set to nearest Thursday: current date + 4 - current day number\r\n // Make Sunday's day number 7\r\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\r\n // Get first day of year\r\n var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n // Calculate full weeks to nearest Thursday\r\n var weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7);\r\n // Return array of year and week number\r\n return [d.getUTCFullYear(), weekNo];\r\n }\r\n\r\n /* Translations */\r\n function smLangGetWeekdays(languageCulture) {\r\n switch (languageCulture) {\r\n case 'cz-CZ':\r\n return ['Ned', 'pon', 'úte', 'stře', 'Čtvr', 'pát', 'sob'];\r\n case 'da-DK':\r\n return ['Søn', 'Man', 'Tirs', 'Ons', 'Tors', 'Fre', 'Lør'];\r\n case 'de-DE':\r\n return ['Son', 'Mon', 'Dien', 'Mitt', 'Donn', 'Frei', 'Sam'];\r\n case 'es-ES':\r\n return ['Dom', 'Lun', 'Mar', 'Miér', 'Jue', 'Vier', 'Sáb'];\r\n case 'fi-FI':\r\n return ['sun', 'maan', 'tiis', 'kesk', 'tors', 'perj', 'lau'];\r\n case 'fr-FR':\r\n return ['Dim', 'Lun', 'Mar', 'Merc', 'Jeu', 'Ven', 'Sam'];\r\n case 'hu-HU':\r\n return ['vasá', 'hét', 'kedd', 'szer', 'csü', 'pén', 'szom'];\r\n case 'it-IT':\r\n return ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'];\r\n case 'nb-NO':\r\n return ['Søn', 'Man', 'Tirs', 'Ons', 'Tors', 'Fre', 'Lør'];\r\n case 'nl-NL':\r\n return ['Zon', 'Maan', 'Din', 'Woen', 'Don', 'Vrij', 'zat'];\r\n case 'pl-PL':\r\n return ['Niedz.', 'Pon.', 'Wt.', 'Śr.', 'Czw.', 'Pt.', 'Sob.'];\r\n case 'pt-PT':\r\n return ['Dom', 'Seg', 'Terça', 'Quar', 'Quin', 'Sex', 'Sáb'];\r\n case 'sv-SE':\r\n return ['Sön', 'Mån', 'Tis', 'Ons', 'Tors', 'Fre', 'Lör'];\r\n default:\r\n return ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\n }\r\n }\r\n\r\n function smLangGetMonths(languageCulture) {\r\n switch (languageCulture) {\r\n case 'cz-CZ':\r\n return ['led', 'Únor', 'břez', 'dub', 'Smět', 'červen', 'červenec', 'srp', 'září', 'říj', 'list', 'pro'];\r\n case 'da-DK':\r\n return ['jan', 'febr', 'marts', 'april', 'maj', 'juni', 'juli', 'aug', 'sept', 'okt', 'nov', 'dec'];\r\n case 'de-DE':\r\n return ['Jan', 'Feb', 'Mar', 'Apr', 'Dür', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'];\r\n case 'es-ES':\r\n return ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];\r\n case 'fi-FI':\r\n return ['tamm', 'helm', 'maal', 'huh', 'saat', 'kesä', 'hein', 'elo', 'syys', 'lok', 'mar', 'joul'];\r\n case 'fr-FR':\r\n return ['jan', 'févr', 'mars', 'avril', 'mai', 'juin', 'juil', 'août', 'sept', 'octo', 'nov', 'déc'];\r\n case 'hu-HU':\r\n return ['jan', 'feb', 'már', 'ápr', 'Leh', 'jún', 'júl', 'aug', 'szep', 'okt', 'nov', 'dec'];\r\n case 'it-IT':\r\n return ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'];\r\n case 'nb-NO':\r\n return ['jan', 'febr', 'mars', 'april', 'mai', 'juni', 'juli', 'aug', 'sept', 'okt', 'nov', 'des'];\r\n case 'nl-NL':\r\n return ['Jan', 'Feb', 'Maar', 'apr', 'Kun', 'juni', 'juli', 'aug', 'sep', 'okt', 'nov', 'Dec'];\r\n case 'pl-PL':\r\n return ['Stycz.', 'Luty', 'Marz.', 'Kwieć.', 'Maj', 'Czerw.', 'Lip.', 'Sier.', 'Wrze.', 'Paź.', 'List.', 'Gru.'];\r\n case 'pt-PT':\r\n return ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'];\r\n case 'sv-SE':\r\n return ['jan', 'febr', 'mars', 'april', 'maj', 'juni', 'juli', 'aug', 'sept', 'okt', 'nov', 'dec'];\r\n default:\r\n return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n }\r\n }\r\n\r\n function smLangTranslate(textToTranslate) {\r\n\r\n switch (settings.languageCulture) {\r\n case 'cz-CZ':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Týden ';\r\n case 'Available times for ':\r\n return 'Dostupné časy pro ';\r\n case 'No results found':\r\n return 'Nebyly nalezeny žádné výsledky ';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Pro vybrané datum nejsou k dispozici žádné časové úseky, vyberte prosím jiné datum a zkuste to znovu.';\r\n case 'Your selected time slot starts on ':\r\n return 'Vámi vybraný časový úsek začíná ';\r\n case ' at ':\r\n return ' na ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Před pokračováním je nutné vybrat časový úsek. Výše vyberte datum a časový úsek.';\r\n case 'Finding time slots...':\r\n return 'Hledání časových úseků...';\r\n case 'Choose time slot':\r\n return 'Vyberte časový úsek';\r\n case 'Complete order':\r\n return 'Dokončete objednávku';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Při získávání informací o časovém úseku došlo k problému.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Při získávání informací Simple GMS došlo k problému.';\r\n case ' Return to customer details':\r\n return ' Vraťte se k podrobnostem zákazníka';\r\n case 'Complete booking':\r\n return 'Dokončete rezervaci';\r\n case 'Book your ':\r\n return 'Rezervujte si svůj ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Jméno';\r\n case 'Last name':\r\n return 'Příjmení';\r\n case 'Email address':\r\n return 'Emailová adresa';\r\n case 'Mobile no.':\r\n return 'Číslo mobilního telefonu';\r\n case 'Registration no.':\r\n return 'Evidenční číslo';\r\n case 'Address Line 1':\r\n return '1. řádek adresy';\r\n case 'Address Line 2':\r\n return '2. řádek adresy';\r\n case 'Town/City':\r\n return 'Město';\r\n case 'County/Province':\r\n return 'Okres/provincie';\r\n case 'Postcode/Zip code':\r\n return 'PSČ';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Doplňte prosím chybějící informace pro následující:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Při dokončení vaší objednávky došlo k problému. Prosím zkuste to znovu.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Zašleme vám SMS potvrzení vaší rezervace.';\r\n case 'Your work is scheduled for':\r\n return 'Vaše práce je naplánována na';\r\n case 'starting at':\r\n return 'začíná v';\r\n case 'Your order reference is':\r\n return 'Reference vaší objednávky je';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Potvrzení rezervace vám bylo zasláno prostřednictvím SMS';\r\n case 'Leave my car all day':\r\n return 'Nechte moje auto celý den';\r\n case 'Closed':\r\n return 'ZAVŘENO';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Garáž vás může kontaktovat, aby potvrdila podrobnosti vaší rezervace';\r\n case 'Booking successfully created':\r\n return 'Rezervace byla úspěšně vytvořena';\r\n case 'Processing booking...':\r\n return 'Zpracování rezervace...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'Zadaná e-mailová adresa je neplatná, zkontrolujte prosím správný formát nebo ponechte hodnotu prázdnou.';\r\n }\r\n case 'da-DK':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Uge ';\r\n case 'Available times for ':\r\n return 'Ledige tider pr ';\r\n case 'No results found':\r\n return 'Ingen resultater fundet';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Der er ingen ledige tidsrum for den valgte dato. Vælg venligst en anden dato og prøv igen.';\r\n case 'Your selected time slot starts on ':\r\n return 'Dit valgte tidsrum starter den ';\r\n case ' at ':\r\n return ' på ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Et tidsrum skal vælges, før du fortsætter. Vælg venligst en dato og et tidspunkt ovenfor.';\r\n case 'Finding time slots...':\r\n return 'Finder tidsrum...';\r\n case 'Choose time slot':\r\n return 'Vælg tidsrum';\r\n case 'Complete order':\r\n return 'Komplet ordre';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Der var et problem med at få oplysninger om tidsvinduet.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Der var et problem med at hente Simple GMS-oplysningerne.';\r\n case ' Return to customer details':\r\n return ' Vend tilbage til kundeoplysninger';\r\n case 'Complete booking':\r\n return 'Fuldfør booking';\r\n case 'Book your ':\r\n return 'Book din ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Fornavn';\r\n case 'Last name':\r\n return 'Efternavn';\r\n case 'Email address':\r\n return 'Email adresse';\r\n case 'Mobile no.':\r\n return 'Mobilnummer';\r\n case 'Registration no.':\r\n return 'Registreringsnummer';\r\n case 'Address Line 1':\r\n return 'Adresse linie 1';\r\n case 'Address Line 2':\r\n return 'Adresselinje 2';\r\n case 'Town/City':\r\n return 'By';\r\n case 'County/Province':\r\n return 'Amt/provins';\r\n case 'Postcode/Zip code':\r\n return 'Postnummer';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Udfyld venligst de manglende oplysninger for følgende:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Der var et problem med at gennemføre din ordre. Prøv igen.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Vi sender dig en SMS-bekræftelse på din reservation.';\r\n case 'Your work is scheduled for':\r\n return 'Dit arbejde er planlagt til';\r\n case 'starting at':\r\n return 'starter ved';\r\n case 'Your order reference is':\r\n return 'Din ordrereference er';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'En reservationsbekræftelse er blevet sendt til dig via SMS';\r\n case 'Leave my car all day':\r\n return 'Lad min bil stå hele dagen';\r\n case 'Closed':\r\n return 'Lukket';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Garagen kan kontakte dig for at bekræfte detaljerne i din reservation';\r\n case 'Booking successfully created':\r\n return 'Booking blev oprettet';\r\n case 'Processing booking...':\r\n return 'Behandler booking...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'Den angivne e-mailadresse er ugyldig. Sørg for, at formatet er korrekt, eller hold værdien tom.';\r\n }\r\n case 'de-DE':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Woche ';\r\n case 'Available times for ':\r\n return 'Verfügbare Zeiten für ';\r\n case 'No results found':\r\n return 'keine Ergebnisse gefunden';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Für das ausgewählte Datum sind keine Zeitfenster verfügbar. Bitte wählen Sie ein anderes Datum aus und versuchen Sie es erneut.';\r\n case 'Your selected time slot starts on ':\r\n return 'Ihr ausgewähltes Zeitfenster beginnt am ';\r\n case ' at ':\r\n return ' bei ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Bevor Sie fortfahren, muss ein Zeitfenster ausgewählt werden. Bitte wählen Sie oben ein Datum und ein Zeitfenster aus.';\r\n case 'Finding time slots...':\r\n return 'Zeitfenster finden...';\r\n case 'Choose time slot':\r\n return 'Zeitfenster wählen';\r\n case 'Complete order':\r\n return 'Bestellung abschließen';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Beim Abrufen der Zeitfensterinformationen ist ein Problem aufgetreten.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Beim Abrufen der Simple GMS-Informationen ist ein Problem aufgetreten.';\r\n case ' Return to customer details':\r\n return ' Zurück zu den Kundendetails';\r\n case 'Complete booking':\r\n return 'Buchung abschließen';\r\n case 'Book your ':\r\n return 'Buchen Sie Ihre ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Vorname';\r\n case 'Last name':\r\n return 'Nachname';\r\n case 'Email address':\r\n return 'E-Mail-Addresse';\r\n case 'Mobile no.':\r\n return 'Handy Nummer';\r\n case 'Registration no.':\r\n return 'Registrationsnummer';\r\n case 'Address Line 1':\r\n return 'Anschrift Zeile 1';\r\n case 'Address Line 2':\r\n return 'Adresszeile 2';\r\n case 'Town/City':\r\n return 'Ort/Stadt';\r\n case 'County/Province':\r\n return 'Landkreis/Provinz';\r\n case 'Postcode/Zip code':\r\n return 'Postleitzahl/PLZ';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Bitte füllen Sie die fehlenden Informationen für Folgendes aus:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Beim Abschließen Ihrer Bestellung ist ein Problem aufgetreten. Bitte versuche es erneut.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Wir senden Ihnen eine SMS-Bestätigung Ihrer Buchung.';\r\n case 'Your work is scheduled for':\r\n return 'Ihre Arbeit ist geplant für';\r\n case 'starting at':\r\n return 'beginnt um';\r\n case 'Your order reference is':\r\n return 'Ihre Bestellreferenz ist';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Eine Buchungsbestätigung wurde Ihnen per SMS zugesandt';\r\n case 'Leave my car all day':\r\n return 'Lass mein Auto den ganzen Tag stehen';\r\n case 'Closed':\r\n return 'Abgeschlossen';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Die Garage wird Sie möglicherweise kontaktieren, um die Details Ihrer Buchung zu bestätigen';\r\n case 'Booking successfully created':\r\n return 'Buchung erfolgreich erstellt';\r\n case 'Processing booking...':\r\n return 'Buchung wird bearbeitet...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'Die angegebene E-Mail-Adresse ist ungültig. Bitte stellen Sie sicher, dass das Format korrekt ist, oder lassen Sie den Wert leer.';\r\n }\r\n case 'es-ES':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Semana ';\r\n case 'Available times for ':\r\n return 'Horas disponibles para ';\r\n case 'No results found':\r\n return 'No se han encontrado resultados';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'No hay franjas horarias disponibles para la fecha seleccionada, seleccione otra fecha y vuelva a intentarlo.';\r\n case 'Your selected time slot starts on ':\r\n return 'Su intervalo de tiempo seleccionado comienza en';\r\n case ' at ':\r\n return ' a ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Se debe seleccionar un intervalo de tiempo antes de continuar. Seleccione una día y un intervalo de tiempo arriba.';\r\n case 'Finding time slots...':\r\n return 'Buscando franjas horarias...';\r\n case 'Choose time slot':\r\n return 'Elige franja horaria';\r\n case 'Complete order':\r\n return 'Orden completa';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Hubo un problema al obtener la información de la franja horaria.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Hubo un problema al obtener la información de Simple GMS.';\r\n case ' Return to customer details':\r\n return ' Volver a los detalles del cliente';\r\n case 'Complete booking':\r\n return 'Reserva completa';\r\n case 'Book your ':\r\n return 'Reserva tu ';\r\n case ' online':\r\n return ' Online';\r\n case 'First name':\r\n return 'Nombre';\r\n case 'Last name':\r\n return 'Apellido';\r\n case 'Email address':\r\n return 'Dirección de correo electrónico';\r\n case 'Mobile no.':\r\n return 'Número de teléfono móvil';\r\n case 'Registration no.':\r\n return 'Número de registro';\r\n case 'Address Line 1':\r\n return 'Dirección Línea 1';\r\n case 'Address Line 2':\r\n return 'Dirección Línea 2';\r\n case 'Town/City':\r\n return 'Pueblo/Ciudad';\r\n case 'County/Province':\r\n return 'País/Provincia';\r\n case 'Postcode/Zip code':\r\n return 'Código postal';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Complete la información que falta para lo siguiente:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Hubo un problema al completar su pedido. Inténtalo de nuevo.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Le enviaremos un SMS de confirmación de su reserva.';\r\n case 'Your work is scheduled for':\r\n return 'Su trabajo está programado para';\r\n case 'starting at':\r\n return 'a partir de';\r\n case 'Your order reference is':\r\n return 'La referencia de su pedido es';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Se le ha enviado una confirmación de la reserva por SMS';\r\n case 'Leave my car all day':\r\n return 'Dejar mi coche todo el día.';\r\n case 'Closed':\r\n return 'Cerrado';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'El garaje puede contactarlo para confirmar los detalles de su reserva.';\r\n case 'Booking successfully created':\r\n return 'Reserva creada con éxito';\r\n case 'Processing booking...':\r\n return 'Procesando reserva...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'La dirección de correo electrónico proporcionada no es válida, asegúrese de que el formato sea correcto o deje el valor en blanco.';\r\n }\r\n case 'fi-FI':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Viikko ';\r\n case 'Available times for ':\r\n return 'Vapaita aikoja ';\r\n case 'No results found':\r\n return 'Ei tuloksia';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Valitulle päivälle ei ole vapaita aikoja. Valitse toinen päivämäärä ja yritä uudelleen.';\r\n case 'Your selected time slot starts on ':\r\n return 'Valitsemasi aikaväli alkaa';\r\n case ' at ':\r\n return ' klo ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Aikaväli on valittava ennen jatkamista. Valitse päivämäärä ja aika ylhäältä.';\r\n case 'Finding time slots...':\r\n return 'Haetaan aikoja...';\r\n case 'Choose time slot':\r\n return 'Valitse aikaväli';\r\n case 'Complete order':\r\n return 'Tee tilaus';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Aikavälitietojen saamisessa oli ongelma.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Simple GMS -tietojen saamisessa oli ongelma.';\r\n case ' Return to customer details':\r\n return ' Palaa asiakastietoihin';\r\n case 'Complete booking':\r\n return 'Täydellinen varaus';\r\n case 'Book your ':\r\n return 'Varaa omasi ';\r\n case ' online':\r\n return ' verkossa';\r\n case 'First name':\r\n return 'Etunimi';\r\n case 'Last name':\r\n return 'Sukunimi';\r\n case 'Email address':\r\n return 'Sähköpostiosoite';\r\n case 'Mobile no.':\r\n return 'Matkapuhelinnumero';\r\n case 'Registration no.':\r\n return 'Rekisterinumero';\r\n case 'Address Line 1':\r\n return 'Osoiterivi 1';\r\n case 'Address Line 2':\r\n return 'Osoiterivi 2';\r\n case 'Town/City':\r\n return 'Kaupunki';\r\n case 'County/Province':\r\n return 'Maakunta';\r\n case 'Postcode/Zip code':\r\n return 'postinumero';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Täytä seuraavat puuttuvat tiedot:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Tilauksen viimeistelyssä oli ongelma. Yritä uudelleen.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Lähetämme sinulle tekstiviestin vahvistuksen varauksestasi.';\r\n case 'Your work is scheduled for':\r\n return 'Työsi on ajoitettu';\r\n case 'starting at':\r\n return 'alkaen';\r\n case 'Your order reference is':\r\n return 'Tilauksesi viite on';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Varausvahvistus on lähetetty sinulle tekstiviestillä';\r\n case 'Leave my car all day':\r\n return 'Jätä autoni koko päiväksi';\r\n case 'Closed':\r\n return 'Suljettu';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Autotalli voi ottaa sinuun yhteyttä vahvistaakseen varauksesi tiedot';\r\n case 'Booking successfully created':\r\n return 'Varaus luotu onnistuneesti';\r\n case 'Processing booking...':\r\n return 'Käsitellään varausta...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'Annettu sähköpostiosoite on virheellinen. Varmista, että muoto on oikea tai jätä arvo tyhjäksi.';\r\n }\r\n case 'fr-FR':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'La semaine ';\r\n case 'Available times for ':\r\n return 'Horaires disponibles pour ';\r\n case 'No results found':\r\n return 'Aucun résultat trouvé';\r\n case 'There are no available time slots for the date selected, please select another date and try again.': // TEMPORARY -- For First Stop switch off\r\n return 'Pour des raisons techniques, nous ne sommes pas en mesure d\\'afficher les rendez-vous disponibles. Afin de confirmer les prix des produits, de finaliser votre commande et de sélectionner votre heure de rendez-vous, veuillez contacter directement un centre First Stop. Trouvez le centre First Stop le plus proche ici. https://www.firststop.fr/garage-pneus.html';\r\n case 'Your selected time slot starts on ':\r\n return 'Votre créneau horaire sélectionné commence le ';\r\n case ' at ':\r\n return ' à ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Un créneau horaire doit être sélectionné avant de continuer. Veuillez sélectionner une date et un créneau horaire ci-dessus.';\r\n case 'Finding time slots...':\r\n return 'Recherche de plages horaires...';\r\n case 'Choose time slot':\r\n return 'Choisissez la plage horaire';\r\n case 'Complete order':\r\n return 'Complétez la commande';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Un problème est survenu lors de l\\'obtention des informations sur la plage horaire.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Un problème est survenu lors de l\\'obtention des informations GMS simples.';\r\n case ' Return to customer details':\r\n return ' Retour aux détails du client.';\r\n case 'Complete booking':\r\n return 'Réservation complète';\r\n case 'Book your ':\r\n return 'Réservez votre ';\r\n case ' online':\r\n return ' en ligne';\r\n case 'First name':\r\n return 'Prénom';\r\n case 'Last name':\r\n return 'Nom de famille';\r\n case 'Email address':\r\n return 'Adresse e-mail';\r\n case 'Mobile no.':\r\n return 'Numéro de portable';\r\n case 'Registration no.':\r\n return 'Numéro d\\'enregistrement';\r\n case 'Address Line 1':\r\n return 'Adresse 1';\r\n case 'Address Line 2':\r\n return 'Adresse 2';\r\n case 'Town/City':\r\n return 'Ville';\r\n case 'County/Province':\r\n return 'Comté/Province';\r\n case 'Postcode/Zip code':\r\n return 'Code postal';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Veuillez remplir les informations manquantes pour les éléments suivants :';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Un problème est survenu lors de la finalisation de votre commande. Veuillez réessayer.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Nous vous enverrons un SMS de confirmation de votre réservation.';\r\n case 'Your work is scheduled for':\r\n return 'Votre travail est prévu pour';\r\n case 'starting at':\r\n return 'à partir de';\r\n case 'Your order reference is':\r\n return 'Votre référence de commande est';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Une confirmation de réservation vous a été envoyée par SMS';\r\n case 'Leave my car all day':\r\n return 'Laisse ma voiture toute la journée';\r\n case 'Closed':\r\n return 'Fermée';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Le garage peut vous contacter pour confirmer les détails de votre réservation';\r\n case 'Booking successfully created':\r\n return 'Réservation créée avec succès';\r\n case 'Processing booking...':\r\n return 'Traitement de la réservation...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'L\\'adresse e - mail fournie n\\'est pas valide, veuillez vous assurer que le format est correct ou laissez la valeur vide.';\r\n }\r\n case 'hu-HU':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Hét ';\r\n case 'Available times for ':\r\n return 'Rendelkezésre álló időpontok ';\r\n case 'No results found':\r\n return 'Nincs találat';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'A kiválasztott dátumhoz nem állnak rendelkezésre szabad időpontok. Kérjük, válasszon másik dátumot, és próbálja újra.';\r\n case 'Your selected time slot starts on ':\r\n return 'A kiválasztott időintervallum ekkor kezdődik';\r\n case ' at ':\r\n return ' nál nél ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'A folytatás előtt ki kell választani egy idősávot. Kérjük, válasszon egy dátumot és időpontot fent.';\r\n case 'Finding time slots...':\r\n return 'Időpontok keresése...';\r\n case 'Choose time slot':\r\n return 'Válasszon idősávot';\r\n case 'Complete order':\r\n return 'Teljes rendelés';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Hiba történt az időrés információinak lekérésekor.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Probléma lépett fel a Simple GMS információinak lekérésekor.';\r\n case ' Return to customer details':\r\n return ' Vissza az ügyfél adataihoz';\r\n case 'Complete booking':\r\n return 'Teljes foglalás';\r\n case 'Book your ':\r\n return 'Foglalja le ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Keresztnév';\r\n case 'Last name':\r\n return 'Vezetéknév';\r\n case 'Email address':\r\n return 'Email cím';\r\n case 'Mobile no.':\r\n return 'Mobil szám';\r\n case 'Registration no.':\r\n return 'Regisztrációs szám';\r\n case 'Address Line 1':\r\n return 'Címsor 1';\r\n case 'Address Line 2':\r\n return 'Cím sor 2';\r\n case 'Town/City':\r\n return 'Város';\r\n case 'County/Province':\r\n return 'Megye/tartomány';\r\n case 'Postcode/Zip code':\r\n return 'Irányítószám';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Kérjük, töltse ki a hiányzó adatokat az alábbiakhoz:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Hiba történt a rendelés teljesítése során. Kérlek próbáld újra.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Foglalásáról SMS-ben visszaigazolást küldünk.';\r\n case 'Your work is scheduled for':\r\n return 'A munkád be van ütemezve';\r\n case 'starting at':\r\n return 'kezdve';\r\n case 'Your order reference is':\r\n return 'Megrendelésed referenciája a';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'A foglalás visszaigazolását SMS-ben küldtük el';\r\n case 'Leave my car all day':\r\n return 'Hagyja az autómat egész nap';\r\n case 'Closed':\r\n return 'Zárva';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'A garázs kapcsolatba léphet Önnel a foglalás részleteinek megerősítése érdekében';\r\n case 'Booking successfully created':\r\n return 'A foglalás sikeresen létrejött';\r\n case 'Processing booking...':\r\n return 'Foglalás feldolgozása...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'A megadott e-mail cím érvénytelen, kérjük, ellenőrizze a formátumot, vagy hagyja üresen az értéket.';\r\n }\r\n case 'it-IT':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Settimana ';\r\n case 'Available times for ':\r\n return 'Orari disponibili per ';\r\n case 'No results found':\r\n return 'Nessun risultato trovato';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Per problemi tecnici non siamo in grado di visualizzare degli slot disponibili. Per confermare i prezzi dei prodotti, finalizzare l\\'ordine e selezionare l\\'orario dell\\'appuntamento, si prega di contattare direttamente il rivenditore locale. Trova il tuo rivenditore First Stop locale qui https://www.firststop.it/gommista.html';\r\n case 'Your selected time slot starts on ':\r\n return 'Hai selezionato ';\r\n case ' at ':\r\n return ' a ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'È necessario selezionare una fascia oraria prima di procedere. Seleziona una data e una fascia oraria sopra.';\r\n case 'Finding time slots...':\r\n return 'Trovare le fasce orarie...';\r\n case 'Choose time slot':\r\n return 'Scegli fascia oraria';\r\n case 'Complete order':\r\n return 'Ordine completato';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Si è verificato un problema durante il recupero delle informazioni sulla fascia oraria.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Si è verificato un problema durante il recupero delle informazioni sul GMS semplice.';\r\n case ' Return to customer details':\r\n return ' Ritorna ai dettagli del cliente';\r\n case 'Complete booking':\r\n return 'Prenotazione completata';\r\n case 'Book your ':\r\n return 'Prenota il tuo ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Nome';\r\n case 'Last name':\r\n return 'Cognome';\r\n case 'Email address':\r\n return 'e-mail';\r\n case 'Mobile no.':\r\n return 'Cellulare';\r\n case 'Registration no.':\r\n return 'Registrazione N.';\r\n case 'Address Line 1':\r\n return 'Indirizzo Linea 1';\r\n case 'Address Line 2':\r\n return 'Indirizzo Linea 2';\r\n case 'Town/City':\r\n return 'Città';\r\n case 'County/Province':\r\n return 'Provincia';\r\n case 'Postcode/Zip code':\r\n return 'CAP';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Si prega di compilare le informazioni mancanti:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Si è verificato un problema durante il completamento dell\\'ordine.Ti preghiamo di riprovare.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Ti invieremo un SMS di conferma della tua prenotazione.';\r\n case 'Your work is scheduled for':\r\n return 'Il tuo appuntamento è programmato per';\r\n case 'starting at':\r\n return 'alle ore';\r\n case 'Your order reference is':\r\n return 'Il tuo riferimento d\\'ordine è';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Ti è stata inviata una conferma di prenotazione via SMS';\r\n case 'Leave my car all day':\r\n return 'Lascio la mia auto per tutto il giorno';\r\n case 'Closed':\r\n return 'Chiuso';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Il Centro First Stop selezionato potrebbe contattarti per confermare i dettagli della tua prenotazione.';\r\n case 'Booking successfully created':\r\n return 'Prenotazione creata con successo';\r\n case 'Processing booking...':\r\n return 'Prenotazione in elaborazione...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'L\\'indirizzo e - mail fornito non è valido, assicurati che il formato sia corretto.';\r\n }\r\n case 'nb-NO':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Uke ';\r\n case 'Available times for ':\r\n return 'Tilgjengelige tider for ';\r\n case 'No results found':\r\n return 'Ingen resultater';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Det er ingen tilgjengelige tidsluker for den valgte datoen. Velg en annen dato og prøv igjen.';\r\n case 'Your selected time slot starts on ':\r\n return 'Din valgte tidsluke starter på ';\r\n case ' at ':\r\n return ' på ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'En tidsluke må velges før du fortsetter. Velg dato og klokkeslett ovenfor.';\r\n case 'Finding time slots...':\r\n return 'Finner tidsluker...';\r\n case 'Choose time slot':\r\n return 'Velg tidsluke';\r\n case 'Complete order':\r\n return 'Fullfør bestilling';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Det oppsto et problem med å få informasjon om tidsluke.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Det oppsto et problem med å hente Simple GMS-informasjonen.';\r\n case ' Return to customer details':\r\n return ' Gå tilbake til kundeinformasjon';\r\n case 'Complete booking':\r\n return 'Fullfør booking';\r\n case 'Book your ':\r\n return 'Bestill din ';\r\n case ' online':\r\n return ' på nett';\r\n case 'First name':\r\n return 'Fornavn';\r\n case 'Last name':\r\n return 'Etternavn';\r\n case 'Email address':\r\n return 'Epostadresse';\r\n case 'Mobile no.':\r\n return 'Mobilnummer';\r\n case 'Registration no.':\r\n return 'Registreringsnummer';\r\n case 'Address Line 1':\r\n return 'Adresselinje 1';\r\n case 'Address Line 2':\r\n return 'Adresselinje 2';\r\n case 'Town/City':\r\n return 'By';\r\n case 'County/Province':\r\n return 'Fylke/provins';\r\n case 'Postcode/Zip code':\r\n return 'Postnummer';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Vennligst fyll inn den manglende informasjonen for følgende:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Det oppsto et problem med å fullføre bestillingen din. Vær så snill, prøv på nytt.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Vi sender deg en SMS-bekreftelse på din bestilling.';\r\n case 'Your work is scheduled for':\r\n return 'Arbeidet ditt er planlagt til';\r\n case 'starting at':\r\n return 'starter på';\r\n case 'Your order reference is':\r\n return 'Din bestillingsreferanse er';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'En bestillingsbekreftelse er sendt til deg via SMS';\r\n case 'Leave my car all day':\r\n return 'La bilen stå hele dagen';\r\n case 'Closed':\r\n return 'Lukket';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Garasjen kan kontakte deg for å bekrefte detaljene for bestillingen din';\r\n case 'Booking successfully created':\r\n return 'Bestilling er opprettet';\r\n case 'Processing booking...':\r\n return 'Behandler bestilling...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'E-postadressen som er oppgitt er ugyldig, sørg for at formatet er riktig eller la verdien stå tom.';\r\n }\r\n case 'nl-NL':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Week ';\r\n case 'Available times for ':\r\n return 'Beschikbare tijden voor ';\r\n case 'No results found':\r\n return 'geen resultaten gevonden';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Er zijn geen tijdslots beschikbaar voor de geselecteerde datum, selecteer een andere datum en probeer het opnieuw.';\r\n case 'Your selected time slot starts on ':\r\n return 'Uw geselecteerde tijdslot gaat in op ';\r\n case ' at ':\r\n return ' bij ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Er moet een tijdslot worden geselecteerd voordat u verder gaat. Selecteer hierboven een datum en tijdslot.';\r\n case 'Finding time slots...':\r\n return 'Tijdslots zoeken...';\r\n case 'Choose time slot':\r\n return 'Kies tijdslot';\r\n case 'Complete order':\r\n return 'Volledige bestelling';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Er is een probleem opgetreden bij het ophalen van de informatie over het tijdslot.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Er is een probleem opgetreden bij het ophalen van de Simple GMS-informatie.';\r\n case ' Return to customer details':\r\n return ' Terug naar klantgegevens';\r\n case 'Complete booking':\r\n return 'Volledige boeking';\r\n case 'Book your ':\r\n return 'Boek uw ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Voornaam';\r\n case 'Last name':\r\n return 'Achternaam';\r\n case 'Email address':\r\n return 'E-mailadres';\r\n case 'Mobile no.':\r\n return 'Mobiel nummer';\r\n case 'Registration no.':\r\n return 'Registratie nummer';\r\n case 'Address Line 1':\r\n return 'Adres regel 1';\r\n case 'Address Line 2':\r\n return 'Adres lijn 2';\r\n case 'Town/City':\r\n return 'Stad';\r\n case 'County/Province':\r\n return 'Provincie';\r\n case 'Postcode/Zip code':\r\n return 'Postcode';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Vul de ontbrekende informatie in voor het volgende:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Er is een probleem opgetreden bij het voltooien van uw bestelling. Probeer het opnieuw.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'We sturen je een sms-bevestiging van je boeking.';\r\n case 'Your work is scheduled for':\r\n return 'Je werk staat gepland voor';\r\n case 'starting at':\r\n return 'beginnend bij';\r\n case 'Your order reference is':\r\n return 'Uw bestelreferentie is';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Er is een boekingsbevestiging per sms naar u verzonden';\r\n case 'Leave my car all day':\r\n return 'Laat mijn auto de hele dag staan';\r\n case 'Closed':\r\n return 'Gesloten';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'De garage kan contact met u opnemen om de details van uw reservering te bevestigen';\r\n case 'Booking successfully created':\r\n return 'Boeking succesvol aangemaakt';\r\n case 'Processing booking...':\r\n return 'Boeking verwerken...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'Het opgegeven e-mailadres is ongeldig. Zorg ervoor dat het formaat correct is of laat de waarde leeg.';\r\n }\r\n case 'pl-PL':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Tydzień ';\r\n case 'Available times for ':\r\n return 'Dostępne terminy ';\r\n case 'No results found':\r\n return 'Brak wyników';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n // return 'Brak dostępnych przedziałów czasowych dla wybranej daty, wybierz inną datę i spróbuj ponownie.';\r\n return 'Z powodów technicznych nie możemy wyświetlić wolnych terminów. W celu umówienia wizyty znajdź najbliższy warsztat i skontaktuj się z nim bezpośrednio: https://www.firststop.pl/znajdz-warsztat.html';\r\n case 'Your selected time slot starts on ':\r\n return 'Wybrany przez Ciebie przedział czasowy zaczyna się ';\r\n case ' at ':\r\n return ' w ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Przed kontynuowaniem należy wybrać termin. Wybierz datę i godzinę powyżej.';\r\n case 'Finding time slots...':\r\n return 'Znajdowanie terminu...';\r\n case 'Choose time slot':\r\n return 'Wybierz termin';\r\n case 'Complete order':\r\n return 'Zamów';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Podczas pobierania informacji o terminie wystąpił problem.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Wystąpił problem z uzyskaniem informacji Simple GMS.';\r\n case ' Return to customer details':\r\n return ' Wróć do danych klienta';\r\n case 'Complete booking':\r\n return 'Dokończ rezerwację';\r\n case 'Book your ':\r\n return 'Zarezerwuj swój ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Imię';\r\n case 'Last name':\r\n return 'Nazwisko';\r\n case 'Email address':\r\n return 'Adres e-mail';\r\n case 'Mobile no.':\r\n return 'Numer telefonu';\r\n case 'Registration no.':\r\n return 'Numer rejestracyjny';\r\n case 'Address Line 1':\r\n return 'Linia adresu 1';\r\n case 'Address Line 2':\r\n return 'Linia adresowa 2';\r\n case 'Town/City':\r\n return 'Miasto';\r\n case 'County/Province':\r\n return 'Województwo';\r\n case 'Postcode/Zip code':\r\n return 'Kod pocztowy';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Proszę uzupełnić brakujące informacje dla:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Wystąpił problem podczas realizacji Twojego zamówienia. Proszę spróbuj ponownie.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Wyślemy Ci SMS-owe potwierdzenie rezerwacji.';\r\n case 'Your work is scheduled for':\r\n return 'Twoja praca jest zaplanowana na godz';\r\n case 'starting at':\r\n return 'start o';\r\n case 'Your order reference is':\r\n return 'Numer referencyjny Twojego zamówienia to';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Potwierdzenie rezerwacji zostało wysłane do Ciebie SMS-em';\r\n case 'Leave my car all day':\r\n return 'Zostaw mój samochód na cały dzień';\r\n case 'Closed':\r\n return 'Zamknięte';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Warsztat może się z Tobą skontaktować, w celu potwierdzenia terminu';\r\n case 'Booking successfully created':\r\n return 'Pomyślnie utworzono rezerwację';\r\n case 'Processing booking...':\r\n return 'Przetwarzanie rezerwacji...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'Podany adres e-mail jest nieprawidłowy. Upewnij się, że format jest prawidłowy lub pozostaw pole puste.';\r\n }\r\n case 'pt-PT':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Semana ';\r\n case 'Available times for ':\r\n return 'Horários disponíveis ';\r\n case 'No results found':\r\n return 'Não foi encontrato qualquer resultado';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Não existem horários disponíveis para a data selecionada. Por favor, selecione outra data e tente novamente.';\r\n case 'Your selected time slot starts on ':\r\n return 'O horário selecionado começa em ';\r\n case ' at ':\r\n return ' no ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'Deve selecionar um horário disponível antes de prosseguir. Por favor, selecione uma data e horário acima.';\r\n case 'Finding time slots...':\r\n return 'Procurando horários...';\r\n case 'Choose time slot':\r\n return 'Escolha um horário';\r\n case 'Complete order':\r\n return 'Ordem completa';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Ocorreu um problema ao obter as informações do horário disponível.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Ocorreu um problema ao obter as informações do horário simples disponível.';\r\n case ' Return to customer details':\r\n return ' Regressar à informação detalhada do Cliente';\r\n case 'Complete booking':\r\n return 'Pedido de marcação completo';\r\n case 'Book your ':\r\n return 'Marque o seu ';\r\n case ' online':\r\n return ' online';\r\n case 'First name':\r\n return 'Primeiro nome';\r\n case 'Last name':\r\n return 'Ultimo nome';\r\n case 'Email address':\r\n return 'Endereço de e-mail';\r\n case 'Mobile no.':\r\n return 'Número de Telemóvel';\r\n case 'Registration no.':\r\n return 'Número de registro';\r\n case 'Address Line 1':\r\n return 'Morada Linha 1';\r\n case 'Address Line 2':\r\n return 'Morada Linha 2';\r\n case 'Town/City':\r\n return 'Cidade';\r\n case 'County/Province':\r\n return 'Distrito';\r\n case 'Postcode/Zip code':\r\n return 'Código Postal';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Por favor, preencha as informações em falta para:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Ocorreu um problema ao concluir seu pedido. Por favor, tente novamente.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Iremos enviar-lhe um SMS de confirmação da sua marcação.';\r\n case 'Your work is scheduled for':\r\n return 'A sua marcação está agendado para';\r\n case 'starting at':\r\n return 'Início';\r\n case 'Your order reference is':\r\n return 'A referência do pedido de marcação é';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'Foi enviada uma confirmação da marcação por SMS. Por favor, confirme.';\r\n case 'Leave my car all day':\r\n return 'Deixar a minha a viatura todo o dia';\r\n case 'Closed':\r\n return 'Encerrados';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'A Oficina First Stop pode entrar em contato consigo para confirmar os detalhes da sua marcação';\r\n case 'Booking successfully created':\r\n return 'Marcação efetuada com sucesso';\r\n case 'Processing booking...':\r\n return 'A processar a marcação...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'O endereço de e-mail fornecido é inválido, por favor verifique se o formato introduzido está correto ou deixe o valor em branco.';\r\n }\r\n case 'sv-SE':\r\n switch (textToTranslate) {\r\n case 'Week ':\r\n return 'Vecka ';\r\n case 'Available times for ':\r\n return 'Tillgängliga tider för ';\r\n case 'No results found':\r\n return 'Nej resultat hittades';\r\n case 'There are no available time slots for the date selected, please select another date and try again.':\r\n return 'Det finns inga tillgängliga tidsluckor för det valda datumet, välj ett annat datum och försök igen.';\r\n case 'Your selected time slot starts on ':\r\n return 'Din valda tidslucka börjar ons ';\r\n case ' at ':\r\n return ' kl. ';\r\n case 'A time slot must be selected before proceeding. Please select a date and time slot above.':\r\n return 'En tidsperiod måste väljas innan du kan fortsätta. Vänligen välj ett passande datum och tid ovan.';\r\n case 'Finding time slots...':\r\n return 'Hitta tidsluckor...';\r\n case 'Choose time slot':\r\n return 'Välj tidslucka';\r\n case 'Complete order':\r\n return 'Fullständig beställning';\r\n case 'There was an issue getting the timeslot information.':\r\n return 'Det var ett problem att få timeslot-informationen.';\r\n case 'There was an issue getting the Simple GMS information.':\r\n return 'Det uppstod ett problem med att få information om Simple GMS.';\r\n case ' Return to customer details':\r\n return ' Återgå till kunduppgifter.';\r\n case 'Complete booking':\r\n return 'Komplett bokning';\r\n case 'Book your ':\r\n return 'Boka din ';\r\n case ' online':\r\n return ' uppkopplad';\r\n case 'First name':\r\n return 'Förnamn';\r\n case 'Last name':\r\n return 'Efternamn';\r\n case 'Email address':\r\n return 'E-postadress';\r\n case 'Mobile no.':\r\n return 'Mobilnummer';\r\n case 'Registration no.':\r\n return 'Registreringsnummer';\r\n case 'Address Line 1':\r\n return 'Adressrad 1';\r\n case 'Address Line 2':\r\n return 'Adressrad 2';\r\n case 'Town/City':\r\n return 'Stad';\r\n case 'County/Province':\r\n return 'Grevskap/Provins';\r\n case 'Postcode/Zip code':\r\n return 'Postnummer';\r\n case 'Please fill in the missing information for the following:':\r\n return 'Fyll i den saknade informationen för följande:';\r\n case 'There was an issue completing your order. Please try again.':\r\n return 'Det var ett problem med att slutföra din beställning. Försök igen.';\r\n case 'We will send you an SMS confirmation of your booking.':\r\n return 'Vi skickar en SMS-bekräftelse på din bokning.';\r\n case 'Your work is scheduled for':\r\n return 'Ditt arbete är planerat till';\r\n case 'starting at':\r\n return 'börjar vid';\r\n case 'Your order reference is':\r\n return 'Din beställningsreferens är';\r\n case 'A booking confirmation has been sent to you via SMS':\r\n return 'En bokningsbekräftelse har skickats till dig via SMS';\r\n case 'Leave my car all day':\r\n return 'Mötet hela dagen, lämna tidigt, hämta senare';\r\n case 'Closed':\r\n return 'Stängd';\r\n case 'The garage may contact you to confirm details of your booking':\r\n return 'Garaget kan kontakta dig för att bekräfta informationen om din bokning';\r\n case 'Booking successfully created':\r\n return 'Bokningen har skapats';\r\n case 'Processing booking...':\r\n return 'Bearbetar bokning...';\r\n case 'The email address provided is invalid, please ensure the format is correct or keep the value blank.':\r\n return 'Den angivna e-postadressen är ogiltig, se till att formatet är korrekt eller håll värdet tomt.';\r\n }\r\n break;\r\n }\r\n\r\n return textToTranslate;\r\n }\r\n\r\n function isInteger(num) {\r\n return (num ^ 0) === num;\r\n }\r\n\r\n function buildHiddenField(id, value) {\r\n\r\n var hiddenInput = document.createElement('input');\r\n\r\n hiddenInput.id = id;\r\n hiddenInput.type = 'hidden';\r\n hiddenInput.value = value;\r\n\r\n return hiddenInput;\r\n\r\n }\r\n\r\n function buildTextField(id, displayName, required, description) {\r\n\r\n // Build the container div\r\n var fieldContainer = buildElement('div', '', 'col-12 ' + (settings.singleColumn == true ? '' : 'col-md-6') + ' gms-form-group', '');\r\n\r\n // Label\r\n fieldContainer.appendChild(buildElement('label', id + '-label', (required == true ? 'gms-required-lbl' : '') + ' gms-font-weight-bold', displayName));\r\n\r\n // Add the input to the container\r\n fieldContainer.appendChild(buildElement('input', id, 'gms-form-control', ''));\r\n\r\n if (description != undefined && description != '') {\r\n fieldContainer.appendChild(buildElement('small', id + '-description', 'gms-d-block', description));\r\n }\r\n\r\n // Return the completed div\r\n return fieldContainer;\r\n\r\n }\r\n\r\n function buildButton(id, text, disabled) {\r\n\r\n // Button wrapper\r\n var button = buildElement('button', id, 'gms-continue-btn', '');\r\n\r\n if (disabled == true) {\r\n button.setAttribute('disabled', true);\r\n }\r\n\r\n // Button inner\r\n var buttonInner = buildElement('span', '', 'gms-btn-inner', '');\r\n\r\n // Button text\r\n buttonInner.appendChild(buildElement('span', '', 'gms-btn-text', smLangTranslate(text)));\r\n\r\n // Button arrow\r\n buttonInner.appendChild(buildElement('div', '', 'gms-btn-icon', GetSVGMarkup('long-arrow-right', 'gms-btn-icon')));\r\n\r\n // Add the button inner elements to the button markup\r\n button.appendChild(buttonInner);\r\n\r\n return button;\r\n\r\n }\r\n\r\n // Create a HTML DOM element (span, div etc.)\r\n function buildElement(elementType, id, classes, innerHTML) {\r\n\r\n var element = document.createElement(elementType);\r\n\r\n if (id != undefined && id != '') {\r\n element.id = id;\r\n }\r\n\r\n if (classes != undefined && classes != '') {\r\n element.className = classes;\r\n }\r\n\r\n if (innerHTML != undefined && innerHTML != '') {\r\n element.innerHTML = innerHTML;\r\n }\r\n\r\n return element;\r\n\r\n }\r\n\r\n function returnToStep(newStep) {\r\n\r\n var step1 = document.getElementById('gms-service-container');\r\n var step2 = document.getElementById('gms-slot-container');\r\n\r\n if (newStep == 1) {\r\n step1.classList.remove('gms-d-none');\r\n step2.classList.add('gms-d-none');\r\n } else if (newStep == 2) {\r\n step1.classList.add('gms-d-none');\r\n step2.classList.remove('gms-d-none');\r\n }\r\n\r\n }\r\n\r\n function createWidgetContainer(wrapper) {\r\n\r\n // Look for an existing container - use that if it already exists\r\n var existingContainer = document.getElementById(settings.container != null && settings.container != undefined ? settings.container : 'gms-calendar-widget-container'),\r\n settingsContainer = document.getElementById(settings.container),\r\n defaultContainerId = 'gms-calendar-widget-container';\r\n\r\n if (existingContainer != null && existingContainer != undefined) {\r\n\r\n existingContainer.appendChild(wrapper);\r\n\r\n } else if (settings.container !== undefined && (settingsContainer !== null && settingsContainer !== undefined)) {\r\n\r\n // Append wrapper to container.\r\n if (!settingsContainer.classList.contains(defaultContainerId)) {\r\n settingsContainer.className += ' ' + defaultContainerId;\r\n }\r\n\r\n settingsContainer.appendChild(wrapper);\r\n\r\n } else {\r\n\r\n // Create container.\r\n var container = buildElement('div', defaultContainerId, 'gms-calendar-widget-container', '');\r\n\r\n // Update the settings container to use the auto-generated Id (prevents duplicate containers)\r\n settings.container = defaultContainerId;\r\n\r\n // Insert container onto page at the end of the body.\r\n document.body.appendChild(container);\r\n\r\n // Append widget to new container.\r\n document.getElementById(container.id).appendChild(wrapper);\r\n\r\n }\r\n\r\n }\r\n\r\n function postAjax(url, data, type) {\r\n\r\n const request = new XMLHttpRequest();\r\n\r\n request.open('POST', url, true);\r\n request.setRequestHeader('Content-Type', 'application/json');\r\n\r\n // Connection error\r\n request.onerror = function (xhr) {\r\n buildErrorMessage(smLangTranslate('There was an issue getting the Simple GMS information.'));\r\n console.log(xhr.responseText);\r\n };\r\n\r\n // Response has been returned.\r\n request.onload = function () {\r\n\r\n switch (type) {\r\n case \"serviceSettings\":\r\n serviceSettingsSuccess(request.response);\r\n break;\r\n case \"locationSettings\":\r\n locationSettingsSuccess(request.response);\r\n break;\r\n case \"timeSlot\":\r\n timeSlotSuccess(request.response);\r\n break;\r\n case \"booking\":\r\n bookingSuccess(request.response);\r\n }\r\n\r\n }\r\n\r\n // Request has finished.\r\n request.onloadend = function () {\r\n\r\n switch (type) {\r\n case \"timeSlot\":\r\n timeSlotDone();\r\n break;\r\n case \"booking\":\r\n bookingDone();\r\n break;\r\n }\r\n\r\n }\r\n\r\n request.send(JSON.stringify(data));\r\n\r\n return request;\r\n\r\n }\r\n\r\n function serviceSettingsSuccess(data) {\r\n\r\n // Convert the widget config into a usable JSON object\r\n var obj = JSON.parse(data);\r\n\r\n if (obj.StatusResult.Success === true) {\r\n\r\n // Assign the config values\r\n updateSettingProperty('bayIds', obj.BayIds);\r\n updateSettingProperty('container', obj.ContainerId);\r\n updateSettingProperty('jobMins', obj.JobMins, true);\r\n updateSettingProperty('jobSheetTemplateId', obj.JobSheetTemplateId);\r\n updateSettingProperty('primaryColour', obj.PrimaryColour);\r\n updateSettingProperty('serviceName', obj.ServiceName);\r\n updateSettingProperty('serviceDescription', obj.Description);\r\n updateSettingProperty('serviceIcon', obj.ServiceIcon);\r\n updateSettingProperty('serviceTimeEstimate', obj.TimeEstimate);\r\n updateSettingProperty('servicePrice', obj.ServicePrice);\r\n updateSettingProperty('servicePriceSolus', obj.ServicePriceSolus);\r\n updateSettingProperty('singleColumn', obj.SingleColumn);\r\n updateSettingProperty('autoSendToCustomer', obj.AutoSendToCustomer);\r\n updateSettingProperty('includeCustomerAddressFields', obj.IncludeCustomerAddressFields);\r\n updateSettingProperty('gmsEarliestAvailableStart', obj.EarliestAvailableDate);\r\n\r\n // Create the service form and initialise the form submission logic\r\n loadCss();\r\n buildService();\r\n initCustomerInfoSubmission();\r\n initLocationSettings(initialLoad);\r\n\r\n } else {\r\n buildErrorMessage(smLangTranslate('There was an issue getting the Simple GMS information.'));\r\n console.log(data);\r\n }\r\n\r\n }\r\n\r\n function locationSettingsSuccess(data) {\r\n\r\n // Convert the location config into a usable JSON object\r\n var obj = JSON.parse(data);\r\n\r\n if (obj.StatusResult.Success === true) {\r\n\r\n // Assign the config values\r\n updateSettingProperty('weeksToDisplay', obj.WidgetWeeksToDisplay);\r\n updateSettingProperty('minsToResetSelection', obj.WidgetMinsToReset);\r\n updateSettingProperty('defaultDay', obj.WidgetDefaultDay);\r\n updateSettingProperty('daysOfWeekClosed', obj.DaysOfWeekClosed);\r\n updateSettingProperty('useWeekNumbers', obj.UseWeekNumbers);\r\n updateSettingProperty('showAllDayOption', obj.ShowAllDayOption);\r\n updateSettingProperty('slotType', obj.SlotType);\r\n updateSettingProperty('ignoreJobAvailability', obj.IgnoreJobAvailability);\r\n updateSettingProperty('showOperatingHours', obj.ShowOperatingHours);\r\n updateSettingProperty('operatingHoursDisplay', obj.OperatingHoursDisplay);\r\n updateSettingProperty('showSlotEnd', obj.ShowSlotEnd);\r\n updateSettingProperty('gmsEarliestAvailableStart', obj.EarliestAvailableDate);\r\n\r\n // Override the all-day title if provided\r\n if (settings.allDayTitleOverride != null && settings.allDayTitleOverride.length) {\r\n updateSettingProperty('allDayTitleText', settings.allDayTitleOverride);\r\n } else {\r\n updateSettingProperty('allDayTitleText', smLangTranslate(\"Leave my car all day\"));\r\n }\r\n\r\n // Override the all-day text if provided\r\n if (settings.allDayTextOverride != null && settings.allDayTextOverride.length) {\r\n updateSettingProperty('allDayDisplayText', settings.allDayTextOverride);\r\n } else {\r\n updateSettingProperty('allDayDisplayText', obj.AllDayDisplayText);\r\n }\r\n\r\n // Build the widget once the data has been gathered\r\n buildWidget();\r\n\r\n // Initialise the ajax/event listeners for booking slots\r\n initAjax();\r\n initBookingSubmission();\r\n\r\n } else {\r\n\r\n buildErrorMessage(smLangTranslate('There was an issue getting the timeslot information.'));\r\n console.log(data);\r\n\r\n }\r\n\r\n // Hide the loading screen\r\n if (settings.serviceWidget !== true) {\r\n var existingLoadingWrapper = document.getElementById('gms-loading-wrapper'),\r\n loadingWrapper = (existingLoadingWrapper === undefined || existingLoadingWrapper === null ? buildElement('div', 'gms-loading-wrapper', '', '') : existingLoadingWrapper);\r\n\r\n loadingWrapper.classList.add('gms-d-none');\r\n }\r\n\r\n selectDefaultDay();\r\n\r\n }\r\n\r\n function timeSlotSuccess(data) {\r\n\r\n // Get the previously selected date\r\n var date = document.querySelector(\".gms-date-container .gms-date-select.gms-selected\").getAttribute('data-date'),\r\n timeSlotContainer = document.getElementById('gms-timeslot-results'),\r\n loader = document.getElementById('gms-timeslotLoad');\r\n\r\n // Hide the loading screen\r\n loader.classList.add('gms-d-none');\r\n\r\n // Convert the resource into a usable JSON object\r\n var obj = JSON.parse(data);\r\n\r\n if (obj.AvailabilityItems.length == 0) {\r\n displayAsNoResults(timeSlotContainer);\r\n } else {\r\n\r\n // Date settings\r\n var selectedDate = new Date(date);\r\n\r\n var dtOptions = { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' };\r\n\r\n // Title wrapper\r\n var timeSlotTitle = buildElement('div', '', 'gms-border-bg', '');\r\n\r\n // Title inner\r\n var timeSlotTitleInner = buildElement('span', '', 'gms-inner', smLangTranslate('Available times for '));\r\n\r\n // Title slot date\r\n var timeSlotTitleDate = buildElement('span', '', 'gms-color-primary', selectedDate.toLocaleDateString(settings.languageCulture, dtOptions));\r\n\r\n // Merge all title elements\r\n timeSlotTitleInner.appendChild(timeSlotTitleDate);\r\n timeSlotTitle.appendChild(timeSlotTitleInner);\r\n timeSlotContainer.appendChild(timeSlotTitle);\r\n\r\n var timeSlotRow = buildElement('div', '', 'row', '');\r\n\r\n // Get any \"earliest available date\" parameter's time value\r\n var earliestAvailableStart = settings.earliestAvailableStart != null ? new Date(settings.earliestAvailableStart) : new Date();\r\n\r\n // Get the earliest start time and latest end time (for all-day option)\r\n var allDayStart = obj.AvailabilityItems[0].DayOpeningTime;\r\n var allDayEnd = obj.AvailabilityItems[0].DayClosingTime;\r\n\r\n // Loop through each time slot and check the availability\r\n obj.AvailabilityItems.forEach(function (item, index) {\r\n\r\n // Convert the returned time slot into a usable time format - using 24 hour now\r\n var timeSlot = new Date(item.StartTime).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' });\r\n\r\n // Add the slot end time if applicable\r\n if (settings.showSlotEnd != undefined && settings.showSlotEnd == true) {\r\n timeSlot += \" - \" + new Date(item.EndTime).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' });\r\n }\r\n\r\n var timeSlotCol = buildElement('div', '', 'col-12 col-sm-6 col-md-4 col-xl-4', '')\r\n // Get the shortest of the start time of the job and the start time of the slot and check that it is not before the earliest start\r\n var startTime = new Date(item.StartTime);\r\n var slotStartTime = new Date(item.EndTime);\r\n slotStartTime.setMinutes(slotStartTime.getMinutes() - settings.jobMins);\r\n if (slotStartTime < startTime)\r\n slotStartTime = startTime;\r\n \r\n // Disable the time slot if it precedes the \"earliest available from\" time\r\n var timeSlotRadioContainer = buildElement('div', '', 'gms-custom-control gms-custom-radio gms-slot-radio' + (slotStartTime < earliestAvailableStart ? ' gms-disabled' : ''), '');\r\n\r\n // Insert the HTML to avoid IE issues w/ dynamic name population\r\n timeSlotRadioContainer.innerHTML = '';\r\n\r\n // If the all-day only option has been chosen, hide the generic time slot\r\n if (settings.showAllDayOption && settings.allDayOnly) {\r\n timeSlotRadioContainer.classList.add('gms-d-none');\r\n }\r\n\r\n // Add the time slots to the container\r\n timeSlotCol.appendChild(timeSlotRadioContainer);\r\n timeSlotRow.appendChild(timeSlotCol);\r\n\r\n });\r\n\r\n // Check whether the selected date is today\r\n var todayOption = document.getElementById('gms-selector-today'),\r\n isToday = false;\r\n\r\n if (todayOption != undefined && todayOption != null) {\r\n isToday = document.getElementById('gms-selector-today').classList.contains('gms-selected');\r\n }\r\n\r\n // Add the \"all-day\" option if required (hide if on the current day's slots)\r\n if (settings.showAllDayOption == true && settings.slotType.toLowerCase() == \"auto\" && isToday == false) {\r\n var allDayCol = buildElement('div', '', 'col-12', '');\r\n var allDayRadioContainer = buildElement('div', '', 'gms-custom-control gms-custom-radio gms-slot-radio gms-slot-radio-left', '');\r\n\r\n var allDayText = '' + settings.allDayTitleText + '' + (settings.allDayDisplayText != null && settings.allDayDisplayText.length ? '' + settings.allDayDisplayText + '' : '');\r\n\r\n allDayRadioContainer.innerHTML = '';\r\n\r\n // Add the all-day slot to the row\r\n allDayCol.appendChild(allDayRadioContainer);\r\n timeSlotRow.appendChild(allDayCol);\r\n }\r\n\r\n // Add the time slots to the results container\r\n timeSlotContainer.appendChild(timeSlotRow);\r\n }\r\n\r\n // Send an event to say that the UI has changed to be caught by the parent site\r\n fireEvent('timeSlotChange', { \"selectedDate\": selectedDate });\r\n\r\n }\r\n\r\n function fireEvent(eventName, data) {\r\n var eventContainer = document.getElementById(settings.container);\r\n if (eventContainer && eventContainer !== undefined) {\r\n\r\n if (!data || data === undefined || data == null) {\r\n data = {};\r\n }\r\n\r\n eventContainer.dispatchEvent(new CustomEvent(eventName, {\r\n detail: data\r\n }));\r\n };\r\n }\r\n\r\n function timeSlotDone() {\r\n\r\n var timeSlotContainer = document.getElementById('gms-timeslot-results');\r\n\r\n timeSlotContainer.classList.add('gms-expanded');\r\n\r\n // Re-enable the date selection\r\n alterElementsClassList(document.querySelectorAll('.gms-date-container'), 'gms-disabled', false);\r\n\r\n // Add click event listeners for dynamically added slots\r\n initSlotSelection();\r\n\r\n // Set up week traversal\r\n initChangeWeeks();\r\n\r\n // Select a previously chosen slot if reset\r\n selectPreviousSlot();\r\n\r\n }\r\n\r\n function bookingSuccess(data) {\r\n\r\n var obj = JSON.parse(data);\r\n\r\n if (obj != null && obj.StatusResult != null && obj.StatusResult.Success == true) {\r\n\r\n var dtOptions = { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' },\r\n hasSlot = obj.JobSheet.SlotStart != null,\r\n slotDate = new Date(obj.JobSheet.SlotStart),\r\n slotDateDisplay = slotDate.toLocaleDateString(settings.languageCulture, dtOptions),\r\n slotTimeDisplay = slotDate.toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' }),\r\n orderReference = obj.JobSheet.JobSheetId,\r\n confirmationWrapper = document.getElementById('gms-slot-container');\r\n\r\n var confirmationInner = buildElement('div', '', 'gms-service-container gms-mb-0', '');\r\n\r\n // Replace the slot info w/ a confirmation message\r\n confirmationWrapper.innerHTML = '';\r\n confirmationWrapper.appendChild(confirmationInner);\r\n\r\n var confirmationRow = confirmationInner.appendChild(buildElement('div', '', 'row', ''));\r\n\r\n // Confirmation icon\r\n confirmationRow.appendChild(buildElement('div', '', 'col-auto', GetSVGMarkup('check-circle', 'gms-icon')));\r\n\r\n // Confirmation message\r\n confirmationRow.appendChild(buildElement('div', '', 'col', buildOrderConfirmationMessage(slotDateDisplay, slotTimeDisplay, orderReference, hasSlot)));\r\n\r\n // Set the active step (prevents widget reset)\r\n settings.activeStep = 3;\r\n\r\n } else {\r\n buildErrorMessage(smLangTranslate('There was an issue completing your order. Please try again.'));\r\n console.log(data);\r\n }\r\n\r\n }\r\n\r\n function bookingDone() {\r\n\r\n var slots = document.getElementById('gms-timeslot-results'),\r\n loader = document.getElementById('gms-loading-wrapper'),\r\n completeOrderBtn = document.getElementById('gms-complete-order'),\r\n completeBtnText = document.querySelector('#gms-complete-order .gms-btn-text');\r\n\r\n if (slots != null && slots != undefined) {\r\n slots.classList.remove('gms-d-none');\r\n }\r\n\r\n if (loader != null && loader != undefined) {\r\n loader.classList.add('gms-d-none');\r\n }\r\n\r\n // Re-enable the button\r\n if (completeOrderBtn != null && completeOrderBtn != undefined) {\r\n completeOrderBtn.disabled = false;\r\n completeBtnText.innerHTML = 'Complete booking';\r\n }\r\n \r\n }\r\n\r\n function selectDefaultDay() {\r\n\r\n // Pre-select the date if required\r\n if ((settings.defaultDay != undefined && isInteger(settings.defaultDay) || (settings.previousSelectedDate != null && settings.previousSelectedDate != undefined))) {\r\n\r\n var currentDate = new Date(new Date().toDateString()),\r\n currentWeek = document.getElementById('gms-selector-today').getAttribute('data-week'),\r\n availableDates = document.querySelectorAll('.gms-date-select:not(.gms-disabled)'),\r\n defaultDay = settings.defaultDay != null && settings.defaultDay != undefined ? settings.defaultDay : 0;\r\n\r\n // Pre-select the previously selected date if the widget has been re-loaded via the form reset function\r\n if (settings.previousSelectedDate != null && settings.previousSelectedDate != undefined) {\r\n\r\n // Calculate the difference in days between the current date and previously selected date to override the default day\r\n var previousSelectedDate = new Date(new Date(settings.previousSelectedDate).toDateString());\r\n\r\n // Work out the date difference between the current date and previously selected date\r\n var diffTime = Math.abs(previousSelectedDate - currentDate);\r\n\r\n // Default the widget selection to the previously selected date\r\n defaultDay = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n }\r\n\r\n // Prevent negative numbers being entered\r\n if (parseInt(defaultDay) < 0) {\r\n defaultDay = 0;\r\n }\r\n\r\n for (var i = 0; i < availableDates.length; i++) {\r\n\r\n var el = availableDates[i];\r\n\r\n var availableDate = new Date(el.getAttribute('data-date'));\r\n\r\n // Remove time and re-cast as date to fix time discrepancy issue\r\n availableDate = new Date(availableDate.toDateString());\r\n\r\n // Work out the date difference between the current date and available date\r\n var diffTime = Math.abs(availableDate - currentDate);\r\n var diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n // Pre-select the date if it has met the settings value (or gone above it if the initial selected value isn't available)\r\n if (diffDays >= defaultDay) {\r\n\r\n var selectedWeek = el.getAttribute('data-week');\r\n\r\n // Auto-select the week for the selected date if it differs from the current one\r\n if (currentWeek != selectedWeek) {\r\n\r\n var weekDifference = selectedWeek - currentWeek;\r\n\r\n // Advance the week selector as many weeks difference between the current and selected default date\r\n if (settings.singleColumn == true || weekDifference > 1) {\r\n\r\n for (var i = 0; i < weekDifference; i++) {\r\n advanceWeek(parseInt(currentWeek) + parseInt(i));\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n // Trigger a click on the date\r\n el.click();\r\n\r\n // Break the loop\r\n return diffDays;\r\n\r\n }\r\n\r\n }\r\n\r\n // If we get here there should be no available days.\r\n var timeSlotContainer = document.getElementById('gms-timeslot-results');\r\n displayAsNoResults(timeSlotContainer);\r\n timeSlotContainer.classList.add('gms-expanded');\r\n }\r\n\r\n }\r\n\r\n function displayAsNoResults(timeSlotContainer) {\r\n //var timeSlotContainer = document.getElementById('gms-timeslot-results');\r\n\r\n timeSlotContainer.innerHTML = '' + smLangTranslate('There are no available time slots for the date selected, please select another date and try again.') + '
';\r\n }\r\n\r\n function selectPreviousSlot() {\r\n\r\n // Check to see if a previous time slot was chosen\r\n if (settings.previousSelectedDate != null && settings.previousSelectedDate != undefined) {\r\n\r\n // Check if the time slot is still available and auto-select if it is\r\n var previousTimeSlot = document.querySelector('.gms-slot-radio input[type=\"radio\"][value=\"' + settings.previousSelectedDate + '\"]');\r\n\r\n // Select the previous time if available or fire an event to trigger the selected time as gone\r\n if (previousTimeSlot != null && previousTimeSlot != undefined) {\r\n previousTimeSlot.click();\r\n } else {\r\n fireEvent('timeSlotSelected', { \"selectedStartTime\": \"\", \"selectedEndTime\": \"\" });\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function updateSettingProperty(name, updatedValue, forceUpdate) {\r\n\r\n // Assign the config values\r\n if (settings[name] == undefined ||\r\n (forceUpdate === true && updatedValue != undefined && updatedValue != null && updatedValue != '')) {\r\n settings[name] = updatedValue;\r\n }\r\n\r\n }\r\n\r\n function buildOrderConfirmationMessage(slotDate, slotTime, orderRef, hasSlot) {\r\n \r\n var confirmationMsg = \"\" + smLangTranslate(\"Booking successfully created\") + \"\";\r\n\r\n if (hasSlot == true) {\r\n confirmationMsg += \"\" + smLangTranslate(\"Your work is scheduled for\") + \" \" + slotDate + \", \" + smLangTranslate(\"starting at\") + \" \" + slotTime + \". \";\r\n }\r\n\r\n confirmationMsg += \"
\" + smLangTranslate(\"Your order reference is\") + \" GMS\" + orderRef + \". \" + smLangTranslate(\"The garage may contact you to confirm details of your booking\") + \".
\";\r\n\r\n if (settings.autoSendToCustomer == true) {\r\n confirmationMsg += \"\" + smLangTranslate(\"A booking confirmation has been sent to you via SMS\") + \".
\";\r\n }\r\n\r\n return confirmationMsg;\r\n }\r\n\r\n // Builds the operating hours display for each day of the week\r\n function buildOperatingHoursDisplay(operatingHours) {\r\n\r\n var operatingHoursObj = JSON.parse(operatingHours),\r\n operatingHoursDisplay = '';\r\n\r\n // Loop through each day of the week\r\n for (var i = 0; i < 7; i++) {\r\n\r\n // Find the related operating hours record for the day of week\r\n var dayOperatingHours = operatingHoursObj[i];\r\n\r\n if (dayOperatingHours == null || dayOperatingHours == undefined) {\r\n continue;\r\n }\r\n\r\n // Append the day's hour display\r\n operatingHoursDisplay += buildOperatingHoursDay(dayOperatingHours.DayOfWeek, dayOperatingHours.Start, dayOperatingHours.End, dayOperatingHours.Closed);\r\n }\r\n\r\n return operatingHoursDisplay;\r\n }\r\n\r\n function buildOperatingHoursDay(dayOfWeek, start, end, closed) {\r\n\r\n // Get the translated day of week\r\n var day = smLangGetWeekdays(settings.languageCulture)[dayOfWeek];\r\n\r\n if (day == null || day == undefined) {\r\n return '';\r\n }\r\n\r\n return ' ';\r\n\r\n }\r\n\r\n})();"]}