Trade in your old device and get an instant discount.
Support for your Device
Get help setting up or repairing your device from one of our
qualified technicians
Book a virtual video support appointment
Need help setting up your device, app features or system
optimisation?
Please note we don't offer repair bookings through this service. To
book a repair please select the repair option above.
Select a time
<
>
^
Your appointment is booked
Thank you for booking your virtual video support appointment
Repair booking confirmation
See you on:
Time Slot
For a:
Virtual video support appointment
Duration:
One hour slot
Booking ref:
Reference code
Preparation:
1. Ensure you have internet connection
2. Ensure your device is sufficiently charged
3. Please arrive on time for your appointment
4. Check your confirmation email for details on how to access
your appointment
Thanks for booking an appointment at KX. We have sent your booking
information to the email provided. Please try to ensure you have a
back up of any data stored on a device you wish to service.
^
`;
}
function getSlot(time, available) {
return `
${time.time}
${!available ? "Available" : "Unavailable"}
`;
}
function getUrlVars() {
const vars = {};
const parts = window.location.href.replace(
/[?&]+([^=&]+)=([^&]*)/gi,
function (m, key, value) {
vars[key] = value;
}
);
return vars;
}
function polyfill() {
if (typeof window.CustomEvent === "function") return false;
function CustomEvent(event, params) {
params = params || { bubbles: false, cancelable: false, detail: null };
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent(
event,
params.bubbles,
params.cancelable,
params.detail
);
return evt;
}
window.CustomEvent = CustomEvent;
}
function doLog() {
//Initial check to not waste performance on every console log called
if (location.href.indexOf("?") != -1) {
var debugRegex = /\?debug+=(\w+)|&debug=(\w+)/gm;
if (debugRegex.exec(location.href) != null) {
debugRegex.lastIndex = 0;
var truth = ["true", "1"];
// if (debugRegex.exec(location.href)[1] == 'true' || debugRegex.exec(location.href)[2] == 'true') {
var regexResults = debugRegex.exec(location.href);
if (regexResults.filter((value) => truth.includes(value)).length >= 1) {
// console.info("Debug mode %cON", "color: green; font-weight: bold;");
return Function.prototype.bind.call(console.log, console, "Debug:");
} else {
return function () {
/*Do nothing*/
};
}
} else {
return function () {
/*Do nothing*/
};
}
} else {
return function () {
/*Do nothing*/
};
}
}
function calendar(URL, type, allEvents) {
polyfill();
var unlock = new CustomEvent("unlock");
var lock = new CustomEvent("lock");
var viewport = "";
var calendarRestart = null;
var URL = URL || "";
var appointmentStartTime = "";
const days = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
];
const months = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
];
const shortDays = days.map((a) => a.slice(0, 3));
const shortMonths = months.map((a) => a.slice(0, 3));
var selectedDate = new Date();
var currentDate = new Date();
const eventsInitiated = false;
document
.getElementById("calendar")
.addEventListener("changeURL", function (e) {
URL = e.detail.url;
// reset dates on url change
selectedDate = new Date();
currentDate = new Date();
doLog("got activated");
// try {
// type = type.toLowerCase();
// }
// catch (err) {
// console.error("2nd parameter of calendar() should be a string.");
// }
// switch (type) {
// case "appointment":
getAppointmentDates(selectedDate);
appointmentStartTime = "";
// break;
// case "event":
// getEventDates();
// break;
// case "debug":
// console.warn("Debug");
// getEventDates();
// appointmentStartTime = "";
// getAppointmentDates(selectedDate);
// default:
// console.info("!!!");
// console.error('Calendar function used incorrectly. Expected "appointment" or "event", received', type);
// break;
// }
});
document.getElementById("calendar").setAttribute("ready", "true");
handleDateArrows();
// getEventDates();
function getAppointmentDates(date) {
const loadingScreen = document.getElementById("load-screen");
const cal = document.getElementById("calendar");
const appointmentURL = URL + "?startDate=";
const dateString =
date.getFullYear() +
"-" +
(String(date.getMonth() + 1).length == 1
? "0" + String(date.getMonth() + 1)
: String(date.getMonth() + 1)) +
"-" +
(String(date.getDate()).length == 1
? "0" + String(date.getDate())
: String(date.getDate()));
loadingScreen.style.display = "block";
cal.classList.add("calendar--load");
showHideLeftArrow(date);
$j.get(appointmentURL + dateString, function (data) {
doLog("Got data");
populateWithAppointments(data);
loadingScreen.style.display = "";
cal.classList.remove("calendar--load");
handleScrollArrows();
$j(".calendar__choices").each(function () {
this.scrollTop = 0;
});
}).fail(function (err) {
loadingScreen.style.display = "";
cal.classList.remove("calendar--load");
// console.error(err);
showCalendarError(err);
//ADD A HEADS UP TO THE USER
});
}
function showHideLeftArrow(date) {
if (date <= currentDate) {
document.getElementsByClassName("arrow left")[0].style.visibility =
"hidden";
} else {
document.getElementsByClassName("arrow left")[0].style.visibility =
"visible";
}
}
function showCalendarError(error) {
$j(".calendar__container").empty().append("Error Collecting Appointments");
}
function populateWithAppointments(data) {
doLog("populating with data");
//clear old data
// while ($j(".calendar__container")[0].lastChild) {
// $j(".calendar__container")[0].removeChild($j(".calendar__container")[0].lastChild);
// }
$j(".calendar__container").empty();
doLog("Children cleared");
//For every date
for (var dateInd = 0; dateInd < 5; dateInd++) {
// skip if no data at index
if (
!!data[dateInd] &&
!data[dateInd].unAvailable &&
data[dateInd].slots.length > 0
) {
//Format date
var date = new Date(data[dateInd].date);
// var dateFormatted = days[date.getDay()] + " " + date.getDate() + " " + months[date.getMonth()] + " " + date.getFullYear();
var dateFormatted = moment(date).format("dddd Do MMMM");
doLog("Formatted date", dateFormatted);
//Append the date column
$j(".calendar__container").append(
getDateColumn({
dateFormatted: dateFormatted,
index: dateInd,
date: moment(date).format("YYYY-MM-DD"),
})
);
//For every appointment in date
for (
var appointmentInd = 0;
appointmentInd < data[dateInd].slots.length;
appointmentInd++
) {
//Format time
var slotTime = new Date(data[dateInd].slots[appointmentInd].start);
var time =
slotTime.getHours() +
":" +
(String(slotTime.getMinutes()).length == 1
? "0" + String(slotTime.getMinutes())
: String(slotTime.getMinutes()));
//Append the slot with template
$j(".calendar__choices")
.last()
.append(getSlot({ time: time, available: true }));
//Attach the slot time to slot's data tag
var slot = $j(".calendar__choice").last();
slot.data("startTime", data[dateInd].slots[appointmentInd].start);
slot.data("queueId", data[dateInd].slots[appointmentInd].queueId);
//Click handler
slot.click(function () {
$j(".calendar__choice").removeClass("calendar--selected");
$j(".calendar__choice").children("p").text("Available");
appointmentStartTime = $j(this).data("startTime");
this.classList.add("calendar--selected");
this.getElementsByTagName("p")[0].innerText = "Selected";
doLog("selected", appointmentStartTime);
$j("#next").data("slot", appointmentStartTime);
$j("#next").data("queueId", $j(this).data("queueId"));
document.getElementById("next").dispatchEvent(unlock);
});
}
} else if (data[dateInd]) {
var date = new Date(data[dateInd].date);
// var dateFormatted = days[date.getDay()] + " " + date.getDate() + " " + months[date.getMonth()] + " " + date.getFullYear();
var dateFormatted = moment(date).format("ddd Do MMMM");
$j(".calendar__container").append(
getDateColumn({
dateFormatted: dateFormatted,
index: dateInd,
date: moment(date).format("YYYY-MM-DD"),
})
);
$j(".calendar__choices")
.last()
.append(getSlot({ time: "No slots", available: false }));
$j(".calendar__choice").last().addClass("calendar--unavailable");
} else {
// no api data for date, so fill in using current calendar selected date + index
console.log("Last else");
const placeholderDate = new Date(selectedDate).setDate(
selectedDate.getDate() + dateInd
);
var placeholderDateFormatted =
moment(placeholderDate).format("ddd Do MMMM");
$j(".calendar__container").append(
getDateColumn({
dateFormatted: placeholderDateFormatted,
index: dateInd,
date: moment(placeholderDate).format("YYYY-MM-DD"),
})
);
$j(".calendar__choices")
.last()
.append(getSlot({ time: "No slots", available: false }));
$j(".calendar__choice").last().addClass("calendar--unavailable");
}
}
calendarRestart = true;
handleResize();
}
function handleDateArrows() {
var next = document.getElementById("next");
document
.getElementsByClassName("arrow right")[0]
.addEventListener("click", function () {
appointmentStartTime = "";
document.getElementById("next").dispatchEvent(lock);
next.classList.remove("active");
if (window.innerWidth > 768) {
selectedDate.setDate(selectedDate.getDate() + 5);
getAppointmentDates(selectedDate);
} else {
//inefficient as calls are made when data is ready
selectedDate.setDate(selectedDate.getDate() + 4);
getAppointmentDates(selectedDate);
}
});
document
.getElementsByClassName("arrow left")[0]
.addEventListener("click", function () {
appointmentStartTime = "";
document.getElementById("next").dispatchEvent(lock);
next.classList.remove("active");
if (window.innerWidth > 768) {
selectedDate.setDate(selectedDate.getDate() - 5);
getAppointmentDates(selectedDate);
} else {
selectedDate.setDate(selectedDate.getDate() - 4);
getAppointmentDates(selectedDate);
}
});
}
function handleScrollArrows() {
$j(".load").each(function (ind, elm) {
//Click To Scroll Animations
//They ensure that no matter how much and when you click, it will always snap to an element as long as the container is 350px
$j(elm).click(function () {
// var h = $j(elm).siblings().find(".calendar__choice").outerHeight(false) + parseFloat($j(".calendar__choice").css('marginTop'));
var elementHeights = $j(".calendar__choice").map(function () {
return $j(this).outerHeight(true);
});
var h = Math.max.apply(null, elementHeights);
doLog(h);
if (this.classList.contains("load--bot")) {
if (this.previousElementSibling.scrollTop % h == 0) {
$j(this.previousElementSibling).animate(
{
scrollTop: "+=" + h,
},
300
);
} else if (this.previousElementSibling.scrollTop % h > h / 2) {
var scrollBy = 2 * h - (this.previousElementSibling.scrollTop % h);
doLog(scrollBy);
$j(this.previousElementSibling).animate(
{
scrollTop: "+=" + scrollBy,
},
300
);
} else {
var scrollBy = h - (this.previousElementSibling.scrollTop % h);
doLog(scrollBy);
$j(this.previousElementSibling).animate(
{
scrollTop: "+=" + scrollBy,
},
300
);
}
} else {
if (this.nextElementSibling.scrollTop % h == 0) {
$j(this.nextElementSibling).animate(
{
scrollTop: "-=" + h,
},
300
);
} else if (this.nextElementSibling.scrollTop % h > h / 2) {
var scrollBy = h + (this.nextElementSibling.scrollTop % h);
doLog(scrollBy);
$j(this.nextElementSibling).animate(
{
scrollTop: "-=" + scrollBy,
},
300
);
} else {
var scrollBy = 2 * h + (this.nextElementSibling.scrollTop % h);
doLog(scrollBy);
$j(this.nextElementSibling).animate(
{
scrollTop: "-=" + scrollBy,
},
300
);
}
}
});
});
}
function getEventDates() {
const eventId = getUrlVars()["i"];
const isoCurrentDate = new Date();
let matchingTopicEvents = [];
// Rewritten in jquery2+ not sure if used.
// $j.get({
// url: 'https://bookings.qudini.com/booking-widget/event/event/' + eventId + '',
// data: {
// 'timezone': "Europe/London",
// 'isoCurrentDate': isoCurrentDate.toISOString()
// },
// success: (event) => {
// doLog(event.topic.title);
// for (var eInd = 0; eInd < allEvents.length; eInd++) {
// if (allEvents[eInd].topic.title == event.topic.title) {
// matchingTopicEvents.push(allEvents[eInd]);
// }
// }
// doLog("µ", matchingTopicEvents); //presorted in ascending order
// populateWithEvents(matchingTopicEvents);
// }
// })
$j.get(
"https://bookings.qudini.com/booking-widget/event/event/" + eventId + "",
{
timezone: "Europe/London",
isoCurrentDate: isoCurrentDate.toISOString(),
}
).success(function (event) {
doLog(event.topic.title);
for (var eInd = 0; eInd < allEvents.length; eInd++) {
if (allEvents[eInd].topic.title == event.topic.title) {
matchingTopicEvents.push(allEvents[eInd]);
}
}
doLog("µ", matchingTopicEvents); //presorted in ascending order
populateWithEvents(matchingTopicEvents);
});
}
function populateWithEvents(data) {
// while ($j(".calendar__container")[0].lastChild) {
// $j(".calendar__container")[0].removeChild($j(".calendar__container")[0].lastChild);
// }
$j(".calendar__container").empty();
// const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
// const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
//Dates depend on events being presorted
var dates = [];
data.forEach(function (event) {
if (!dates.includes(event.startDate)) {
dates.push(event.startDate);
}
});
doLog("∞", dates);
// var date = new Date(event.startDate);
// var dateDisplayed = days[date.getDay()] + " " + date.getDate() + " " + months[date.getMonth()] + " " + date.getFullYear();
// doLog(dateDisplayed);
// dates.forEach((date) => {
// //
// })
}
function handleResize() {
if (window.innerWidth <= 768 && (viewport != "mobile" || calendarRestart)) {
doLog("Still mobile");
$j("[date]").each(function (ind, elm) {
var a = new Date(elm.getAttribute("date"));
// elm.innerText = shortDays[a.getDay()] + " " + a.getDate() + " " + shortMonths[a.getMonth()];
elm.innerText = moment(a).format("ddd Do MMMM");
});
viewport = "mobile";
calendarRestart = false;
} else if (
window.innerWidth >= 768 &&
(viewport != "desktop" || calendarRestart)
) {
$j("[date]").each(function (ind, elm) {
var a = new Date(elm.getAttribute("date"));
// elm.innerText = days[a.getDay()] + " " + a.getDate() + " " + months[a.getMonth()] + " " + a.getFullYear();
elm.innerText = moment(a).format("ddd Do MMMM");
});
viewport = "desktop";
calendarRestart = false;
}
}
handleResize();
window.addEventListener("resize", function () {
handleResize();
});
return true;
}
function support() {
doLog("Support module loaded.");
// customevent();
var bookingURL = "";
var unlock = new CustomEvent("unlock");
var lock = new CustomEvent("lock");
const days = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
];
const months = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
];
var viewport = "";
var screens = {
calendar: document.getElementById("calendar"),
deviceInfo: document.getElementById("device-info"),
details: document.getElementById("details"),
confirmation: document.getElementById("confirmation"),
};
var colors = {
oneToOne: "coral",
support: "cyan",
repair: "monochrome",
};
var oneToOneVars = {
maxLength: 30,
placeholder: "What do you need help with?* (30 characters minimum length)",
header(inputLength) {
let remaining = Math.max(oneToOneVars.maxLength - inputLength, 0);
return `What do you need help with?${
remaining > 0
? `* (30 characters minimum length, ${remaining} remaining)`
: ""
}`;
},
};
//Main Object
var state = {
active: false,
category: "",
stage: 0,
navigation: document.getElementById("navigation"),
nextBtn: document.getElementById("next"),
backBtn: document.getElementById("back"),
close: document.getElementsByClassName("close")[0],
modelIsSelected: false,
colorIsSelected: false,
productId: "62764",
queueId: "7885",
timeChosen: "",
deviceChosen: "",
colorChosen: "",
deviceNotes: "",
finalNotes: "",
imei: "",
imeiValid: true,
serialNumber: "",
requestInit: false,
journeys: {
oneToOne: {
1: screens.calendar,
2: screens.deviceInfo,
3: screens.details,
4: screens.confirmation,
},
support: {
1: screens.calendar,
2: screens.deviceInfo,
3: screens.details,
4: screens.confirmation,
},
repair: {
1: screens.calendar,
2: screens.deviceInfo,
3: screens.details,
4: screens.confirmation,
},
},
startJourney: function (cat) {
if (
!this.active &&
["oneToOne", "support", "repair"].indexOf(cat) != -1
) {
this.active = true;
this.category = cat;
this.stage = 1;
doLog("???");
let scrollOffset = window.innerWidth > 768 ? 200 : 100;
$j("html, body").animate(
{ scrollTop: $j(".journey").offset().top - scrollOffset },
600
);
document
.getElementById("btn-" + this.category)
.classList.add("btn--primary-notActive");
this.nextBtn.setAttribute(
"ga-la",
"kings-cross:" + this.category.toLowerCase() + "_next"
);
this.nextBtn.setAttribute("ga-ac", "feature");
this.nextBtn.setAttribute("ga-ca", "microsite");
this.nextBtn.setAttribute(
"ga-la",
"kings-cross:" + this.category.toLowerCase() + "_next"
);
this.nextBtn.setAttribute(
"data-omni",
"uk:kings-cross:support:" + this.category.toLowerCase() + ":next"
);
this.backBtn.setAttribute(
"ga-la",
"kings-cross:" + this.category.toLowerCase() + "_back"
);
this.backBtn.setAttribute(
"data-omni",
"uk:kings-cross:support:" + this.category.toLowerCase() + ":back"
);
this.nextBtn.classList.add("btn--primary--" + colors[cat]);
this.backBtn.classList.add("btn--secondary--" + colors[cat]);
screens.calendar.children[0].classList.add(colors[cat]);
document
.getElementsByClassName("journey")[0]
.classList.add(colors[cat]);
$j(".checkbox").each(function (ind, elm) {
elm.classList.add("checkbox__" + colors[cat]);
});
// hide 121 description if visible
// $j('#one-to-one-description').slideUp();
doLog("init successful");
switch (this.category) {
case "oneToOne":
bookingURL =
"https://bookings.qudini.com/booking-widget/booker/slots/87J4665QG8U/4492/66526/0";
state.productId = "66526";
// one to one specific elements (these are reverted in cancelJourney)
// todo; maybe combine visiblity changes into a single class
$j("#one-to-one-description").slideDown(); // show 121 description
$j("#one-to-one-policy").addClass("visible"); // show 121 policy (hides default policy)
$j("#imei-row").hide(); // hide imei field
$j("#device-notes").attr("placeholder", oneToOneVars.placeholder); // set notes placholder text
$j("#oneToOne-device-notes-header").show(); // show device notes header
$j("#confirmation").addClass("confirmation-121"); // add class to confirmation to adjust content
break;
case "repair":
bookingURL =
"https://bookings.qudini.com/booking-widget/booker/slots/IZ0LYUJL6B0/4375/62764/0";
state.productId = "62764";
break;
case "support":
bookingURL =
"https://bookings.qudini.com/booking-widget/booker/slots/ZP4CQAQ5F6R/4375/64732/0";
state.productId = "64732";
break;
default:
console.error("Incorrect category");
return;
}
doLog("Booking URL", bookingURL);
var changeURL = new CustomEvent("changeURL", {
detail: {
url: bookingURL,
},
});
state.navigation.style.display = "flex";
var nextScreen = this.journeys[cat][1];
if (nextScreen == screens.deviceInfo) {
$j(nextScreen).slideDown({
start: function () {
$j(this).css({
display: "block",
});
doLog("Start");
},
complete: function () {
state.navigation.style.opacity = 1;
state.navigation.style.height = "auto";
state.navigation.style.display = "flex";
state.close.style.visibility = "visible";
state.close.style.opacity = 1;
},
});
} else {
$j(nextScreen).slideDown(400, function () {
state.close.style.visibility = "visible";
state.close.style.opacity = 1;
state.navigation.style.height = "auto";
state.navigation.style.opacity = 1;
state.navigation.style.display = "flex";
});
}
var sendEvent =
sendEvent ||
function () {
setTimeout(function () {
if (screens.calendar.getAttribute("ready") == "true") {
screens.calendar.dispatchEvent(changeURL);
doLog("Event dispatched.");
} else {
setTimeout(function () {
sendEvent();
doLog("not ready");
}, 200);
}
}, 200);
};
sendEvent();
} else {
doLog("");
this.cancelJourney();
setTimeout(function () {
state.startJourney(cat);
}, 525);
}
},
cancelJourney: function () {
state.close.style.visibility = "hidden";
state.close.style.opacity = 0;
$j(this.journeys[this.category][this.stage]).slideUp({
duration: 400,
start: function () {
state.navigation.style.display = "none";
$j(state.navigation).slideUp(75, function () {
state.navigation.style.height = 0;
state.navigation.style.opacity = 0;
state.navigation.style.display = "none";
state.nextBtn.classList.remove(
"btn--primary--" + colors[state.category]
);
state.backBtn.classList.remove(
"btn--secondary--" + colors[state.category]
);
state.nextBtn.setAttribute("ga-la", "kings-cross:navigation_next");
state.nextBtn.setAttribute("ga-ac", "feature");
state.nextBtn.setAttribute("ga-ca", "microsite");
state.nextBtn.setAttribute(
"data-omni",
"uk:kings-cross:support:navigation:next"
);
state.backBtn.setAttribute("ga-la", "kings-cross:navigation_back");
state.backBtn.setAttribute(
"data-omni",
"uk:kings-cross:support:navigation:back"
);
screens.calendar.children[0].classList.remove(
colors[state.category]
);
document
.getElementsByClassName("journey")[0]
.classList.remove(colors[state.category]);
$j("span.checkbox").each(function (ind, elm) {
elm.classList.remove("checkbox__" + colors[state.category]);
});
["oneToOne", "support", "repair"].forEach(function (category) {
if (document.getElementById("btn-" + category)) {
document
.getElementById("btn-" + category)
.classList.remove("btn--primary-notActive");
}
});
$j(".checkbox").siblings("input").prop("checked", false);
$j(".calendar--selected").removeClass("calendar--selected");
$j("#next").removeData("slot");
sendLock();
// one to one specific elements
$j("#one-to-one-description").slideUp(); // hide 121 description
$j("#one-to-one-policy").removeClass("visible"); // hide one-to-one policy (makes default policy visible)
$j("#imei-row").show(); // show imei row
// $j("#device-notes").attr(
// "placeholder",
// "Additional Information (Optional)"
// ); // reset device notes placholder
$j("#oneToOne-device-notes-header").hide(); //hide device notes header
$j("#confirmation").removeClass("confirmation-121"); // remove class toggling the 121 details
clearState();
document.getElementById("details").reset();
document.getElementById("device-info").reset();
window.history.replaceState(
{},
document.title,
location.protocol + "//" + location.host + location.pathname
);
// while ($j(".calendar__container")[0].lastChild) {
// $j(".calendar__container")[0].removeChild($j(".calendar__container")[0].lastChild);
// }
});
},
complete: function () {
state.navigation.style.display = "";
state.nextBtn.innerText = "Next";
},
});
},
makeBooking: function () {
doLog("Got here");
doLog(state.requestInit);
if (!state.requestInit) {
state.requestInit = true;
//Loading thingy needed HERE
//Pls
var name = document.getElementById("name").value;
var surname = document.getElementById("surname").value;
var email = document.getElementById("email").value;
var phone = document.getElementById("tel").value;
// replace leading 0 with +44
if (phone[0] === "0") {
phone = phone.replace(/^0/, "+44");
}
var notes =
(state.deviceChosen
? "Model selected: " + state.deviceChosen + "; "
: "") +
(state.colorChosen ? "Colour: " + state.colorChosen + "; " : "") +
(state.imei ? "IMEI: " + state.imei : "") +
(state.serialNumber ? "Serial number: " + state.serialNumber : "") +
(state.deviceNotes ? "; Customer Notes: " + state.deviceNotes : "");
var bookingData = {
name: name,
surname: surname,
email: email,
phone: phone,
sendSms: true,
marketingOptInSMS: true,
time:
state.timeChosen.indexOf("+01:00") != -1
? state.timeChosen.slice(0, -6) + "Z"
: state.timeChosen,
notes: notes,
postCode: (
(document.getElementById("kx").checked ? "KX," : "") +
(document.getElementById("seuk").checked ? "SEUK," : "") +
(document.getElementById("age").checked ? "Over13" : "")
)
.split(",")
.join(" "),
};
document.getElementsByClassName("journey")[0].classList.add("progress");
sendLock();
$j.ajax({
method: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "https://bookings.qudini.com/booking-widget/booker/book",
data: JSON.stringify({
queueId: state.queueId, //Make dynamic
bookingStartTime: bookingData.time,
bookingStartTimeString: bookingData.time,
firstName: bookingData.name,
surname: bookingData.surname,
emailAddress: bookingData.email,
mobileNumber: bookingData.phone, // has a backend check, has to be a legitimate number
notes: bookingData.notes,
productId: state.productId, //Make dynamic
bwIdentifier: "IZ0LYUJL6B0",
marketingOptInSMS: true,
sendSms: true,
postCode: bookingData.postCode,
}),
success: function (data) {
var successMessages = ["success", "ok"];
document
.getElementsByClassName("journey")[0]
.classList.remove("progress");
if (
(successMessages.indexOf(data ? data.status : "R@ND0M") != -1 ||
successMessages.indexOf(data.status) != -1) &&
data.bookingRef
) {
document.getElementById("ref").innerText = data.bookingRef;
state.journeys[state.category][state.stage].style.display = "";
state.stage++;
state.journeys[state.category][state.stage].style.display =
"block";
state.nextBtn.innerText = "Next";
state.navigation.style.height = 0;
state.navigation.style.opacity = 0;
state.navigation.style.display = "none";
sendUnlock();
if (ga) {
var gaId =
location.host == "qaweb-shop.samsung.com"
? "UA-101298876-1"
: "UA-100137701-12";
ga("create", gaId, {
name: "gtm9999",
cookieExpires: "33696000",
cookieDomain: "auto",
});
ga("gtm9999.send", {
hitType: "event",
eventCategory: "microsite",
eventAction: "feature",
eventLabel: `kings-cross:complete_${state.category.toLowerCase()}`,
dimension22: data.bookingRef,
});
}
} else {
alert("Fail :(");
doLog(data);
document
.getElementsByClassName("journey")[0]
.classList.remove("progress");
sendUnlock();
}
},
fail: function (err) {
document
.getElementsByClassName("journey")[0]
.classList.remove("progress");
doLog(err);
sendUnlock();
},
});
}
},
};
//Main Object end
//var colorBox = document.getElementById("color-selector");
function getParam(param) {
var pageURL = window.location.search.substring(1);
var URLVariables = pageURL.split("&");
for (var i = 0; i < URLVariables.length; i++) {
var queryString = URLVariables[i].split("=");
if (queryString[0] == param) {
return queryString[1];
}
}
}
function initDeviceGrabs() {
fetch("https://kxuploads.s3.eu-west-2.amazonaws.com/data/products.json")
.then((r) => r.json())
.then((data) => {
const modelSelect = document.getElementById("model-selector");
data.forEach((device) => {
if (device.product !== "") {
const modelOption = document.createElement("option");
modelOption.innerText = device.product;
modelOption.value = device.modelNumber;
modelSelect.appendChild(modelOption);
}
});
})
.catch((e) => {
console.log(e);
});
}
function validateUnlock() {
doLog("Validating");
// 121 Specific validation,
// if category is 121 & device notes length is less than 30
if (
state.category == "oneToOne" &&
state.deviceNotes.length < oneToOneVars.maxLength
) {
return sendLock();
}
doLog("Validating Device Info");
// if (state.colorChosen && state.deviceChosen && (state.imeiValid || !state.imei)) {
if (state.deviceChosen && (state.imeiValid || !state.imei)) {
doLog("UNLOCK sent");
state.imei = document.getElementById("imei").value;
state.serialNumber = document.getElementById("serialNumber").value;
state.deviceNotes = document.getElementById("device-notes").value;
sendUnlock();
} else {
sendLock();
}
}
function sendUnlock() {
state.nextBtn.dispatchEvent(unlock);
}
function sendLock() {
state.nextBtn.dispatchEvent(lock);
}
function handleResize() {
if (window.innerWidth <= 768 && viewport != "mobile") {
viewport = "mobile";
} else if (window.innerWidth > 768 && viewport != "desktop") {
viewport = "desktop";
}
}
function clearState() {
state.active = false;
state.category = "";
state.stage = 0;
state.modelIsSelected = false;
state.colorIsSelected = false;
state.timeChosen = "";
state.deviceChosen = "";
state.colorChosen = "";
state.deviceNotes = "";
state.finalNotes = "";
state.imei = "";
state.serialNumber = "";
state.requestInit = false;
}
function checkIMEI(imei) {
var reg = /^\d{15}$/;
if (!reg.test(imei)) {
return false;
}
var sumOfFourteen = 0;
for (var i = 0; i < imei.length - 1; i++) {
if ((i + 1) % 2 == 0) {
if (imei[i] * 2 > 9) {
var tempDigit = (parseInt(imei[i]) * 2).toString();
sumOfFourteen += parseInt(tempDigit[0]) + parseInt(tempDigit[1]);
} else {
sumOfFourteen += parseInt(imei[i]) * 2;
}
} else {
sumOfFourteen += parseInt(imei[i]);
}
}
if (
imei[imei.length - 1] ==
Math.ceil(sumOfFourteen / 10) * 10 - sumOfFourteen
) {
doLog("Last digit correct");
return true;
} else {
doLog("Last digit false");
return false;
}
}
state.nextBtn.addEventListener("unlock", function () {
// if ($j(this).data("slot")) {
if ($j(this).data("slot")) {
doLog($j(this).data("slot"));
state.timeChosen = $j(this).data("slot");
state.queueId = $j(this).data("queueId");
doLog($j(this).data());
doLog(state.timeChosen, state.queueId);
var dateObject = new Date(state.timeChosen);
var timeSlotText =
moment(dateObject).format("h:mm A | dddd Do MMMM YYYY") +
" | Samsung KX";
$j(".time-selected").text(timeSlotText);
}
this.classList.remove("btn--primary-notActive");
$j(this).data("locked", false);
doLog("next unlocked");
// }
});
state.nextBtn.addEventListener("lock", function () {
doLog("Next 'Locked'");
this.classList.add("btn--primary-notActive");
$j(this).data("locked", true);
});
state.nextBtn.addEventListener("click", function () {
if (state.journeys[state.category][state.stage + 1] == screens.calendar) {
console.log("TRUE");
var changeURL = new CustomEvent("changeURL", {
detail: {
url: bookingURL,
},
});
screens.calendar.dispatchEvent(changeURL);
}
if (state.journeys[state.category][state.stage] == screens.details) {
var formValid = true;
var isValid =
isValid ||
function (el) {
if (el.checkValidity() == false) {
formValid = false;
if (el.type == "checkbox") {
el.parentElement.classList.add("warn");
} else {
el.classList.add("warn");
}
} else if (
el.classList.contains("warn") ||
el.parentElement.classList.contains("warn")
) {
if (el.type == "checkbox") {
el.parentElement.classList.remove("warn");
} else {
el.classList.remove("warn");
}
}
};
$j("#details input")
.filter("[required]")
.each(function (i, el) {
isValid(el);
if (formValid) {
sendUnlock();
} else {
sendLock();
}
});
$j("#details input")
.filter("[required]")
.change(function () {
isValid(this);
sendUnlock();
});
}
if (!$j(this).data("locked") || formValid) {
//Button not locked and not final screen
if (state.journeys[state.category][state.stage] == screens.details) {
state.makeBooking();
} else {
state.journeys[state.category][state.stage].style.display = "";
state.stage++;
var newScreen = state.journeys[state.category][state.stage];
newScreen.style.display = "block";
if (state.journeys[state.category][state.stage] != screens.details) {
//If entering final screen
sendLock();
}
if (newScreen == screens.details) {
state.nextBtn.innerText = "Book now";
$j(state.nextBtn).removeAttr("ga-ca");
$j(state.nextBtn).removeAttr("ga-ac");
$j(state.nextBtn).removeAttr("ga-la");
}
}
}
});
//Back: if current screen is Confirmation, change Next/Book to Next
state.backBtn.addEventListener("click", function () {
state.nextBtn.setAttribute("ga-la", "kings-cross:navigation_next");
state.nextBtn.setAttribute("ga-ac", "feature");
state.nextBtn.setAttribute("ga-ca", "microsite");
if (state.stage <= 1) {
state.cancelJourney();
} else {
doLog(state.journeys[state.category][state.stage], screens.details);
if (state.journeys[state.category][state.stage] == screens.details) {
state.nextBtn.innerText = "Next";
}
state.journeys[state.category][state.stage].style.display = "";
state.stage--;
var newScreen = state.journeys[state.category][state.stage];
if (newScreen == screens.deviceInfo) {
newScreen.style.display = "flex";
} else {
newScreen.style.display = "block";
}
state.close.style.visibility = "visible";
state.close.style.opacity = 1;
sendUnlock();
}
});
$j("#model-selector").change(function () {
state.colorChosen = "";
// while (colorBox.childElementCount > 1) {
// colorBox.removeChild(colorBox.lastChild);
// }
// if (this.selectedIndex != 0) {
// console.log($j(this).find(":selected").data("colors"))
// var deviceColors = $j(this).find(":selected").data("colors").split(",");
// for (var clr = 0; clr < deviceColors.length; clr++) {
// var color = document.createElement("option");
// color.value = deviceColors[clr].trim();
// color.innerText = deviceColors[clr].trim();
// colorBox.appendChild(color);
// }
// }
// if (this.value == "Unlisted_device") {
// $j("#color-selector").val("N/A");
// state.colorChosen = "N/A";
// state.deviceChosen = "Not Listed";
// validateUnlock();
// return false;
// }
doLog(this.selectedIndex);
if (this.selectedIndex != 0) {
state.deviceChosen = this.children[this.selectedIndex].innerText;
} else {
state.deviceChosen = "";
state.colorChosen = "";
}
validateUnlock();
});
// $j("#color-selector").change(function () {
// if (this.selectedIndex != 0) {
// state.colorChosen = this.options[this.selectedIndex].innerHTML;
// } else {
// state.colorChosen = "";
// }
// validateUnlock();
// });
$j("#device-notes").bind("input propertychange", function () {
// set text for 121 device notes header (only visible on 121)
$j("#oneToOne-device-notes-header").text(
oneToOneVars.header(this.value.length)
);
// set device notes value to state for validation
state.deviceNotes = this.value;
validateUnlock();
});
$j("#imei").change(function () {
state.imei = this.value;
state.imeiValid = checkIMEI(this.value);
if (state.imei && !state.imeiValid) {
this.classList.add("warn");
} else {
if (this.classList.contains("warn")) {
this.classList.remove("warn");
}
}
validateUnlock();
});
window.addEventListener("resize", function () {
handleResize();
});
switch (getParam("journey")) {
case "one-to-one":
setTimeout(function () {
state.startJourney("oneToOne");
}, 300);
break;
case "support":
setTimeout(function () {
state.startJourney("support");
}, 300);
break;
case "repair":
setTimeout(function () {
state.startJourney("repair");
}, 300);
break;
default:
break;
}
initDeviceGrabs();
$j("#btn-oneToOne").click(function () {
state.startJourney("oneToOne");
});
$j("#btn-support").click(function () {
state.startJourney("support");
});
$("#kx-special a.cta[aria-label$='Book now']").click(function () {
state.startJourney("repair");
});
$("#btn-repair").click(function () {
state.startJourney("repair");
});
$j(".close").click(function () {
state.cancelJourney();
});
handleResize();
}
calendar(
"https://bookings.qudini.com/booking-widget/booker/slots/IZ0LYUJL6B0/4375/62764/0",
"appointment"
);
support();
/** handle book now CTA Evernt in AEM component
$("#product-support-ctas a.cta[aria-label$='Book now']").on('click', function(event){
event.preventDefault();
$('#btn-repair').trigger('click');
});**/
});
Provide your email address below to be notified when this item is back in stock and available to buy.
Please double check your email address.
We will email you when inventory is added.
Thank you.
Product Registration
Quick-and-easy product registration.. Receive up-to-date personalised services and tips.
Serial Number/IMEI
Enter your Serial Number/IMEI
QR Scan
Scan the QR code on your products for easy registration.
* This feature can only be supported on Samsung Home Appliances and non-smart B2C monitors.
Enter your Serial Number/IMEI
Quick-and-easy product registration.
Please enter the 11 or 15- digit number.
This product is already registered. Make sure you entered the right serial number or IMEI.
Type
Sub Type
Category
Back view
The serial number and model name are printed on the label located on the lower left side of the device’s exterior, near the front. They are also on a second label, inside the refrigerator compartment on a side wall above the top shelf.
Back view
The serial number and model name are printed on the label located on the lower left side of the device’s exterior, near the front. They are also on a second label, inside the refrigerator compartment on a side wall above the top shelf.
Product registration is almost complete!!
You've entered a valid S/N or IMEI. Now select the model of your product.
Suggested searches
No result. Please try again.
Galaxy Book3 Ultra
SM-G996BZKGEUA
Serial Number: R3CR508WNAH
The device you are currently using does not support the camera function.