Book Your DVT Scan
Schedule Your Ultrasound Scan today by selecting a convenient time and date below.
DVT Ultrasound Scan – At a Glance
- An ultrasound scan to exclude lower extremity Deep Vein Thrombosis
- For pain, swelling and tenderness in your leg.
- No GP referral is required
- Same-day digital results
- Fully qualified, experienced NHS sonographers
- No preparation is required
- Same-day appointments are usually available.
- Only £179 (Both Legs: £259)
- Book Online or over the phone
£ 179
30 min.
December
January
(function($) {
'use strict';
$(function() {
$('#vapempsel').select2({
allowClear: false,
width: 300,
});
$('#vapmonthsel, #vapserpeopleselect').select2({
minimumResultsForSearch: -1,
allowClear: false,
width: 150,
});
$('#vapempsel, #vapmonthsel, .vap-empsearch-locval').on('change', () => {
document.sersearchform.submit();
});
});
})(jQuery);
- Available
- Partially Available
- Fully Occupied
- Selected
- Closed
for individual styling.
jQuery('#vaptimeline').html(
jQuery('').html(error)
);
}
// unset selected date on error
jQuery('#vapdayselected').val('');
// hide wait list button
jQuery('#vapwaitlistbox').hide();
// hide add cart button
jQuery('#vapadditembutton').hide();
}
// animate only in case the timeline is not visible
var px_to_scroll = isBoxOutOfMonitor(jQuery('#vaptimeline'), 60);
if (px_to_scroll !== false) {
jQuery('html,body').animate({scrollTop: "+=" + px_to_scroll}, {duration:'normal'});
}
});
}
var HOUR_MIN_SELECTED = false;
function vapRenderTimeline(timeline, html, newRate, request) {
let eventArgs = {
timeline: timeline,
html: html,
newRate: newRate,
request: request,
};
// inject received parameters within the event to dispatch
var event = jQuery.Event('timeline.beforerender');
event.params = eventArgs;
// trigger event before rendering the timeline
jQuery(window).trigger(event);
// fill timeline with fetched HTML
jQuery('#vaptimeline').html(html);
// update base cost
if (newRate && typeof vapUpdateServiceRate !== 'undefined') {
/**
* @see views/employeesearch/tmpl/default_filterbar.php
*/
vapUpdateServiceRate(newRate);
}
var at_least_one_open = false;
var at_least_one_closed = false;
// iterate timeline levels
timeline.forEach((level) => {
// iterate level times
level.forEach((time) => {
at_least_one_open = at_least_one_open || (time.status == 1);
at_least_one_closed = at_least_one_closed || (time.status == 0);
});
});
// display "add to cart" button only if the timeline
// reports at least an available slot
if (at_least_one_open) {
jQuery('#vapadditembutton').show();
} else {
jQuery('#vapadditembutton').hide();
}
// display "add to waiting list" button only if the
// timeline reports at least an occupied slot
if (at_least_one_closed) {
jQuery('#vapwaitlistbox').show();
} else {
jQuery('#vapwaitlistbox').hide();
}
// inject received parameters within the event to dispatch
var event = jQuery.Event('timeline.afterrender');
event.params = eventArgs;
// trigger event after rendering the timeline
jQuery(window).trigger(event);
}
function vapTimeClicked(hour, min, slot)
{
let eventArgs = {
hour: hour,
min: min,
};
// inject received parameters within the event to dispatch
var event = jQuery.Event('timeline.beforepicktime');
event.params = eventArgs;
// trigger event before picking a time slot
jQuery(slot).trigger(event);
// get new rate as string
var newRate = '' + jQuery(slot).find('.vaptlblock1').data('rate');
if (newRate.length && typeof vapUpdateServiceRate !== 'undefined') {
/**
* Dispatch rate update only if the data is set.
*
* @see views/employeesearch/tmpl/default_filterbar.php
*/
vapUpdateServiceRate(parseFloat(newRate));
}
jQuery('#vapconfempselected').val(0);
jQuery('#vapconfserselected').val(29);
jQuery('#vapconfdayselected').val(jQuery('#vapdayselected').val());
jQuery('#vapconfhourselected').val(hour);
jQuery('#vapconfminselected').val(min);
jQuery('#vapconfpeopleselected').val(jQuery('#vappeopleselected').val());
jQuery('.vaptlblock1').removeClass('vaptimeselected');
jQuery(slot).find('.vaptlblock1').addClass('vaptimeselected');
var opt_div = jQuery('.vapseroptionscont');
if (opt_div.length > 0) {
opt_div.slideDown();
}
var rec_div = jQuery('.vaprecurrencediv');
if (rec_div.length > 0) {
rec_div.slideDown();
}
isTimeChoosen = true;
// inject received parameters within the event to dispatch
var event = jQuery.Event('timeline.afterpicktime');
event.params = eventArgs;
// trigger event after picking a time slot
jQuery(slot).trigger(event);
}
jQuery(function($) {
$('.vap-optvar-sel').select2({
minimumResultsForSearch: -1,
allowClear: false,
width: 200,
});
$('#vapserpeopleselect').on('change', function() {
let people = parseInt($(this).val());
people = isNaN(people) || people people) {
// auto-adjust the currently selected value
$(this).val(people);
}
}
});
}).trigger('change');
$(window).on('resize', function() {
if ($(this).width() {
$(window).trigger('resize');
}, 256);
});
function vapGetSelectedOptions(people) {
var options = [];
if (!people) {
people = Math.max(1, parseInt(jQuery('#vapserpeopleselect').val()));
}
// iterate by group
jQuery('.vapseroptiongroup').each(function() {
let optionsGroup = this;
let totalSharedCount = 0;
jQuery(this).find('.vapsersingoption').each(function() {
const checkbox = jQuery(this).find('.option-checkbox');
// check whether the options was selected
if (checkbox.is(':checked')) {
let id_opt = parseInt(jQuery(this).data('id'));
let id_var = parseInt(jQuery('#vapoptvar' + id_opt).val());
let units = Math.max(1, parseInt(jQuery(this).find('.option-quantity').val()));
if (checkbox.prev('.option-quantity').hasClass('shared-units')) {
totalSharedCount += units;
}
options.push({
id: id_opt,
quantity: units,
variation: id_var ? id_var : null,
});
}
// nope, make sure it was not required
else if (checkbox.hasClass('required')) {
vapMarkRequiredOptions(true);
throw "MissingRequiredOptionException";
}
});
if (totalSharedCount > people) {
vapMarkSharedOptions(optionsGroup, true);
/**
* Reuse the same exception thrown in case of missing required selection.
* This way we can prevent the booking process without having to edit the
* code that uses this function.
*
* Consider to use a different exception in case we want to display an
* error message along with the highlighted options.
*/
throw "MissingRequiredOptionException";
} else {
vapMarkSharedOptions(optionsGroup, false);
}
});
// all options seem valid
vapMarkRequiredOptions(false);
return options;
}
function vapOptionVarValueChanged(id) {
jQuery('#vapseroptprice' + id).html(jQuery('#vapoptvar' + id + ' :selected').attr('data-price'));
jQuery('#vapseroptduration' + id).html(jQuery('#vapoptvar' + id + ' :selected').attr('data-duration'));
jQuery('#vapoptchbox' + id).prop('checked', true);
}
function vapQuantityValueChanged(id) {
jQuery('#vapoptchbox' + id).prop('checked', true);
}
function vapMarkRequiredOptions(s) {
jQuery('.option-checkbox.required').each(function() {
var id = jQuery(this).data('id');
var label = jQuery('#vapreqopt' + id);
if (s) {
label.addClass('vapoptred');
let wrapper = label.closest('.vapseroptionsdiv');
if (!wrapper.is(':visible')) {
wrapper.prev().trigger('click');
}
} else {
label.removeClass('vapoptred');
}
});
}
function vapMarkSharedOptions(container, s) {
jQuery(container).find('.vapsersingoption').each(function() {
const checkbox = jQuery(this).find('.option-checkbox');
if (!checkbox.prev().hasClass('shared-units')) {
return;
}
const label = checkbox.closest('.vapsersingoption').find('.vapseroptname label');
if (s && checkbox.is(':checked')) {
label.addClass('vapoptred');
if (!jQuery(container).find('.vapseroptionsdiv').is(':visible')) {
jQuery(container).find('.toggle-link').trigger('click');
}
} else {
label.removeClass('vapoptred');
}
});
}
var isTimeChoosen = false;
var vapCheckoutProceed = 0;
jQuery(function($) {
$('#vaprepeatbyrecsel, #vapfornextrecsel').select2({
minimumResultsForSearch: -1,
allowClear: false,
width: 150,
});
$('#vapamountrecsel').select2({
minimumResultsForSearch: -1,
allowClear: false,
width: 70,
});
});
/**
* Used to register the selected options within the DOM
* or to return them as array.
*/
function vapRegisterOptions(what) {
try
{
var options = vapGetSelectedOptions();
}
catch (error)
{
if (error == 'MissingRequiredOptionException')
{
// do not proceed as the customer forgot to fill
// one or more required fields
return false;
}
// Proceed because the service doesn't own any option
// and the function vapGetSelectedOptions() hasn't been declared.
// Define an empty options array to avoid breaking the flow.
var options = [];
}
if (what === 'ajax') {
// return options array
return options;
}
options.forEach((opt) => {
jQuery('#vapempconfirmapp').append(
''+
''+
''
);
});
return true;
}
/**
* Used to book the selected details by submitting the form.
*/
function vapBookNow() {
if (isTimeChoosen) {
// register options only in case the time has been selected
if (vapRegisterOptions('submit') === false) {
// missing some required options
return false;
}
// register recurrence only in case the time has been selected
var recurrence = vapGetSelectedRecurrence();
if (recurrence) {
jQuery('#vapempconfirmapp').append('');
}
}
if (isTimeChoosen || vapCheckoutProceed) {
document.confirmapp.submit();
} else {
vapDisplayWrongMessage(2500, Joomla.JText._('VAPBOOKNOTIMESELECTED'));
}
}
var _items_add_count = 0;
var _items_timeout = null;
var _items_bad_timeout = null;
/**
* Used to book one or more services via AJAX.
*/
function vapAddItemToCart() {
if (!isTimeChoosen) {
return false;
}
var id_ser = jQuery("#vapconfserselected").val();
var id_emp = jQuery("#vapconfempselected").val();
var day = jQuery("#vapconfdayselected").val();
var hour = jQuery("#vapconfhourselected").val();
var min = jQuery("#vapconfminselected").val();
var people = jQuery("#vapconfpeopleselected").val();
// get selected options
var options = vapRegisterOptions('ajax');
if (options === false) {
// missing some required options
return false;
}
// It doesn't matter if the checkout select exists
// as the controller won't use this value (because the
// checkout selection is disabled for this service).
var factor = jQuery('#vap-checkout-sel').val();
var recurrence = vapGetSelectedRecurrence();
// use default URL
var _url = 'https://www.iuslondon.co.uk/wp-admin/admin-ajax.php?task=cart.additem&Itemid=4043&action=vikappointments&vik_ajax_client=site';
if (recurrence) {
// user recurrence URL
_url = 'https://www.iuslondon.co.uk/wp-admin/admin-ajax.php?task=cart.addrecuritem&Itemid=4043&action=vikappointments&vik_ajax_client=site';
} else {
// set default "no" recurrence
recurrence = [-1, -1, -1].join(',');
}
jQuery('.option-required').removeClass('vapoptred');
UIAjax.do(
_url,
{
id_ser: id_ser,
id_emp: id_emp,
date: day,
hour: hour,
min: min,
people: people,
options: options,
recurrence: recurrence,
duration_factor: factor,
},
(resp) => {
// check if we have recurring items
if (typeof resp.items !== 'undefined') {
// ok count
if (resp.count > 0) {
// recurring appointments -> get number of items added
vapDisplayRightMessage(resp.count);
// we can proceed with the checkout
vapCheckoutProceed = 1;
}
var wrong = [];
// fetch all error messages
resp.items.forEach((item) => {
if (item.status == 0) {
wrong.push(item.error);
}
});
if (wrong.length) {
// at least an error found, display a wrong message too
vapDisplayWrongMessage(Math.max(wrong.length * 1500, 2500), wrong.join('
')); } } else { // display message for one service only vapDisplayRightMessage(1); // we can proceed with the checkout vapCheckoutProceed = 1; } /** * Refresh timeline on success. * * @since 1.7.5 */ vapGetTimeline(); // inject received response within the event to dispatch var event = jQuery.Event('vikappointments.cart.add'); event.params = resp; // trigger event jQuery(window).trigger(event); }, (err) => { vapDisplayWrongMessage(0, err.responseText || Joomla.JText._('VAPBOOKNOTIMESELECTED')); } ); } function vapDisplayRightMessage(count) { if (!jQuery('.vapbooksuccessdiv').is(':visible')) { _items_add_count = count; } else { _items_add_count++; } if (!_items_bad_timeout) { // no registered timer for error messages, auto hide them jQuery('.vapbookerrordiv').hide(); } if (_items_add_count == 1) { jQuery('.vapbooksuccessdiv #booksuccess-msg').text(Joomla.JText._('VAPCARTITEMADDOK')); } else { jQuery('.vapbooksuccessdiv #booksuccess-msg').text(_items_add_count + ' ' + Joomla.JText._('VAPCARTMULTIITEMSADDOK')); } if (_items_timeout != null) { clearTimeout(_items_timeout); } jQuery('.vapbooksuccessdiv').stop(true, true).fadeIn(); _items_timeout = setTimeout(function() { jQuery('.vapbooksuccessdiv').fadeOut(); }, 2500); } function vapDisplayWrongMessage(ms, html) { if (_items_bad_timeout != null) { clearTimeout(_items_bad_timeout); } if (html) { jQuery('.vapbookerrordiv #bookerror-msg').html(html); } jQuery('.vapbookerrordiv').stop(true, true).fadeIn(); if (ms > 0) { _items_bad_timeout = setTimeout(function() { jQuery('.vapbookerrordiv').fadeOut(); }, ms); } } function vapRecurrenceSelectChanged() { var val = jQuery('#vaprepeatbyrecsel').val(); if (val > 0) { if (jQuery('#vapfornextrecsel option[value="' + val + '"]').length > 0) { // update select to have the same interval jQuery('#vapfornextrecsel').select2('val', val); } else if (jQuery('#vapfornextrecsel').val() == "0") { // option not found, select the first index available jQuery('#vapfornextrecsel').prop('selectedIndex', 1); // update val on select2 jQuery('#vapfornextrecsel').select2('val', jQuery('#vapfornextrecsel').val()); } } else { jQuery('#vaprecokcheck').prop('checked', false); jQuery('.vaprecurrencenextdiv').hide(); jQuery('.vaprecurrenceprediv').fadeIn(); } } function vapRecurrenceConfirmValueChanged() { // change index jQuery('#vaprepeatbyrecsel').prop('selectedIndex', 1); // update val on select2 jQuery('#vaprepeatbyrecsel').select2('val', jQuery('#vaprepeatbyrecsel').val()); // trigger change to update [fornext] select vapRecurrenceSelectChanged(); jQuery('.vaprecurrenceprediv').hide(); jQuery('.vaprecurrencenextdiv').fadeIn(); } function vapGetSelectedRecurrence() { var enabled = 0; if (!enabled) { return false; } var recurrence = []; recurrence.push(parseInt(jQuery('#vaprepeatbyrecsel').val())); recurrence.push(parseInt(jQuery('#vapfornextrecsel').val())); recurrence.push(parseInt(jQuery('#vapamountrecsel').val())); if (!recurrence[0]) { return false; } return recurrence.join(','); } /** * @usedby views/servicesearch/tmpl/default_calendars.php * @usedby layouts/blocks/checkout.php */ var LAST_TIMESTAMP_USED = null;
Available Options
£ 80
Service added to the cart!
Please choose a date & time first.
')); } } else { // display message for one service only vapDisplayRightMessage(1); // we can proceed with the checkout vapCheckoutProceed = 1; } /** * Refresh timeline on success. * * @since 1.7.5 */ vapGetTimeline(); // inject received response within the event to dispatch var event = jQuery.Event('vikappointments.cart.add'); event.params = resp; // trigger event jQuery(window).trigger(event); }, (err) => { vapDisplayWrongMessage(0, err.responseText || Joomla.JText._('VAPBOOKNOTIMESELECTED')); } ); } function vapDisplayRightMessage(count) { if (!jQuery('.vapbooksuccessdiv').is(':visible')) { _items_add_count = count; } else { _items_add_count++; } if (!_items_bad_timeout) { // no registered timer for error messages, auto hide them jQuery('.vapbookerrordiv').hide(); } if (_items_add_count == 1) { jQuery('.vapbooksuccessdiv #booksuccess-msg').text(Joomla.JText._('VAPCARTITEMADDOK')); } else { jQuery('.vapbooksuccessdiv #booksuccess-msg').text(_items_add_count + ' ' + Joomla.JText._('VAPCARTMULTIITEMSADDOK')); } if (_items_timeout != null) { clearTimeout(_items_timeout); } jQuery('.vapbooksuccessdiv').stop(true, true).fadeIn(); _items_timeout = setTimeout(function() { jQuery('.vapbooksuccessdiv').fadeOut(); }, 2500); } function vapDisplayWrongMessage(ms, html) { if (_items_bad_timeout != null) { clearTimeout(_items_bad_timeout); } if (html) { jQuery('.vapbookerrordiv #bookerror-msg').html(html); } jQuery('.vapbookerrordiv').stop(true, true).fadeIn(); if (ms > 0) { _items_bad_timeout = setTimeout(function() { jQuery('.vapbookerrordiv').fadeOut(); }, ms); } } function vapRecurrenceSelectChanged() { var val = jQuery('#vaprepeatbyrecsel').val(); if (val > 0) { if (jQuery('#vapfornextrecsel option[value="' + val + '"]').length > 0) { // update select to have the same interval jQuery('#vapfornextrecsel').select2('val', val); } else if (jQuery('#vapfornextrecsel').val() == "0") { // option not found, select the first index available jQuery('#vapfornextrecsel').prop('selectedIndex', 1); // update val on select2 jQuery('#vapfornextrecsel').select2('val', jQuery('#vapfornextrecsel').val()); } } else { jQuery('#vaprecokcheck').prop('checked', false); jQuery('.vaprecurrencenextdiv').hide(); jQuery('.vaprecurrenceprediv').fadeIn(); } } function vapRecurrenceConfirmValueChanged() { // change index jQuery('#vaprepeatbyrecsel').prop('selectedIndex', 1); // update val on select2 jQuery('#vaprepeatbyrecsel').select2('val', jQuery('#vaprepeatbyrecsel').val()); // trigger change to update [fornext] select vapRecurrenceSelectChanged(); jQuery('.vaprecurrenceprediv').hide(); jQuery('.vaprecurrencenextdiv').fadeIn(); } function vapGetSelectedRecurrence() { var enabled = 0; if (!enabled) { return false; } var recurrence = []; recurrence.push(parseInt(jQuery('#vaprepeatbyrecsel').val())); recurrence.push(parseInt(jQuery('#vapfornextrecsel').val())); recurrence.push(parseInt(jQuery('#vapamountrecsel').val())); if (!recurrence[0]) { return false; } return recurrence.join(','); } /** * @usedby views/servicesearch/tmpl/default_calendars.php * @usedby layouts/blocks/checkout.php */ var LAST_TIMESTAMP_USED = null;
Terms and Conditions:
Please be aware that we require a 24-hour cancellation notice prior to your scheduled appointment.
Should you miss this 24-hour period will charge you 50% of the price of the scan.
We accept cancellations via the link in the confirmation email, text, personal email or phone call.