{"version":3,"sources":["script.js"],"names":["sha256","ascii","rightRotate","value","amount","i","j","mathPow","Math","pow","maxWord","result","words","asciiBitLength","hash","h","k","primeCounter","isComposite","candidate","charCodeAt","w","slice","oldHash","w15","w2","a","e","temp1","concat","b","toString","helper","getQueryVariable","variable","vars","window","location","search","substring","split","length","pair","getQueryStringByName","name","replace","results","RegExp","exec","decodeURIComponent","calculateDistance","lat1","lon1","lat2","lon2","radlat1","PI","radlat2","theta","radtheta","dist","sin","cos","acos","breakpoints","viewport","innerWidth","desktop","tablet","mobileNav","age","d","m","y","today","Date","thisYear","getFullYear","thisMonth","getMonth","thisDate","getDate","debounce","func","wait","immediate","timeout","context","this","args","arguments","callNow","clearTimeout","setTimeout","apply","gaHelper","trackEvent","category","action","opt_label","opt_value","opt_noninteraction","undefined","homepageHero","init","$","on","find","text","href","attr","noImageHeader","$pH","addClass","removeClass","liquidHero","homeHeroImage","imageHeader","imgLiquid","verticalAlign","resize","awards","slick","infinite","slidesToShow","slidesToScroll","autoplay","autoplaySpeed","speed","cssEase","responsive","breakpoint","settings","centerMode","slidesPerRow","centerPadding","rows","dots","insurers","gallery","videoLightbox","$lightboxLink","each","$testimonialLinkHtml","prettyPhoto","social_tools","show_title","theme","deeplinking","overlay_gallery","horizontal_padding","default_width","default_height","hideflash","wmode","iframe_markup","markup","galleryLightbox","$windowWidth","getWindowWidth","width","changepicturecallback","callback","hasClass","preventDefault","alphabeticFilter","aLetters","aContentRows","aContent","jQuery","trim","parent","target","$target","offset","top","stop","animate","scrollTop","siteHeader","throttle","$siteHeader","siteHeaderSearch","config","$form","$searchInput","$searchProfile","$reset","$prompt","$warning","$results","that","onUpdate","element","val","performSearch","submit","trigger","searchTerm","endpoint","apilocation","encodeURIComponent","mockApi","ajax","method","url","dataType","done","data","apiResults","resp","parseJSON","html","Handlebars","compile","templateString","template","actionLinks","keywords","stickyHeader","_this","mobileHeader","siteContainer","removeAttr","addEventListener","event","scrollY","show","css","position","mobileStickyClass","waypoint","Waypoint","handler","direction","hide","paddingTop","height","refreshAll","disable","enable","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","parentElement","parentNode","nodeType","siteHeaderLocations","$toggle","$headerTop","$nav","$topMenuList","$topNav","rel","infinityNumber","hospital","address","telephone","footerPanel","telA","document","callBackRequest","children","siteHeaderEnquiry","siteHeaderTracking","locationItems","secondaryItems","globalItems","primaryItems","footerItems","gpConnectTracking","ctaTracking","consultantImgCrop","horizontalAlign","siteNav","mouseTimeout","megaMenuContainer","hideSubNav","showSubNav","key","siblings","selectedStates","after","currentPath","selectedItem","parents","link","_target","_megaMenu","first","matchHeight","featGridItem","recruitmentGridItem","pricedItem","imageItem","newsFeedItem","infoLinks","practisingAt","stepByStepAt","megaMenuColumn","callToActionPanelWrapper","fn","_afterUpdate","groups","pHeightCorrection","nHeightCorrection","rHeightCorrection","tabs","_update","$navItems","$contentItems","index","eq","alertMe","alert","accordion","$content","$contentMini","toggleFix","$accordionX","$accToggle","next","notice","dateValidation","combodate","minYear","maxYear","smartDays","wrap","locationMap","canvas","locations","map","loadMaps","google","load","getElementById","initHospitalMap","initMap","initLocationFinder","initSpecialityLocationFinder","other_params","getScript","locationOptions","types","componentRestrictions","country","specialityId","specialityIdNode","specialityNameNode","locationInput","specialityLocationInput","specialityAutoComplete","maps","places","Autocomplete","lat","lon","hospitalId","remove","getAccordionDataBySpeciality","addListener","speciality","latlng","locationEntered","locationSuggested","getPlace","isModuleUrl","geometry","lng","qs","selectedHospital","append","treatmentInput","autoComplete","treatment","treatmentId","getAccordionData","isDraggable","Map","center","zoom","scrollwheel","draggable","zoomControl","zoomControlOptions","ControlPosition","LEFT_BOTTOM","scaleControl","streetViewControl","streetViewControlOptions","fullscreenControl","Geocoder","locationMapPoints","setPoints","addressurl","async","success","json","renderSpecialityAccordions","setAccordionDistances","__NAS","_pplr","indexOf","grep","idx","PaediatricsEnabled","filterLocationForPaediatrics","SpireGPEnabled","filterLocationsForSpireGP","renderAccordions","sortLocationsByDistance","userLatLong","latlong","distance","distanceFriendly","toFixed","sort","centerCache","bounds","LatLngBounds","icon","marker","Marker","modal","InfoBox","content","phone","alignBottom","infoBoxClearance","Size","pixelOffset","label","closeBoxURL","setCenter","getCenter","close","open","extend","fitBounds","setZoom","source","distances","defaultRows","number","sortedDivs","toArray","sorter","empty","getAttribute","finder","currentLocation","advSection","slideToggle","$consultantFinder","consultantUrl","hos","ty","type","keydown","$treatments","$Dropdown","filterDropdown","ajaxRequest","actionUrl","consultantId","postCode","consultant","typeSelectedClass","bookable","checked","siteQuery","trackCall","selectedDefultTreatmentId","selectItem","$dropdown","searchThrottle","$list","dataUrl","oldValue","newValue","$searchInputValue","toLowerCase","$noResults","$items","which","selectedValue","obj","NodeId","Url","Display","decoded","newsFilterSelect","selectric","disableOnMobile","nativeOnMobile","documentElement","body","paginationFilters","attributeValue","externalLinkClass","cookies","cookieKey","readCookie","writeCookie","bannerCookies","bannerId","cookie","$bannerContent","$bannerToggle","$bannerCTA","bannerMaximised","cookieKeySurvey","surveyCookies","desktopSurveyMaxCount","mobileSurveyMaxCount","$surveyModal","surveyMaxCount","isDesktop","is","firstPage","localStorage","setItem","getItem","modalUrl","protocol","host","days","date","setTime","getTime","cookieString","toGMTString","charAt","enquiryFormCTA","characterCount","maxCount","counter","countText","checkIfWesbiteLeft","resetLocalLink","localLink","storedTime","dateNow","hostname","clickcount","Number","lastPage","enquiryTabs","requestForm","month","Array","prop","nowDate","thisForm","submitForm","$submitButton","$spinner","parsley","errorsContainer","pEle","$element","classHandler","uiEnabled","validate","title","surname","firstname","maidenname","dob","emailAddress","phoneNumber","postcode","titlese","surnamese","firstnamese","maidennamese","dobse","emailAddressse","phoneNumberse","addressse","postcodese","relationship","tpFromDate","tpToDate","selectedHospitalNodeId","anyEmails","anyNamesKeywords","otherSpecific","declarationFullName","declarationDate","dobDay","dobMonth","dobYear","dobDayse","dobMonthse","dobYearse","tpFromDay","tpFromMonth","tpFromYear","tpToDay","tpToMonth","tpToYear","personalDataRequest","gender","genderse","proofAuth","entirePatientRecord","pathologyRecords","radiologyRecords","pharmacyRecords","outpatientRecords","physiotherapyRecords","theatreRecords","wardRecords","oncologyRecords","endoscopyRecords","emailCorrespondence","complaints","billingInfo","telRecordings","infoCorrect","_personalDataRequest","_gender","_genderse","_proofAuth","_entirePatientRecord","_emailCorrespondence","_complaints","_billingInfo","_telRecordings","_infoCorrect","_rb1","_rb2","_rb3","_rb4","_rb5","_rb6","_rb7","_rb8","_rb9","parsed","parseInt","isNaN","otherPatientRecord","requestFields","hospitalNodeId","postRequestForm","eventBookingForm","getParsleyConfig","removeLastComma","str","form","firstName","emailAddressConfirm","phoneNum","eventDateValue","eventTitle","nodeId","nearestHospitalId","bookingFormDestinationEmail","bookingFormSpecificTopicsCovered","howDidYouHearAboutUs","enquiryFormOptinEmail","enquiryFormOptinSMS","enquiryBestTimeToContact","now","marketingOptin","enquiryFields","isEvent","eventDate","enquiryFormOptinPrivacy","marketingOptIn","postEventForm","enquiryForm","enquiryMobileCTAOverCtrl","customValidator","emailValidator","validateAndRecaptchaPassForm","recordCustomErrorDataLayer","field","message","dataLayer","push","error_field","error_message","bindErrorRecorder","Parsley","id","required","validationResult","assert","requiredMsg","domOptions","requiredMessage","msg","patternMessage","$dobErrorRequiredContainer","$dobContainer","day","year","addValidator","requirementType","validateString","requirements","parsleyInstance","$row","messages","en","elem","_","siteKey","grecaptcha","ready","execute","then","token","contentType","console","log","setupEnquiryFields","fail","xhr","status","error","errorMessage","statusText","el1","el2","visible","selectedHospitalValue","enquirySource","enquiryType","fundingType","enquiry","postcodeRaw","enquiryFormOptin","isEnquiry","timerId","partialPostCode","floodLightCategory","floodLightEnquiryString","optinEmail","optinSMS","optinPrivacy","preferredConsultant","selectedSpecialityValue","preferredDate","selectedTimeValue","isAppointment","match","encodeURI","nearestHospitalName","perferredConsultant","perferredSpeciality","perferredDate","perferredTime","JSON","stringify","postForm","$postcodeDiv","$selectHospitalDiv","trackingModule","gaTrackEvent","always","postToThankYou","errorString","reset","recaptchaExpired","encryptString","addSubmissionToDataLayer","dataLayerFields","webId","Promise","resolve","reject","enquiry_type","marketing_opt_in","web_id","funding_type","user_provided_data","email_address","phone_number","first_name","last_name","postal_code","isInPageEnquiry","data2","enquiryFormUrl","navigator","appCodeName","appName","appVersion","cookieEnabled","language","onLine","platform","userAgent","device","matchMedia","getElementsByTagName","thankYouPostForm","siteNavMobile","$navElements","$contactElements","$expandableNavItems","has","$searchElements","backgroundImg","toggleClass","$item","callToAction","ctaSelector","$ctaHandle","c","sessionStorage","$cta","searchMobileNav","select","redirect","consultantNav","nav","navMobile","header","setDimensions","clientHeight","prev","$navList","left","topMenu","$menu","pageFound","path","telephoneLinks","test","iosSelectFix","windowWidth","MSStream","selects","querySelectorAll","appendChild","createElement","tooltip","bind","option","datepicker","disabledDays","err","minDate","dateFormat","onClose","checkAppointmentTimes","beforeShowDay","getDay","string","formatDate","inArray","nodeid","clickTocall","callToActionFullwidth","footerTracking","locationsCTA","track","consultantTracking","treatmentPickerWithThreeColumns","homepageGallery","arrows","pauseOnHover","mouseover","mouseout","treatmentCarousel","makeEnquiry","globalNotification","COBPSConsultant","accordionName","accordionHeader","makeEnquiryForm","hospitalTreatmentConsultantFinder","showConsultantsFinder","showHospitalFinder","searchOverlay","lookup","querySelector","autocomplete","fields","strictBounds","bodyOverflow","query","origin","domain","col","profile","suggestProfile","collection","searchPathUrl","requestAutocompleteResults","list","clearAndHideSuggestions","disp","input","keyCode","setLocation","coords","latitude","longitude","geolocation","getCurrentPosition","addCommas","nStr","x","x1","x2","rgx","formatToPercentage","parseFloat","formatToCurrency","round","loadPricingTemplate","treatmentName","treatmentCode","hospitalName","dataset","initialConsultantFeeMissingText","overridePriceFeeMissingText","innerTemplate","ProceduresApi","monthlyPayment","loanAmount","depositTyped","term","representativeAprTyped","item","totalAmountPayable","procedureName","Procedure","procedureCode","ProcedureCode","initialConsultantFee","InitialConsultation","treatmentPrice","TreatmentPrice","guidePrice","GuidePrice","TreatmentLoan","MonthlyPayment","LoanAmount","Deposit","Term","RepresentativeAPR","TotalAmountPayable","financeCalculatorlink","RateCardPrice","ConsultantPrice","AnaesthetistPrice","pricing","[object Object]","hospitalid","treatments","forEach","Id","Code","TreatmentName","ison","treatmentUrl","bodyElement","dtype","apiPricingPage","loadPrices","clickEvents","livePerson","click","cookiesSettings","OneTrust","ToggleInfoDisplay","liveChat","storedItemKey","storedItem","checkCache","parse","lastRequest","getHours","getLatestTimes","updateChatStatus","request","XMLHttpRequest","onreadystatechange","currentTarget","readyState","response","newItem","from","From","until","Until","send","firstTime","fromMins","getMinutes","untilMins","nowMins","desktopLive","desktopFaq","mobileLive","mobileFaq","desktopElementsMissing","changeMobile","changeDesktop","style","display","getURLQueryStrings","assoc","decode","keyValues"],"mappings":"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","sourcesContent":["var sha256 = function sha256(ascii) {\r\n function rightRotate(value, amount) {\r\n return (value >>> amount) | (value << (32 - amount));\r\n };\r\n\r\n var mathPow = Math.pow;\r\n var maxWord = mathPow(2, 32);\r\n var lengthProperty = 'length'\r\n var i, j; // Used as a counter across the whole file\r\n var result = ''\r\n\r\n var words = [];\r\n var asciiBitLength = ascii[lengthProperty] * 8;\r\n\r\n //* caching results is optional - remove/add slash from front of this line to toggle\r\n // Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes\r\n // (we actually calculate the first 64, but extra values are just ignored)\r\n var hash = sha256.h = sha256.h || [];\r\n // Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes\r\n var k = sha256.k = sha256.k || [];\r\n var primeCounter = k[lengthProperty];\r\n /*/\r\n var hash = [], k = [];\r\n var primeCounter = 0;\r\n //*/\r\n\r\n var isComposite = {};\r\n for (var candidate = 2; primeCounter < 64; candidate++) {\r\n if (!isComposite[candidate]) {\r\n for (i = 0; i < 313; i += candidate) {\r\n isComposite[i] = candidate;\r\n }\r\n hash[primeCounter] = (mathPow(candidate, .5) * maxWord) | 0;\r\n k[primeCounter++] = (mathPow(candidate, 1 / 3) * maxWord) | 0;\r\n }\r\n }\r\n\r\n ascii += '\\x80' // Append Ƈ' bit (plus zero padding)\r\n while (ascii[lengthProperty] % 64 - 56) ascii += '\\x00' // More zero padding\r\n for (i = 0; i < ascii[lengthProperty]; i++) {\r\n j = ascii.charCodeAt(i);\r\n if (j >> 8) return; // ASCII check: only accept characters in range 0-255\r\n words[i >> 2] |= j << ((3 - i) % 4) * 8;\r\n }\r\n words[words[lengthProperty]] = ((asciiBitLength / maxWord) | 0);\r\n words[words[lengthProperty]] = (asciiBitLength)\r\n\r\n // process each chunk\r\n for (j = 0; j < words[lengthProperty];) {\r\n var w = words.slice(j, j += 16); // The message is expanded into 64 words as part of the iteration\r\n var oldHash = hash;\r\n // This is now the undefinedworking hash\", often labelled as variables a...g\r\n // (we have to truncate as well, otherwise extra entries at the end accumulate\r\n hash = hash.slice(0, 8);\r\n\r\n for (i = 0; i < 64; i++) {\r\n var i2 = i + j;\r\n // Expand the message into 64 words\r\n // Used below if \r\n var w15 = w[i - 15], w2 = w[i - 2];\r\n\r\n // Iterate\r\n var a = hash[0], e = hash[4];\r\n var temp1 = hash[7]\r\n + (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) // S1\r\n + ((e & hash[5]) ^ ((~e) & hash[6])) // ch\r\n + k[i]\r\n // Expand the message schedule if needed\r\n + (w[i] = (i < 16) ? w[i] : (\r\n w[i - 16]\r\n + (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) // s0\r\n + w[i - 7]\r\n + (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10)) // s1\r\n ) | 0\r\n );\r\n // This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble\r\n var temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) // S0\r\n + ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); // maj\r\n\r\n hash = [(temp1 + temp2) | 0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()\r\n hash[4] = (hash[4] + temp1) | 0;\r\n }\r\n\r\n for (i = 0; i < 8; i++) {\r\n hash[i] = (hash[i] + oldHash[i]) | 0;\r\n }\r\n }\r\n\r\n for (i = 0; i < 8; i++) {\r\n for (j = 3; j + 1; j--) {\r\n var b = (hash[i] >> (j * 8)) & 255;\r\n result += ((b < 16) ? 0 : '') + b.toString(16);\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n\r\nvar helper = { \r\n getQueryVariable: function (variable) {\r\n\r\n var query = window.location.search.substring(1);\r\n var vars = query.split(\"&\");\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split(\"=\");\r\n if (pair[0] == variable) { return pair[1]; }\r\n }\r\n return (false);\r\n }, \r\n getQueryStringByName: function (name) {\r\n\r\n name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\r\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\r\n results = regex.exec(location.search);\r\n return results === null ? \"\" : decodeURIComponent(decodeURIComponent(results[1].replace(/\\+/g, \" \")));\r\n }, \r\n calculateDistance: function (lat1, lon1, lat2, lon2) {\r\n\r\n var radlat1 = Math.PI * lat1 / 180;\r\n var radlat2 = Math.PI * lat2 / 180;\r\n var radlon1 = Math.PI * lon1 / 180;\r\n var radlon2 = Math.PI * lon2 / 180;\r\n var theta = lon1 - lon2;\r\n var radtheta = Math.PI * theta / 180;\r\n var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);\r\n dist = Math.acos(dist);\r\n dist = dist * 180 / Math.PI;\r\n dist = dist * 60 * 1.1515;\r\n \r\n return dist;\r\n },\r\n breakpoints: function (viewport) {\r\n var bp = {\r\n desktop: 960,\r\n tablet: 600,\r\n mobileNav: 480,\r\n };\r\n\r\n return (window.innerWidth > bp[viewport]);\r\n },\r\n age: function(d,m,y){\r\n\r\n var today = new Date(),\r\n thisYear = today.getFullYear(),\r\n thisMonth = today.getMonth() + 1,\r\n thisDate = today.getDate();\r\n\r\n var age = thisYear - y;\r\n\r\n if(thisMonth < m || thisMonth === m && d <= thisDate){\r\n age--;\r\n }\r\n\r\n return age;\r\n },\r\n debounce: function (func, wait, immediate) {\r\n var timeout;\r\n return function() {\r\n var context = this, args = arguments;\r\n var later = function() {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n var callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n }\r\n};\r\n\r\n/* Null optional values should not be passed to ga send as subsequent optional values will not register:\r\n\"If you want to provide a value only for the second or 3rd optional parameter, you need to pass in undefined for the preceding optional parameter.\"\r\nhttps://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEventTracking#_gat.GA_EventTracker_._trackEvent\r\n*/\r\n\r\nvar gaHelper = {\r\n trackEvent: function (category, action, opt_label, opt_value, opt_noninteraction) {\r\n\r\n if (opt_label === null) opt_label = undefined;\r\n if (opt_value === null) opt_value = undefined;\r\n\r\n try {\r\n /*ga('send', 'event', category, action, opt_label, opt_value, \r\n {\r\n nonInteraction: opt_noninteraction,\r\n 'dimension1': 'New Website Hit',\r\n 'dimension2': 'New Website Session',\r\n 'dimension3': 'New Website User'\r\n\r\n });\t\t\t*/\r\n \r\n } catch (e) {\r\n // console.log(e);\r\n }\r\n }\r\n};\r\n\r\n /* var scrollArrow = {\r\n \tinit: function(){\r\n\r\n \t\t$(\".homepage-hero\").prepend('');\r\n\r\n \t\tvar $arrow = $('.homepage-hero__scroll-down');\r\n\r\n \t\tfunction aBounce(element, distance, speed) {\r\n \t\t for(i = 0; i < 2000; i++) {\r\n \t\t element.animate({bottom: '-='+distance},speed)\r\n \t\t .animate({bottom: '+='+distance},speed);\r\n \t\t } \r\n \t\t}\r\n\r\n \t\t$(window).load(function() {\r\n \t\t\taBounce( $arrow, '10px', 600); \r\n \t\t});\r\n\r\n \t\t$(window).scroll(function() {\r\n \t\t if ($(this).scrollTop() > 100) {\r\n \t\t $arrow.stop(aBounce); \r\n \t\t }\r\n \t\t}); \r\n\r\n \t}\r\n };\r\n\r\n var homepageHero = {\r\n \tinit: function(){\r\n\r\n \t\tvar resizeThrottle,\r\n \t\t\tthat = this;\r\n\r\n \t\tthis.applyHeight();\r\n \t\tthis.vAlignedContent();\r\n\r\n \t\t$(window).resize(function(){\r\n \t\t\tclearTimeout(resizeThrottle);\r\n \t\t\tresizeThrottle = setTimeout( function(){\r\n \t\t\t\tthat.applyHeight();\r\n \t\t\t that.vAlignedContent();\r\n \t\t\t}, 100 );\r\n \t\t});\r\n\r\n \t},\r\n \tapplyHeight: function(){\r\n \r\n \t\tvar wh = $(window).height(),\r\n \t\t\tww = $(window).width(),\r\n \t\t\tar = 3/4,\r\n \t\t\th = wh < ww * ar ? wh - 10 : ww * ar;\r\n\r\n \t\t$(\".js-homepage-hero\").height(h);\r\n \t},\r\n\r\n \tvAlignedContent: function(){\r\n\r\n \t\tvar hh = $(\".site-header__top \").height(),\r\n \t\t\twh = $(\".homepage-hero\").height(),\r\n \t\t\tch = $(\".homepage-hero__content\").height(),\r\n \t\t\ttp = ((wh - ch)/2),\r\n \t\t\tposition = (tp + hh);\r\n\r\n \t\t$(\".homepage-hero__content\").css('top', position);\r\n\r\n \t}\r\n\r\n };*/\r\n\r\nvar homepageHero = {\r\n \r\n init: function(){\r\n\r\n $('.homepage-hero__content__links ul li').on('click', function() {\r\n var name = $(this).find('a').text(),\r\n href = $(this).find('a').attr('href');\r\n gaHelper.trackEvent(\"Hero Banner link\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name + \", Link: \" + href, null, true);\r\n }); \r\n\r\n\r\n }\r\n\r\n};\r\n\r\nvar noImageHeader = {\r\n\r\n init: function () {\r\n\r\n var $pH = $('.page-header');\r\n\r\n $pH.addClass('page-header--no-image');\r\n\r\n if ($('.page-header img').length > 0) { \r\n $pH.removeClass('page-header--no-image');\r\n }\r\n\r\n }\r\n\r\n};\r\n\r\nvar liquidHero = {\r\n\r\n init: function () {\r\n\r\n var homeHeroImage = $('.homepage-hero'),\r\n consultantHeroImage = $('.consultant-header'),\r\n imageHeader = $('.image-header__image');\r\n \r\n homeHeroImage.imgLiquid();\r\n\r\n imageHeader.imgLiquid({\r\n verticalAlign: '20%'\r\n\r\n });\r\n \r\n var resizeHandler = function(){\r\n homeHeroImage.imgLiquid();\r\n imageHeader.imgLiquid();\r\n };\r\n\r\n $(window).resize(resizeHandler);\r\n } \r\n};\r\n\r\nvar awards = {\r\n\r\n init: function () {\r\n\r\n $('.awards-carousel').slick({\r\n infinite: true,\r\n slidesToShow: 4,\r\n slidesToScroll: 4,\r\n autoplay: true,\r\n autoplaySpeed: 1500,\r\n speed: 1500,\r\n cssEase: 'linear',\r\n responsive: \r\n [\r\n {\r\n breakpoint: 960,\r\n settings: {\r\n slidesToShow: 3,\r\n slidesToScroll: 3,\r\n centerMode: true,\r\n speed: 800,\r\n slidesPerRow: 2,\r\n centerPadding: 0,\r\n rows: 1,\r\n dots: true\r\n }\r\n },\r\n {\r\n breakpoint: 700,\r\n settings: {\r\n slidesToShow: 2,\r\n slidesToScroll: 1,\r\n }\r\n },\r\n\r\n {\r\n breakpoint: 480,\r\n settings: {\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n }\r\n }\r\n ]\r\n\r\n });\r\n }\r\n};\r\n\r\nvar insurers = {\r\n\r\n init: function () {\r\n\r\n $('.insurers-carousel').slick({\r\n infinite: true,\r\n slidesToShow: 4,\r\n slidesToScroll: 4,\r\n autoplay: true,\r\n autoplaySpeed: 1500,\r\n speed: 1500,\r\n cssEase: 'linear',\r\n responsive: \r\n [\r\n {\r\n breakpoint: 960,\r\n settings: {\r\n slidesToShow: 3,\r\n slidesToScroll: 3,\r\n centerMode: true,\r\n speed: 800,\r\n slidesPerRow: 2,\r\n centerPadding: 0,\r\n rows: 1,\r\n dots: true\r\n }\r\n },\r\n {\r\n breakpoint: 700,\r\n settings: {\r\n slidesToShow: 2,\r\n slidesToScroll: 1,\r\n }\r\n },\r\n\r\n {\r\n breakpoint: 480,\r\n settings: {\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n }\r\n }\r\n ]\r\n\r\n });\r\n }\r\n};\r\n\r\nvar gallery = {\r\n\r\n init: function () {\r\n\r\n $('.js-gallery__slider').slick({\r\n infinite: true,\r\n slidesToShow: 3,\r\n slidesToScroll: 3,\r\n autoplay: true,\r\n dots: true,\t\t\t \r\n speed: 1500,\r\n autoplaySpeed: 1500,\r\n cssEase: 'linear',\r\n responsive: \r\n [\r\n {\r\n breakpoint: 960,\r\n settings: {\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n centerMode: true,\r\n speed: 800,\r\n slidesPerRow: 2,\r\n centerPadding: 0,\r\n rows: 1,\r\n dots: true\r\n }\r\n },\r\n {\r\n breakpoint: 600,\r\n settings: {\r\n slidesToShow: 1,\r\n centerMode: true,\r\n speed: 800,\r\n centerPadding: 5\r\n }\r\n }\r\n ]\r\n\r\n });\r\n }\r\n};\r\n\r\nvar videoLightbox = {\r\n\r\n init: function () {\r\n\r\n var $lightboxLink = $(\"a[rel^='js-videoLightbox']\");\r\n\r\n if (helper.breakpoints(\"tablet\")) {\r\n\r\n $lightboxLink.each( function() {\r\n\r\n var $testimonialLinkHtml = \"\";\r\n if ($(this).attr('data-testimonial-url')) {\r\n var $testimonialUrl = $(this).attr('data-testimonial-url');\r\n $testimonialLinkHtml = 'Read full testimonial';\r\n }\r\n\r\n $(this).prettyPhoto({\r\n social_tools: '',\r\n show_title: false,\r\n theme: 'light_square',\r\n deeplinking: false,\r\n overlay_gallery: false,\r\n horizontal_padding: 60,\r\n default_width: 800,\r\n default_height: 500,\r\n hideflash: true,\r\n wmode: 0,\t\t \t\r\n //Default prettyphoto markup apart from adding wrapper classes and removing arrows\r\n iframe_markup: '
',\r\n markup: '
 
Expand

{pp_social}' + $testimonialLinkHtml + 'Close
'\r\n });\t\t\r\n });\t\t\t\r\n }\r\n }\r\n};\r\n\r\nvar galleryLightbox = {\r\n\r\n init: function () {\r\n\r\n var $windowWidth = getWindowWidth().width;\r\n var $lightboxLink = $(\"a[rel^='prettyPhoto']\");\r\n\r\n if ($windowWidth > 599) {\r\n\r\n $lightboxLink.prettyPhoto({\r\n social_tools: '',\r\n show_title: false,\r\n theme: 'light_square',\r\n deeplinking: false,\r\n default_width: 800,\r\n default_height: 500,\r\n overlay_gallery: false,\r\n horizontal_padding: 60,\r\n hideflash: true,\r\n wmode: 0,\r\n //Pause / restart slick slider on open / close lightbox\r\n changepicturecallback: function(){$('.gallery__slider').slick('slickPause');},\r\n callback: function(){$('.gallery__slider').slick('slickPlay');},\r\n //Default prettyphoto markup apart from adding wrapper classes\r\n iframe_markup: '
',\r\n markup: '
 
'\r\n });\t\t\r\n } else {\r\n $lightboxLink.on(\"click\", function (e) {\r\n\r\n if ($(this).hasClass('js-gallery__video')) {\r\n $(this).attr('target','_blank');\r\n } else {\r\n e.preventDefault();\t\r\n }\r\n\r\n });\r\n }\r\n }\r\n};\r\n\r\nvar alphabeticFilter = {\r\n\r\n init: function () {\r\n\r\n var aLetters = $('.js-az-menu a'),\r\n aContentRows = $('.js-az-accordion-group'),\r\n aContent = aContentRows.find('.js-accordion__content'),\r\n aContentLinks = aContent.find('a'),\r\n $toggles = aContentRows.find('.js-accordion__toggle');\r\n\r\n // Find empty accordion sections and disable them\r\n aContent.each(function(){ \r\n if (jQuery.trim($(this).text()) === \"\") {\r\n $(this).parent().addClass('accordion--is-disabled');\r\n }\r\n });\r\n\r\n aLetters.on('click',function (e) {\r\n\r\n e.preventDefault();\r\n\r\n // Smooth scroll\r\n var target = this.hash;\r\n var $target = $(target);\r\n\r\n var offset = 0;\r\n\r\n if(helper.breakpoints(\"desktop\")){\r\n offset = - 250 - $(\".site-content\").offset().top;\r\n }\r\n\r\n aContent.removeClass(\"is-on\");\r\n\r\n $('html, body').stop().animate({\r\n 'scrollTop': $target.offset().top + offset\r\n }, 900, 'swing', function () {\r\n window.location.hash = target;\r\n $target.find(\".js-accordion__content, .js-accordion__toggle\").addClass(\"is-on\");\r\n });\r\n\r\n });\r\n\r\n } \r\n};\r\n\r\nvar siteHeader = {\r\n init: function () {\r\n\r\n var $siteHeader = $(\".js-site-header\"),\r\n throttle;\r\n\r\n if ($siteHeader.length === 0) {\r\n return;\r\n }\r\n\r\n if($siteHeader.hasClass(\"site-header--homepage\")) { \r\n $siteHeader.on(\"mouseenter\", function () {\r\n $siteHeader.removeClass(\"site-header--homepage\");\r\n clearTimeout(throttle);\r\n }).on(\"mouseleave\", function () {\r\n clearTimeout(throttle);\t\t\t\r\n\r\n throttle = setTimeout(function(){\r\n $siteHeader.addClass(\"site-header--homepage\");\r\n },2000);\r\n });\r\n }\t\t\r\n }\r\n};\r\n\r\nvar siteHeaderSearch = {\r\n config:{\r\n $form: $(\".js-site-header__main__search\"),\r\n $searchInput: $(\".js-site-header__main__search__field\"),\r\n $searchProfile: $(\".js-site-header__main__search__profile\"),\r\n $reset: $(\".js-site-header__main__search__reset\"),\r\n $prompt: $(\".js-site-header__main__search__autocomplete__prompt\"),\r\n $warning: $(\".js-site-header__main__search__autocomplete__warning\"),\r\n $results: $(\".js-site-header__main__search__autocomplete__results\")\r\n },\r\n init: function () {\r\n\r\n var that = this;\r\n\r\n var onUpdate = helper.debounce(function(element){\r\n\r\n var value = $(element).val();\r\n\r\n if(value.length > 0) {\r\n that.config.$reset.addClass(\"is-on\");\r\n } else {\r\n that.config.$reset.removeClass(\"is-on\");\r\n }\r\n\r\n if(value.length < 3) {\r\n that.config.$warning.addClass(\"is-on\");\r\n that.config.$prompt.removeClass(\"is-on\");\r\n that.config.$results.removeClass(\"is-on\");\r\n } else {\r\n that.config.$warning.removeClass(\"is-on\");\r\n that.config.$prompt.removeClass(\"is-on\");\r\n that.performSearch(value);\r\n //gaHelper.trackEvent(\"Header Search\", \"User typed\", window.location.href, value, true);\r\n }\r\n\r\n },250);\r\n\r\n var onFocus = function(){\r\n var value = that.config.$searchInput.val();\r\n\r\n if(value.length === 0) { \r\n that.config.$warning.removeClass(\"is-on\");\r\n that.config.$results.removeClass(\"is-on\");\r\n that.config.$prompt.addClass(\"is-on\");\r\n }\r\n };\r\n\r\n var onBlur = function(){\r\n that.config.$prompt.removeClass(\"is-on\");\r\n that.config.$warning.removeClass(\"is-on\");\r\n };\r\n\r\n\r\n that.config.$searchInput.on(\"input\", function (e) {\r\n onUpdate(this);\r\n }).on(\"focus\", function (e) {\r\n onFocus();\r\n }).on(\"blur\", function(e) {\r\n onBlur();\r\n });\r\n\r\n that.config.$results.on(\"click\", \".search-autocomplete__keywords li\", function (e) {\r\n e.preventDefault();\r\n that.config.$searchInput.val($(this).text());\r\n that.config.$results.removeClass(\"is-on\");\r\n that.config.$form.submit();\r\n });\r\n\r\n that.config.$form.on(\"submit\", function (e) {\r\n var value = $(this).find(that.config.$searchInput).val();\r\n if(value.length < 3){\r\n e.preventDefault();\r\n that.config.$warning.addClass(\"is-on\");\r\n } else {\t\t\t\t\r\n //gaHelper.trackEvent(\"Header Search\", \"User Submitted\", window.location.href, value, true);\r\n }\r\n });\r\n\r\n that.config.$reset.on(\"click\", function (e) {\r\n e.preventDefault();\r\n //gaHelper.trackEvent(\"Header Search\", \"User Reset\", window.location.href, undefined, true);\r\n that.config.$searchInput.val(\"\").trigger('focus');\r\n that.config.$results.removeClass(\"is-on\");\r\n that.config.$reset.removeClass(\"is-on\");\r\n });\t\t\r\n },\r\n performSearch: function (searchTerm) {\r\n\r\n var that = this;\r\n var endpoint = apilocation + \"SiteSearch/Suggestions?query=\" + encodeURIComponent(searchTerm) + \"&profile=\" + that.config.$searchProfile.val();\r\n if (mockApi) {\r\n var mockResults = \"{\\\"keywords\\\":[\\\"knee hip ankle shoulder surgery\\\",\\\"ankle\\\",\\\"ankle arthroscopy\\\",\\\"ankle replacement\\\",\\\"foot ankle\\\",\\\"ankles\\\",\\\"total ankle replacement surgery\\\",\\\"foot ankle surgery\\\",\\\"foot and ankle clinic\\\",\\\"ankle fusion surgery\\\"],\\\"actionLinks\\\":[]}\";\r\n that.results(mockResults);\r\n return;\r\n }\r\n\r\n $.ajax({\r\n method: \"GET\",\r\n url: endpoint,\r\n dataType: \"json\",\r\n }).done(function(data){\r\n that.results(data);\r\n });\r\n },\r\n results: function (apiResults) {\r\n var that = this;\r\n\r\n var resp = $.parseJSON(apiResults);\r\n // jshint multistr:true\r\n\r\n var templateString = '
';\r\n templateString += '
';\r\n templateString += '';\r\n templateString += '
';\r\n templateString += '
';\r\n templateString += '';\r\n templateString += '
';\r\n templateString += '
';\r\n\r\n var template = Handlebars.compile(templateString);\r\n var html = template(resp);\r\n\r\n if (resp.actionLinks.length > 0 || resp.keywords.length > 0) {\r\n that.config.$results.addClass(\"is-on\").html(html);\r\n } else {\r\n that.config.$results.removeClass(\"is-on\").html(html);\r\n }\r\n }\r\n};\r\n\r\nvar stickyHeader = {\r\n\r\n \r\n\r\n init: function () {\r\n\r\n var _this = this;\r\n\r\n var siteHeader = $('.js-site-header'),\r\n siteStickyClass = \"is-sticky-header\",\r\n mobileHeader = $(\".js-site-header-mobile\"),\r\n mobileStickyClass = \"site-header-mobile--sticky\",\r\n siteContainer = $(\".site-container\");\r\n\r\n if (siteHeader.length === 0) {\r\n return;\r\n }\r\n\r\n siteHeader.attr('id', 'js-site-header');\t\r\n\r\n siteHeader.removeClass(\"is-sticky\");\r\n siteContainer.removeClass(\"is-sticky-header\").removeAttr(\"style\");\r\n\r\n // Added to force clearing the sticky nav when the scroll position is 0 as sometimes it gets stuck with the waypoint process.\r\n window.addEventListener(\"scroll\", function (event) {\r\n if (this.scrollY == 0) {\r\n //console.log(\"Cleared sticky\");\r\n $(\".site-header__nav\").show();\r\n siteHeader.removeClass(\"is-sticky\");\r\n siteContainer.removeClass(\"is-sticky-header\").removeAttr(\"style\");\r\n $(\".treatment-contact-us-bar\").css({ 'position': 'relative', 'top': 'auto', 'width': 'auto' });\r\n $(\".anchor\").removeClass('is-sticky');\r\n mobileHeader.removeClass(_this.mobileStickyClass);\r\n }\r\n });\r\n\r\n // New sticky nav process\r\n _this.waypoint = new Waypoint({\r\n element: $(\".site-header__waypoint\")[0],\r\n handler: function (direction) {\r\n\r\n\r\n if (direction === \"down\") {\r\n //console.log(\"Scrolling down\");\r\n \r\n $(\".site-header__nav\").hide();\r\n siteHeader.addClass(\"is-sticky\");\r\n siteContainer.addClass(\"is-sticky-header\").css({ paddingTop: siteHeader.find(\".site-header__fixed\").height() });\r\n $(\".treatment-contact-us-bar\").css({ 'position': 'fixed', 'top': '80px', 'width': '100%' });\r\n $(\".anchor\").addClass('is-sticky');\r\n\r\n\r\n mobileHeader.addClass(_this.mobileStickyClass);\r\n }\r\n else if (direction === \"up\") {\r\n //console.log(\"Scrolling up\");\r\n\r\n $(\".site-header__nav\").show();\r\n siteHeader.removeClass(\"is-sticky\");\r\n siteContainer.removeClass(\"is-sticky-header\").removeAttr(\"style\");\r\n $(\".treatment-contact-us-bar\").css({ 'position': 'relative', 'top': 'auto', 'width': 'auto' });\r\n $(\".anchor\").removeClass('is-sticky');\r\n\r\n mobileHeader.removeClass(_this.mobileStickyClass);\r\n }\r\n\r\n\r\n\r\n },\r\n offset: 0\r\n });\r\n // End new sticky nav process\r\n\r\n\r\n //if (helper.breakpoints(\"desktop\")) {\r\n\r\n // var waypoint = new Waypoint({\r\n \r\n // element: $(\".site-header__waypoint\")[0],\r\n\r\n // handler: function (direction) {\t\t\t\t\t\t\t\t\r\n\r\n // if( direction === \"down\" ){\r\n // $(\".site-header__nav\").hide();\r\n // siteHeader.addClass(\"is-sticky\");\t\t\t\t\t\r\n // siteContainer.addClass(\"is-sticky-header\").css({ paddingTop: siteHeader.find(\".site-header__fixed\").height() });\r\n\r\n // $(\".treatment-contact-us-bar\").css({ 'position': 'fixed', 'top': '80px', 'width' : '100%' });\r\n // $(\".anchor\").addClass('is-sticky');\r\n\r\n\r\n // } else if (direction === \"up\") {\r\n // $(\".site-header__nav\").show();\r\n // siteHeader.removeClass(\"is-sticky\");\r\n // siteContainer.removeClass(\"is-sticky-header\").removeAttr(\"style\");\r\n\r\n // $(\".treatment-contact-us-bar\").css({ 'position': 'relative', 'top': 'auto', 'width': 'auto' });\r\n // $(\".anchor\").removeClass('is-sticky');\r\n // }\t\t\t\t\r\n // }\t\t\t\r\n // });\r\n //} else {\r\n // if (mobileHeader.length > 0) {\r\n\r\n // var waypointMobile = new Waypoint({\r\n \r\n // element: mobileHeader[0],\r\n\r\n // handler: function (direction) {\t\t\t\t\t\t\t\t\r\n // if( direction === \"down\" ){\r\n // mobileHeader.addClass(mobileStickyClass);\r\n // siteContainer.css({paddingTop: mobileHeader.height()});\t\r\n // } else if (direction === \"up\") {\r\n // mobileHeader.removeClass(mobileStickyClass);\r\n // siteContainer.removeAttr(\"style\");\r\n // }\t\t\t\t\r\n // }\t\t\t\r\n // });\t\t\r\n\r\n // }\t\r\n\r\n // if (mobileHeader.length > 0) {\r\n // }\t\t\t\r\n //}\t\t\t\r\n\r\n var $toggles = $(\".js-toggle-site-header__locations, .js-accordion__cookie\");\r\n\r\n $toggles.on('click', function(e) {\r\n e.preventDefault();\r\n setTimeout(function(){ Waypoint.refreshAll(); }, 0);\r\n });\r\n\r\n var $enqBtn = $('.call-back-request');\r\n\r\n $('.call-back-request').on('click', function() {\r\n $(\".site-container\").css('paddingTop', '0');\r\n $(\".js-site-header\").removeClass('is-sticky');\r\n waypoint.disable();\r\n });\r\n\r\n $(\".js-enquiry-toggle\").on('click', function() {\r\n waypoint.enable();\r\n });\r\n }\r\n \r\n};\r\n\r\n\r\nif (!Element.prototype.matches) {\r\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector;\r\n}\r\n\r\nif (!Element.prototype.closest) {\r\n Element.prototype.closest = function (s) {\r\n var el = this;\r\n\r\n do {\r\n if (el.matches(s)) return el;\r\n el = el.parentElement || el.parentNode;\r\n } while (el !== null && el.nodeType === 1);\r\n return null;\r\n };\r\n}\r\n\r\nvar siteHeaderLocations = {\r\n\r\n init: function(){\r\n\r\n var $toggle = $(\".js-toggle-site-header__locations\"),\r\n $target = $(\".js-site-header__locations\"),\r\n $header = $('.site-header'),\r\n $headerTop = $('.site-header__top'),\r\n $nav = $('.site-nav__bar'),\r\n $topMenuList = $(\".site-header__top-menu__list\"),\r\n $topNav = $(\".js-top-nav\");\r\n\r\n $toggle.on(\"click\", function (e) {\r\n e.preventDefault();\r\n \r\n if ($(this).hasClass('is-on')) {\r\n $(this).removeClass('is-on');\r\n $target.removeClass('is-on');\r\n $headerTop.removeClass('is-filled');\r\n $nav.removeClass('is-filled');\r\n $topMenuList.removeClass(\"site-header__top-menu__list--select-hospital\");\r\n // $(\".site-header__top-menu__item\").addClass(\"site-header__top-menu__item--border\");\r\n } else {\r\n $topNav.find(\".navigation a\").removeClass(\"selected\");\r\n $topNav.find(\".content\").hide();\r\n $(this).addClass('is-on');\r\n $target.addClass('is-on');\r\n $headerTop.addClass('is-filled');\r\n $nav.addClass('is-filled');\r\n $topMenuList.addClass(\"site-header__top-menu__list--select-hospital\");\r\n // $(\".site-header__top-menu__item\").removeClass(\"site-header__top-menu__item--border\");\r\n\r\n }\r\n\r\n });\r\n\r\n\r\n $topNav.find(\".navigation a\").on('click',function (e) {\r\n var rel = $(this).attr('rel');\r\n $topNav.find(\".content\").hide();\r\n\r\n $topNav.find(\".navigation a\").removeClass(\"selected\");\r\n $(this).addClass(\"selected\");\r\n\r\n $topNav.find(\".footer\").hide();\r\n\r\n $(rel).show();\r\n });\r\n\r\n $topNav.find(\".body a\").on('mouseenter', function() {\r\n\r\n var data = $(this).parent().find(\".data\");\r\n var infinityNumber = $(this).parent().find(\".InfinityNumber\");\r\n var hospital = $(data).data(\"hospital\");\r\n var address = $(data).data(\"address\");\r\n var telephone = infinityNumber.text();\r\n var footerPanel = $(this).parent().parent().parent().find(\".footer\");\r\n\r\n $(footerPanel).find(\".hospital\").text(hospital + \",\");\r\n $(footerPanel).find(\".address\").html(address);\r\n var telA = $(footerPanel).find(\".telephone > a\");\r\n $(telA).find(\"span\").text(telephone);\r\n\r\n $(footerPanel).show();\r\n }, function() {\r\n //$(this).parent().parent().parent().find(\".footer\").hide();\r\n });\r\n\r\n\r\n $(document).on('click',function (e) {\r\n if (!($(e.target).closest(\".js-site-header__locations\").length)) {\r\n\r\n if (!e.target.closest(\".locations-button\")) {\r\n if ($(\".js-toggle-site-header__locations\").hasClass(\"is-on\")) {\r\n $(\".js-toggle-site-header__locations\").trigger(\"click\");\r\n }\r\n }\r\n\r\n }\r\n });\r\n\r\n }\r\n\r\n};\r\n\r\nvar callBackRequest = {\r\n init: function () {\r\n\r\n $('.site-container').attr('id', 'site-container');\r\n $('.contact-panel .call-back-request').attr('href', '#site-container');\r\n\r\n $(document).on('click', '.call-back-request', function (){\r\n $('.js-enquiry-toggle').addClass(\"is-on\").children('span').html('Close');\r\n $('.site-header > .js-enquiry-form').addClass('is-on');\r\n $('.js-site-nav, .js-search-toggle').addClass('is-hidden');\r\n $('.call-back-request').addClass('is-selected');\r\n });\r\n\r\n }\r\n};\r\n\r\nvar siteHeaderEnquiry = {\r\n init: function () {\r\n\r\n var text;\r\n\r\n $(\".js-enquiry-toggle\").on(\"click\", function (e) {\r\n\r\n e.preventDefault();\r\n\r\n var that = this;\r\n\r\n if( $(this).hasClass(\"is-on\") ) {\r\n $(this).removeClass(\"is-on\").children(\"span\").html(text);\r\n $(this).children(\"span\").html(\"Enquire\");\r\n $('.site-header > .js-enquiry-form').removeClass(\"is-on\");\r\n $(\".js-site-nav, .js-search-toggle\").removeClass(\"is-hidden\");\r\n $(\".js-site-header\").removeClass(\"is-sticky-override\");\r\n $(\".site-header--homepage, .site-nav__bar\").removeClass(\"is-filled\");\r\n\r\n gaHelper.trackEvent(\"Enquiry Form\", \"Close\", undefined, undefined, true);\r\n\r\n } else {\r\n\r\n text = text || $(this).text();\r\n\r\n $(\"html, body\").animate({\"scrollTop\": 0}, 500, function () {\r\n $(that).addClass(\"is-on\").children(\"span\").html($(that).data(\"closeText\"));\r\n $('.site-header > .js-enquiry-form').addClass(\"is-on\");\r\n $(\".js-site-nav, .js-search-toggle\").addClass(\"is-hidden\");\r\n $(\".js-site-header\").addClass(\"is-sticky-override\");\r\n $(\".site-header__top, .site-nav__bar\").addClass(\"is-filled\");\r\n $(\".js-search-form, .js-search-close\").removeClass(\"is-on\");\t\r\n\r\n });\r\n \r\n gaHelper.trackEvent(\"Enquiry Form\", \"Open\", undefined, undefined, true);\r\n\r\n }\r\n\r\n });\r\n\r\n }\r\n};\r\n\r\nvar siteHeaderTracking = {\r\n\r\n init: function () {\r\n // this.globalItems();\r\n this.locationItems();\r\n //this.primaryItems();\t \r\n this.secondaryItems();\r\n //this.footerItems();\r\n },\r\n\r\n globalItems: function () {\r\n\r\n $(\".site-header__top-menu\").on(\"click\", \".site-header__top-menu__item:not(.js-toggle-site-header__locations) \", function (e) {\r\n var name = $(this).find('a').text();\r\n gaHelper.trackEvent(\"Global Navigation\", \"Click\", \"Current URL: \" + window.location.href + \", Navigation item: \" + name, undefined, true);\r\n });\r\n },\r\n\r\n locationItems: function () {\r\n\r\n $(\".site-header__locations .site-header__locations__list\").on(\"click\", \"li\", function (e) {\r\n var name = $(this).children('a').text();\r\n gaHelper.trackEvent(\"Location Navigation\", \"Click\", \"Current URL: \" + window.location.href + \", Location item: \" + name, undefined, true);\r\n });\r\n },\r\n\r\n primaryItems: function () {\r\n\r\n $(\".site-header__nav\").on(\"click\", \".site-nav__list__item\", function (e) {\r\n var name = $(this).children('a').text();\r\n gaHelper.trackEvent(\"Primary Navigation\", \"Click\", \"Current URL: \" + window.location.href + \", Navigation item: \" + name, undefined, true);\r\n });\r\n\r\n //Mobile\r\n $(\".site-nav-mobile\").on(\"click\", \".site-nav-mobile__list__item\", function (e) {\r\n var name = $(this).children('a').text();\r\n gaHelper.trackEvent(\"Primary Navigation\", \"Click\", \"Current URL: \" + window.location.href + \", Navigation item: \" + name, undefined, true);\r\n });\r\n },\r\n\r\n secondaryItems: function () {\t\t\r\n\r\n $(\".site-nav__l1 .site-nav__l2\").on(\"click\", \".site-nav__column__item\", function (e) {\r\n var name = $(this).children('a').text();\r\n gaHelper.trackEvent(\"Secondary Navigation\", \"Click\", \"Current URL: \" + window.location.href + \", Navigation item: \" + name, undefined, true);\r\n });\r\n\r\n //Mobile\r\n $(\".site-nav-mobile__l1 .site-nav-mobile__l2\").on(\"click\", \".site-nav-mobile__list__item\", function (e) {\r\n var name = $(this).children('a').text();\r\n gaHelper.trackEvent(\"Secondary Navigation\", \"Click\", \"Current URL: \" + window.location.href + \", Navigation item: \" + name, undefined, true);\r\n });\r\n },\r\n\r\n footerItems: function () {\t\t\r\n\r\n $(\".footerlinks\").on(\"click\", \".footerlinks__item\", function (e) {\r\n var name = $(this).children('a').text();\r\n gaHelper.trackEvent(\"Footer Navigation\", \"Click\", \"Current URL: \" + window.location.href + \", Navigation item: \" + name, undefined, true);\r\n }); \r\n }\r\n};\r\n\r\nvar gpConnectTracking = {\r\n\r\n init: function () {\r\n\r\n //$('a[href=\"https://www.spirehealthcare.com/gpconnect/\"]').on('click', function() {\r\n // gaHelper.trackEvent(\"GP Connect Button\", \"Click\", \"Current URL: \" + window.location.href, undefined, true);\r\n //});\t\t\r\n }\r\n};\r\n\r\nvar ctaTracking = {\r\n\r\n init: function () {\r\n\r\n $('.button, button').on('click', function() {\r\n var name = $(this).text(),\r\n href = $(this).attr('href');\r\n //gaHelper.trackEvent(\"Button\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name + \", Link: \" + href, null, true);\r\n });\t\r\n\r\n //Enquiry form CTA buttons\r\n $('.call-to-action--desktop, .call-to-action--mobile-nav').on('click', '.call-to-action__link', function () {\r\n var name = $(this).text();\r\n if ($(this).hasClass('call-to-action__link--enquiry')) {\r\n gaHelper.trackEvent(\"Enquiry CTA\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name, undefined, true);\r\n }\r\n if ($(this).hasClass('call-to-action__link--callback')) {\r\n gaHelper.trackEvent(\"Call back CTA\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name, undefined, true);\r\n }\r\n });\t\r\n\r\n //Mobile enquiry form CTA phone numbers\r\n //$('.call-to-action--mobile-nav').on('click', '.call-to-action__tel', function () {\r\n // var name = $(this).text(),\r\n // href = $(this).attr('href');\r\n // gaHelper.trackEvent(\"Telephone number CTA\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name + \", Link: \" + href, undefined, false);\r\n //});\t\r\n\r\n $('.js-banner-bar__yes').on('click', function() {\r\n var name = $(this).text(),\r\n href = $(this).attr('href');\r\n gaHelper.trackEvent(\"Banner Yes CTA\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name + \", Link: \" + href, undefined, true);\r\n });\r\n\r\n $('.js-banner-bar__no').on('click', function() {\r\n var name = $(this).text(),\r\n href = $(this).attr('href');\r\n gaHelper.trackEvent(\"Banner No CTA\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name + \", Link: \" + href, undefined, true);\r\n });\r\n }\r\n};\r\n\r\nvar consultantImgCrop = {\r\n init: function () {\r\n $('.consultant-listing__item__image--cropped').imgLiquid({\r\n horizontalAlign: '74%'\r\n });\r\n }\r\n\r\n};\r\n\r\n// var siteHeaderSearch = {\r\n// \tinit: function () {\r\n \r\n// \t\tvar that = this;\r\n\r\n// \t\t$(\".js-search-toggle\").on(\"click\", function (e) {\r\n// \t\t\te.preventDefault();\r\n// \t\t\tif(!$(\".js-search-form\").hasClass(\"is-on\")){\r\n// \t\t\t\t$('.site-content').css('padding', '0');\r\n// \t\t\t\t$(\".js-site-nav\").addClass(\"is-hidden\");\r\n// \t\t\t\t$(\".js-search-form, .js-search-close\").addClass(\"is-on\");\r\n// \t\t\t\t$(\".js-search-form__input\").trigger('focus');\t\t\t\t\t\r\n// \t\t\t} else {\r\n// \t\t\t\t$(\".js-search-form\").submit();\r\n// \t\t\t}\r\n// \t\t});\r\n\r\n// \t\t$(\".js-search-close\").on(\"click\", function (e) {\r\n// \t\t\te.preventDefault();\r\n// \t\t\tthat.close();\r\n// \t\t});\r\n// \t},\r\n// \tclose: function () {\r\n// \t\t$(\".js-site-nav\").removeClass(\"is-hidden\");\r\n// \t\t$(\".js-search-form, .js-search-close\").removeClass(\"is-on\");\r\n// \t}\r\n// };\r\n\r\n\r\nvar siteNav = {\r\n \r\n init: function () { \r\n\r\n var that = this;\r\n \r\n var mouseTimeout;\r\n\r\n this.megaMenuContainer = $(\".site-header__nav\");\r\n\r\n\r\n $(\".nav-link\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n\r\n if ($(this).hasClass('is-on')) {\r\n that.hideSubNav();\r\n }\r\n else {\r\n that.showSubNav(this);\r\n }\r\n });\r\n\r\n $(\".mega-menu__container\").on(\"mouseleave\", function (e) {\r\n that.hideSubNav();\r\n });\r\n\r\n $(document).on(\"keydown\", function (e) {\r\n if (e.key == \"Escape\") {\r\n that.hideSubNav();\r\n }\r\n });\r\n\r\n $(\".site-nav__l2, .site-nav__l3\").siblings(\"a\").on(\"mouseenter\", function () {\r\n\r\n that.showSubNav(this);\r\n\r\n clearTimeout(mouseTimeout);\r\n\r\n }).on(\"mouseleave\", function () {\r\n\r\n mouseTimeout = setTimeout(function () {\r\n that.hideSubNav();\r\n }, 500);\r\n });\r\n\r\n $(\".site-nav__l2, .site-nav__l3\").on(\"mouseenter\", function () {\r\n\r\n clearTimeout(mouseTimeout);\r\n\r\n }).on(\"mouseleave\", function () {\r\n mouseTimeout = setTimeout(function () {\r\n that.hideSubNav();\r\n }, 500);\r\n });\r\n\r\n that.selectedStates();\r\n\r\n if ($('#js-hospital-area').length > 0) {\r\n $('.is-on--child-selected .site-nav__list > li:first-child').after('
  • > ' + $('h1.heading-l').text().trim() + '
  • ');\r\n } \r\n\r\n this.megaMenuContainer.addClass(\"js\");\r\n\r\n },\r\n selectedStates: function () {\r\n\r\n var currentPath = window.location.href,\r\n selectedItem = $(\".js-site-nav\").find(\"a[href='\" + currentPath + \"']\").parent(\".site-nav__list__item, .site-nav__column__item\");\r\n\r\n selectedItem.addClass(\"is-selected\");\r\n\r\n selectedItem.parents(\".site-nav__l2\").addClass(\"is-on--child-selected\")\r\n .parent(\".site-nav__list__item\").addClass(\"is-selected\").children(\"a\").addClass(\"is-selected\");\r\n\r\n },\r\n hideSubNav: function () {\r\n $(\".primary-navigation\").removeAttr(\"aria-expanded\");\r\n $(\".primary-navigation\").removeClass('is-on').siblings(\".site-nav__l2, .site-nav__l3\").removeClass('is-on');\r\n $(\".mega-menu\").removeClass('is-on').siblings(\".site-nav__l2, .site-nav__l3\").removeClass('is-on');\r\n $(\".mega-menu\").removeAttr('aria-expanded');\r\n $(\".mega-menu\").addClass(\"aria-hidden\", \"true\");\r\n },\r\n showSubNav: function (link) {\r\n var _target = $(link).attr(\"aria-controls\");\r\n var _megaMenu = $(\"#\" + _target);\r\n\r\n $(\".primary-navigation\").removeClass('is-on');\r\n $(\".mega-menu\").removeClass('is-on').siblings(\".site-nav__l2, .site-nav__l3\").removeClass('is-on');\r\n $(link).addClass('is-on').siblings(\".site-nav__l2, .site-nav__l3\").addClass('is-on');\r\n $(link).attr(\"aria-expanded\", \"true\");\r\n\r\n _megaMenu.find(\"a\").first().trigger('focus');\r\n _megaMenu.attr(\"aria-expanded\", \"true\");\r\n _megaMenu.removeAttr(\"aria-hidden\");\r\n }\r\n\r\n \r\n\r\n};\r\n\r\nvar matchHeight = {\r\n\r\n init: function () {\r\n\r\n var featGridItem = $('.feature-grid__item__text'),\r\n recruitmentGridItem = $('.feature-grid--recruitment__item__text'),\r\n pricedItem = $('.feature-grid__item--priced'),\r\n imageItem = $('.feature-grid__item--image__text'),\r\n newsFeedItem = $('.news-feed__item'),\r\n infoLinks = $('.info-links__item__text'),\r\n practisingAt = $('.consultant-content__section__practising-at .panel'),\r\n stepByStepAt = $('.stepbystep-content__section .panel'),\r\n megaMenuColumn = $('.mega-menu__column'),\r\n callToActionPanelWrapper = $('.call-to-action-panel__wrapper');\r\n \r\n if (featGridItem) featGridItem.matchHeight();\r\n if (pricedItem) pricedItem.matchHeight();\r\n if (imageItem) imageItem.matchHeight(); \r\n if (newsFeedItem) newsFeedItem.matchHeight();\r\n if (infoLinks) infoLinks.matchHeight();\r\n if (recruitmentGridItem) recruitmentGridItem.matchHeight();\r\n if (practisingAt) practisingAt.matchHeight();\r\n if (stepByStepAt) stepByStepAt.matchHeight();\r\n if (megaMenuColumn) megaMenuColumn.matchHeight();\r\n if (callToActionPanelWrapper) callToActionPanelWrapper.matchHeight();\r\n\r\n $.fn.matchHeight._afterUpdate = function(event, groups) {\r\n\r\n var pIh = pricedItem.height();\r\n var pHeightCorrection = (pIh + 50 + \"px\");\r\n pricedItem.height(pHeightCorrection);\r\n \r\n // \t\t\tvar iIh = imageItem.height();\r\n // \t\t\tvar iHeightCorrection = (iIh + 80 + \"px\");\r\n // imageItem.height(iHeightCorrection);\r\n\r\n var nIh = newsFeedItem.height();\r\n var nHeightCorrection = (nIh + 50 + \"px\");\r\n newsFeedItem.height(nHeightCorrection);\r\n\r\n var rIh = recruitmentGridItem.height();\r\n var rHeightCorrection = (rIh + 30 + \"px\");\r\n recruitmentGridItem.height(rHeightCorrection);\r\n\r\n };\r\n\r\n\r\n }\r\n\r\n};\r\n\r\nvar tabs = {\r\n init: function () {\r\n\r\n if ($(\".js-tabs-disable-first\").length == 0) {\r\n $(\".js-tabs .tabs__content\").first().addClass(\"is-on\");\r\n }\r\n\r\n var featGridItem = $('.feature-grid__item__text'),\r\n pricedItem = $('.feature-grid__item--priced'),\r\n imageItem = $('.feature-grid__item--image__text');\r\n\r\n $(\".js-tabs__nav\").on(\"click\", \"a\", function (e) {\r\n \r\n e.preventDefault();\r\n\r\n // update matchHeight grid items on tab's click\r\n $.fn.matchHeight._update(featGridItem);\r\n $.fn.matchHeight._update(pricedItem);\r\n $.fn.matchHeight._update(imageItem);\r\n\r\n var $navItems = $(this).parents(\".js-tabs\").find(\".js-tabs__nav a\"),\r\n $contentItems = $(this).parents(\".js-tabs\").find(\".js-tabs__content\"),\r\n index = $navItems.index(this);\r\n\r\n $navItems.removeClass(\"is-on\").eq(index).addClass(\"is-on\");\r\n $contentItems.removeClass(\"is-on\").eq(index).addClass(\"is-on\");\r\n\r\n });\r\n }\r\n};\r\n\r\nfunction alertMe(e) {\r\n e.preventDefault();\r\n alert(\"hello world\");\r\n}\r\n\r\nvar accordion = {\r\n\r\n init: function () {\r\n $(\"body\").on(\"click\", \".js-accordion__toggle\", function (e) {\r\n e.preventDefault();\r\n\r\n var $content = $(this).parents(\".js-accordion\").find(\".js-accordion__content\");\r\n\r\n if ($(this).hasClass(\"is-on\")) {\r\n $(this).removeClass(\"is-on\");\r\n $content.removeClass(\"is-on\");\r\n } else {\r\n $(this).addClass(\"is-on\");\r\n $content.addClass(\"is-on\");\r\n }\r\n\r\n });\r\n\r\n $(\"body\").on(\"click\", \".js-accordion--reverse__toggle\", function (e) {\r\n e.preventDefault();\r\n\r\n var $content = $(this).parents(\".js-accordion--reverse\").find(\".js-accordion--reverse__content\");\r\n var $contentMini = $(this).parents(\".js-accordion--reverse\").find(\".js-accordion--reverse__content--minimised\");\r\n\r\n if( $(this).hasClass(\"is-on\") ) {\r\n $(this).removeClass(\"is-on\");\t\t\t\t\r\n $contentMini.removeClass(\"is-on\");\t\t\t\t\r\n $content.removeClass(\"is-on\");\r\n } else {\r\n $(this).addClass(\"is-on\");\r\n $contentMini.addClass(\"is-on\");\r\n $content.addClass(\"is-on\");\r\n }\r\n });\r\n\r\n }\r\n\r\n};\r\n\r\nvar toggleFix = {\r\n init: function () {\r\n\r\n var\t$accordionX = $(\".accordion__header__extra\"),\r\n $accToggle = $('.js-accordion__toggle');\r\n\r\n var toggleFix = {\r\n init: function () {\r\n\r\n var $windowWidth = getWindowWidth().width;\r\n\r\n if ($windowWidth < 599) {\r\n\r\n if ($accordionX.length > 0) { \r\n $accordionX.next($accToggle).css('top', '15px');\r\n }\r\n\r\n } else if ($windowWidth > 599) {\r\n\r\n if ($accordionX.length > 0) { \r\n $accordionX.next($accToggle).css('top', '20px');\r\n }\r\n\r\n }\r\n\r\n }\r\n };\t\r\n\r\n toggleFix.init();\r\n\r\n $(window).resize(function(){\r\n toggleFix.init();\r\n });\r\n\r\n }\r\n\r\n};\r\n\r\n\r\n\r\nvar notice = {\r\n init: function () {\r\n //cookie handling needs to go here\r\n $(\".js-notice\").addClass(\"is-on\");\r\n\r\n $(\".js-notice__close\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n $(this).parents(\".js-notice\").removeClass(\"is-on\");\r\n });\r\n }\r\n};\r\n\r\nvar dateValidation = {\r\n init: function () {\r\n\r\n $('.dob-date').combodate({\r\n minYear: 1915,\r\n maxYear: 2015,\r\n value: '20-10-2015',\r\n smartDays: true\r\n });\r\n $('.day, .month, .year').wrap('
    ');\r\n\r\n } \r\n \r\n};\r\n\r\nvar locationMap = {\r\n config: {\r\n canvas: \".js-location-map__canvas\",\r\n locations: [],\r\n map: null\r\n },\r\n init: function () {\r\n\r\n var that = this;\t\t\r\n\r\n function loadMaps() {\r\n google.load(\"maps\", \"3\", {\r\n callback: function () {\r\n if (document.getElementById(\"js-map-hospital\") !== null) {\r\n that.initHospitalMap();\r\n }\r\n else {\r\n that.initMap();\r\n that.initLocationFinder();\r\n that.initSpecialityLocationFinder();\r\n }\r\n },\r\n other_params: 'key=AIzaSyALpZboQbieD8FePSqE0JK2LdTvHlnAZy4&sensor=true&libraries=places'\r\n });\r\n }\r\n\r\n if($(this.config.canvas).length > 0) {\r\n\r\n if( typeof google == 'undefined' || !google.load ) {\r\n $.getScript( '//www.google.com/jsapi', function() {\r\n loadMaps();\r\n });\r\n } else {\r\n loadMaps();\r\n }\r\n }\t\t\r\n },\r\n\r\n initSpecialityLocationFinder: function () {\r\n var locationOptions = {\r\n types: ['geocode'],\r\n componentRestrictions: { country: \"gb\" }\r\n };\r\n\r\n var specialityId = 0;\r\n var specialityIdNode = document.getElementById('SpireSpecialityId');\r\n if (specialityIdNode != undefined) {\r\n specialityId = specialityIdNode.value;\r\n }\r\n\r\n var specialityName = \"\";\r\n var specialityNameNode = document.getElementById('SpireSpecialityName');\r\n if (specialityNameNode != undefined) {\r\n specialityName = specialityNameNode.value;\r\n }\r\n\r\n var that = this,\r\n locationInput = document.getElementById('location-input-speciality'),\r\n specialityLocationInput = document.getElementById('location-input-speciality'),\r\n specialityId = specialityId,\r\n specialityName = specialityName,\r\n autoComplete = new google.maps.places.Autocomplete(locationInput, locationOptions),\r\n specialityAutoComplete = new google.maps.places.Autocomplete(specialityLocationInput, locationOptions),\r\n lat = helper.getQueryStringByName(\"lat\") || \"\",\r\n lon = helper.getQueryStringByName(\"lon\") || \"\";\r\n\r\n var hospitalSelector = $(\"#select-hospital-speciality\");\r\n hospitalSelector.on('change',function () {\r\n var hospitalId = $(\"#select-hospital-speciality\").val();\r\n var specialityId = $(\"#SpireSpecialityId\").val();\r\n //$(\"#SpecialityLocationSearch\").find(\".js-speciality-location-accordions\").find(\".inner-area\").remove();\r\n $(\".js-location-accordions-container\").find(\".js-speciality-location-accordions\").remove();\r\n that.getAccordionDataBySpeciality(specialityId, null, null, hospitalId);\r\n });\r\n\r\n //var latlng = null;\r\n google.maps.event.addListener(specialityAutoComplete, 'place_changed', function () {\r\n\r\n //latlng = specialityAutoComplete.getPlace();\r\n\r\n });\r\n\r\n $(\"#button-GroupSpecialityLocationsFinder\").on('click',function (e) {\r\n var that = this;\r\n e.preventDefault();\r\n\r\n $(\".js-location-accordions-container\").find(\".js-speciality-location-accordions\").remove();\r\n\r\n var speciality = null;\r\n if (specialityId != null) {\r\n speciality = specialityId;\r\n }\r\n\r\n var speciality = speciality,\r\n locationEntered = specialityLocationInput.value,\r\n locationSuggested = specialityAutoComplete.getPlace(),\r\n latlng;\r\n\r\n if (locationEntered && locationSuggested !== undefined) {\r\n\r\n var url = $(this).parents(\".js-finder\").data(\"locations\") + \"?\";\r\n // check for the hidden variable on the module to say it is a module, if so do not use the module url.\r\n var isModuleUrl = $(\"#location-search-module\").val();\r\n if (isModuleUrl != undefined) {\r\n if (isModuleUrl != '') {\r\n url = isModuleUrl + \"?\";\r\n }\r\n }\r\n\r\n latlng = locationSuggested.geometry.location;\r\n lat = latlng.lat();\r\n lon = latlng.lng();\r\n\r\n var qs = \"\";\r\n if (speciality > 0) { qs += \"speciality=\" + speciality + \"&\"; }\r\n if (lat !== \"\" && lon !== \"\") { qs += \"lat=\" + lat + \"&lon=\" + lon + \"&\"; }\r\n\r\n qs += locationEntered ? \"location=\" + locationEntered : \"\";\r\n //var treatmentId = $(\"#input-treatment\").val();\r\n if (qs) {\r\n\r\n var useDirect = $(\"#location-speciality-accordions-template\").length === 0;\r\n\r\n if (useDirect) {\r\n window.location = url + qs;\r\n } else {\r\n\r\n\r\n $(\".location-accordions\").find(\".inner-area\").remove();\r\n locationMap.getAccordionDataBySpeciality(speciality, lat, lon, \"\");\r\n }\r\n\r\n }\r\n\r\n } else {\r\n\r\n var selectedHospital = $(\"#select-hospital-speciality\");\r\n if (selectedHospital.val() > 0) {\r\n locationMap.getAccordionDataBySpeciality(null, null, null, selectedHospital.val() );\r\n }\r\n else {\r\n $(this).parents(\".js-finder\").find(\"#Error\").remove();\r\n $(this).parents(\".js-finder\").find(\".inner-area\").append(\"
    Please select an option from the locations dropdown.
    \");\r\n $(\"#location-input\").trigger('focus');\r\n return;\r\n }\r\n } \r\n\r\n\r\n\r\n });\r\n\r\n },\r\n\r\n initLocationFinder: function () {\r\n\r\n var locationOptions = {\r\n types: ['geocode'],\r\n componentRestrictions: {country: \"gb\"}\r\n };\r\n\r\n var that = this,\r\n locationInput = document.getElementById('location-input'),\r\n treatmentInput = document.getElementById('input-treatment'),\r\n specialityId = document.getElementById('SpireSpecialityId'),\r\n autoComplete = new google.maps.places.Autocomplete(locationInput, locationOptions),\r\n lat = helper.getQueryStringByName(\"lat\") || \"\",\r\n lon = helper.getQueryStringByName(\"lon\") || \"\";\r\n\r\n if(helper.getQueryStringByName(\"location\")){\r\n locationInput.value = helper.getQueryStringByName(\"location\");\r\n }\r\n\r\n if(helper.getQueryStringByName(\"treatment\")){\r\n treatmentInput.value = helper.getQueryStringByName(\"treatment\");\r\n }\r\n\r\n $(\"#button-GroupLocationsFinder\").on('click',function (e) {\r\n e.preventDefault();\r\n\r\n var treatment = null;\r\n if (treatmentInput != null)\r\n {\r\n treatment = treatmentInput.value;\r\n }\r\n\r\n var treatment = treatment,\r\n locationEntered = locationInput.value,\r\n locationSuggested = autoComplete.getPlace(),\r\n latlng;\r\n\r\n if (locationEntered && locationSuggested !== undefined) {\r\n\r\n var url = $(this).parents(\".js-finder\").data(\"locations\") + \"?\";\r\n // check for the hidden variable on the module to say it is a module, if so do not use the module url.\r\n var isModuleUrl = $(\"#location-search-module\").val();\r\n if (isModuleUrl != undefined) {\r\n if (isModuleUrl != '') {\r\n url = isModuleUrl + \"?\";\r\n }\r\n }\r\n\r\n latlng = locationSuggested.geometry.location;\t\t\t\t\t\r\n lat = latlng.lat();\r\n lon = latlng.lng();\r\n\r\n var qs = \"\";\r\n if (treatment > 0) { qs += \"treatment=\" + treatment + \"&\"; }\r\n if (lat !== \"\" && lon !== \"\") { qs += \"lat=\" + lat + \"&lon=\" + lon + \"&\"; }\r\n\r\n qs += locationEntered ? \"location=\" + locationEntered : \"\";\r\n var treatmentId = $(\"#input-treatment\").val();\r\n if (qs) {\r\n \r\n var useDirect = $(\"#location-accordions-template\").length === 0;\r\n \r\n if (useDirect) {\r\n window.location = url + qs; \r\n } else {\r\n\r\n\r\n $('#site-container .js-location-accordions').remove();\r\n $('.accordion.js-accordion').remove();\r\n locationMap.getAccordionData(treatmentId, lat, lon, \"\");\r\n }\r\n \r\n }\r\n\r\n } else {\r\n $(this).parents(\".js-finder\").find(\"#Error\").remove();\r\n $(this).parents(\".js-finder\").find(\".inner-area\").append(\"
    Please select an option from the locations dropdown.
    \");\r\n $(\"#location-input\").trigger('focus');\r\n return;\r\n } \r\n });\r\n\r\n var hospitalSelector = $(\"#select-hospital\");\r\n hospitalSelector.on('change',function () {\r\n var hospitalId = $(\"#select-hospital\").val();\r\n $(\"#site-container .js-location-accordions\").find(\".inner-area\").remove();\r\n $(\"#site-container .js-location-accordions\").remove();\r\n $('.accordion.js-accordion').remove();\r\n that.getAccordionData(null, null, null, hospitalId);\r\n });\r\n\r\n },\r\n\r\n initMap: function () {\r\n\r\n var isDraggable = $(document).width() > 480 ? true : false; // If document (your website) is wider than 480px, isDraggable = true, else isDraggable = false\r\n\r\n var that = this,\r\n locations,\r\n treatment = (helper.getQueryStringByName(\"treatment\") != false ? \"treatment=\" + helper.getQueryStringByName(\"treatment\") : \"\"),\r\n lat = helper.getQueryStringByName(\"lat\"),\r\n lng = helper.getQueryStringByName(\"lon\"),\r\n hos = helper.getQueryStringByName(\"hos\");\r\n\r\n this.config.map = new google.maps.Map($(that.config.canvas)[0], {\r\n center: {lat: -7.858047, lng: 85.364512},\r\n zoom: 8,\r\n scrollwheel: false,\r\n draggable: isDraggable,\r\n zoomControl: true,\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition.LEFT_BOTTOM\r\n },\r\n scaleControl: true,\r\n streetViewControl: true,\r\n streetViewControlOptions: {\r\n position: google.maps.ControlPosition.LEFT_BOTTOM\r\n },\r\n fullscreenControl: true\r\n });\r\n\r\n // locationMap.getAccordionData(treatment, lat, lng, hos);\r\n },\r\n\r\n initHospitalMap: function () {\r\n\r\n var isDraggable = $(document).width() > 480 ? true : false; // If document (your website) is wider than 480px, isDraggable = true, else isDraggable = false\r\n\r\n var that = this,\r\n locations,\r\n geocoder = new google.maps.Geocoder();\r\n \r\n this.config.map = new google.maps.Map($(that.config.canvas)[0], {\r\n center: { lat: -7.858047, lng: 85.364512 },\r\n zoom: 8,\r\n scrollwheel: false,\r\n draggable: isDraggable,\r\n zoomControl: true,\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition.LEFT_BOTTOM\r\n },\r\n scaleControl: true,\r\n streetViewControl: true,\r\n streetViewControlOptions: {\r\n position: google.maps.ControlPosition.LEFT_BOTTOM\r\n },\r\n fullscreenControl: true\r\n });\r\n\r\n $.getScript(\"/dist/js/libs/infobox_packed.js\", function () {\r\n locations = $.parseJSON(locationMapPoints);\r\n that.setPoints(locations);\r\n });\r\n }, \r\n\r\n getAccordionDataBySpeciality: function (speciality, lat, lng, hospitalId) {\r\n\r\n var that = this;\r\n $.getScript(\"/dist/js/libs/infobox_packed.js\", function () {\r\n\r\n var addressurl = \"\";\r\n\r\n if (lat !== \"\" && lng !== \"\") {\r\n var laturl = \"&lat=\",\r\n lonurl = \"&lon=\";\r\n addressurl = laturl + lat + lonurl + lng;\r\n }\r\n\r\n var treatment = \"treatment=\";\r\n if (hospitalId !== \"\") {\r\n var hosUrl = \"&hospitalId=\" + hospitalId;\r\n addressurl = hosUrl;\r\n }\r\n if (speciality > 0) {\r\n speciality = \"&speciality=\" + speciality;\r\n }\r\n var method = 'CustomApi/GetGroupMapHospitals/?' + treatment + addressurl + speciality;\r\n if (hospitalId !== \"\") {\r\n method = 'CustomApi/GetGroupMapHospitalById/?' + addressurl + speciality;\r\n }\r\n\r\n $.ajax({\r\n url: apilocation + method,\r\n async: true,\r\n dataType: 'json',\r\n success: function (json) {\r\n\r\n var locations = $.parseJSON(json);\r\n if (hospitalId == null || hospitalId == \"\") {\r\n that.setPoints(locations);\r\n }\r\n\r\n if (addressurl.length > 0) {\r\n $(\"#js-accordion-key\").hide();\r\n if (locations != undefined) {\r\n if (locations.length > 0) {\r\n $(\"#js-accordion-key\").show();\r\n }\r\n }\r\n\r\n that.renderSpecialityAccordions(locations);\r\n\r\n }\r\n\r\n if (locations.length === 0) {\r\n $(\".js-location-error\").show();\r\n $(\"#js-accordion-key\").hide();\r\n }\r\n\r\n if (hospitalId == null || hospitalId == \"\") {\r\n if (lat !== \"\" && lng !== \"\") {\r\n that.setAccordionDistances(locations, lat, lng);\r\n }\r\n }\r\n\r\n //force infinity numbers to refresh after async load\r\n __NAS._pplr();\r\n\r\n }\r\n });\r\n });\r\n\r\n },\r\n\r\n getAccordionData: function (treatment, lat, lng, hospitalId) {\r\n function filterLocationsForSpireGP(locations) {\r\n var spireGPModule = document.getElementById(\"SpireGPModule\");\r\n if (spireGPModule) {\r\n locations = $.grep(locations, function (el, idx) { return el.SpireGPEnabled }, false);\r\n }\r\n return locations;\r\n }\r\n\r\n function filterLocationForPaediatrics(locations) {\r\n var spirePaediatricsModule = document.getElementById(\"SpirePaediatricsModule\");\r\n if (spirePaediatricsModule) {\r\n locations = $.grep(locations, function (el, idx) { return el.PaediatricsEnabled }, false);\r\n }\r\n return locations; \r\n }\r\n\r\n var that = this, geocoder = new google.maps.Geocoder();\r\n //debugger;\r\n\r\n $.getScript(\"/dist/js/libs/infobox_packed.js\", function () {\t\r\n\r\n var addressurl = \"\";\r\n\r\n if (lat !== null && lng !== null) {\r\n var laturl = \"&lat=\",\r\n lonurl = \"&lon=\";\r\n addressurl = laturl + lat + lonurl + lng;\r\n } \r\n\r\n if (hospitalId !== \"\"){\r\n var hosUrl = \"&hospitalId=\" + hospitalId;\r\n addressurl += hosUrl;\r\n }\r\n if (treatment > 0) {\r\n treatment = \"treatment=\" + treatment;\r\n }\r\n var method = 'CustomApi/GetGroupMapHospitals/?' + treatment + addressurl;\r\n if (hospitalId !== \"\") {\r\n method = 'CustomApi/GetGroupMapHospitalById/?' + (addressurl.indexOf(\"&\") == 0 ? addressurl.substring(1) : addressurl);\r\n }\r\n \r\n\r\n $.ajax({\r\n url: apilocation + method,\r\n async: true,\r\n dataType: 'json',\r\n success: function (json) {\r\n\r\n var locations = $.parseJSON(json); \r\n if (hospitalId == null || hospitalId == \"\") {\r\n that.setPoints(locations);\r\n }\r\n locations = filterLocationsForSpireGP(locations);\r\n locations = filterLocationForPaediatrics(locations);\r\n\r\n if (addressurl.length > 0)\r\n {\r\n $(\"#js-accordion-key\").hide();\r\n if (locations != undefined) {\r\n if (locations.length > 0) {\r\n $(\"#js-accordion-key\").show();\r\n }\r\n }\r\n\r\n that.renderAccordions(locations);\r\n } \r\n\r\n if (locations.length === 0) {\r\n $(\".js-location-error\").show();\r\n $(\"#js-accordion-key\").hide();\r\n }\r\n\r\n if (hospitalId == null || hospitalId == \"\") {\r\n if (lat !== \"\" && lng !== \"\") {\r\n that.setAccordionDistances(locations, lat, lng);\r\n }\r\n }\r\n\r\n //force infinity numbers to refresh after async load\r\n __NAS._pplr();\r\n\r\n }\r\n });\r\n });\r\n\r\n },\r\n\r\n sortLocationsByDistance: function (locations, userLatLong){\r\n\r\n function sorter(a,b){\r\n return a.distance - b.distance;\r\n }\r\n\r\n var latlong = userLatLong.split(\";\");\t\t\r\n\r\n for (var i = 0; i < locations.length; i++) {\r\n locations[i].distance = helper.calculateDistance(latlong[0], latlong[1], locations[i].lat, locations[i].lon);\r\n locations[i].distanceFriendly = locations[i].distance.toFixed(2) + \" miles\";\r\n }\r\n\r\n locations.sort(sorter);\r\n\r\n return locations;\r\n\r\n },\r\n\r\n setPoints: function (locations) {\r\n\r\n var markers = [],\r\n bounds = new google.maps.LatLngBounds(),\r\n // iconDefault = {\r\n // // path: 'M31.618 36.277c-8.99 6.417-21.479 4.331-27.896-4.659s-4.331-21.479 4.659-27.896 21.479-4.331 27.896 4.659 4.331 21.479-4.659 27.896zM16.635 19.328l-2.635-1.547c-2.353-1.405-3.337-2.565-3.337-4.005 0-1.616 1.579-2.776 3.829-2.776 2.906 0 5.511 2.415 5.511 2.415s2.523-2.415 5.504-2.415c2.249 0 3.831 1.16 3.831 2.776 0 1.44-0.984 2.6-3.338 4.005l-2.635 1.547c-1.512 0.873-2.633 1.9-3.365 3.063-0.733-1.163-1.853-2.19-3.366-3.063zM7.605 30.287c1.969 1.475 4.146 2.213 6.465 2.213 2.637 0 4.751-1.101 5.93-2.909 1.177 1.809 3.292 2.909 5.931 2.909 2.318 0 4.496-0.739 6.463-2.213l-1.469-2.771c0 0-0.311 0.247-0.498 0.384-1.334 0.982-2.986 1.545-4.463 1.545-2.141 0-3.757-1.335-3.757-3.162 0-1.475 1.124-2.951 3.162-4.144l2.598-1.581c3.233-1.932 4.533-3.724 4.533-6.288 0-3.759-2.882-6.358-7.061-6.358-1.939 0-3.74 0.512-5.439 1.636-1.7-1.124-3.501-1.636-5.439-1.636-4.181 0-7.061 2.599-7.061 6.358 0 2.564 1.3 4.356 4.533 6.288l2.599 1.581c2.037 1.193 3.161 2.669 3.161 4.144 0 1.827-1.616 3.162-3.758 3.162-1.476 0-3.126-0.562-4.461-1.545-0.186-0.136-0.498-0.384-0.498-0.384l-1.47 2.771z',\r\n // // fillColor: '#d73282',\r\n // // fillOpacity: 1, \r\n // // scale: 1,\t\t\t \r\n // // strokeWeight: 0\r\n // icon = \"/img/map/icons/default.png\";\r\n // },\r\n that = this,\r\n icon = '',\r\n centerCache;\r\n\r\n var userLatLong = $(\".js-special-locations\").data(\"userlocation\");\r\n\r\n if( typeof userLatLong !== \"undefined\" && userLatLong.length > 0) {\r\n locations = this.sortLocationsByDistance(locations,userLatLong);\r\n locations = locations.slice(0,5);\r\n\r\n $(\".js-special-locations\").children(\".accordion-group\").html(\"\");\r\n\r\n this.renderAccordions(locations);\r\n\r\n }\r\n\r\n\r\n for (var i = 0; i < locations.length; i++) {\r\n\r\n //Hack for St George's Park\r\n\r\n if (locations[i].lat === 52.809662 && locations[i].lon === -1.754637) {\r\n icon = \"/dist/images/map/icons/perform-sgp.png\";\r\n } else {\r\n //icon = iconDefault;\r\n icon = \"/dist/images/map/icons/default.png\";\r\n }\r\n\r\n //\r\n \r\n locations[i].marker = new google.maps.Marker({\r\n position: {\r\n lat: locations[i].lat,\r\n lng: locations[i].lon\r\n },\r\n icon: icon,\r\n map: that.config.map,\r\n });\r\n\r\n // jshint multistr:true\r\n\r\n locations[i].modal = new InfoBox({\r\n content: \"
    \\\r\n
    \"+ locations[i].name + \"
    \\\r\n
    \"+ locations[i].address + \"
    \\\r\n
    \"+ locations[i].phone + \"
    \\\r\n
    Visit Website
    \\\r\n
    \",\r\n alignBottom: true, \r\n infoBoxClearance: new google.maps.Size(50, 50),\r\n //closeBoxURL: \"\",\r\n pixelOffset: new google.maps.Size(50, 0)\r\n }); \r\n\r\n locations[i].label = new InfoBox({\r\n content: \"\",\r\n closeBoxURL: \"\",\r\n pixelOffset: new google.maps.Size(45, 10)\r\n });\r\n\r\n // Attach event listener on close infoBox modals\r\n google.maps.event.addListener(locations[i].modal, 'closeclick', function() { \r\n that.config.map.setCenter(centerCache);\r\n }); \r\n\r\n (function (i) {\r\n google.maps.event.addListener(locations[i].marker, 'click', function () {\r\n \r\n centerCache = that.config.map.getCenter();\r\n\r\n for (var j = 0; j < locations.length; j++) {\r\n locations[j].modal.close();\r\n }\r\n locations[i].modal.open(that.config.map, locations[i].marker)\r\n });\r\n })(i);\r\n\r\n bounds.extend(locations[i].marker.position);\r\n }\r\n\r\n if (locations.length == 1) {\r\n that.config.map.fitBounds(bounds);\r\n that.config.map.setZoom(14);\r\n }\r\n else {\r\n that.config.map.fitBounds(bounds);\r\n }\t\t\t\r\n \r\n for (var i = 0; i < locations.length; i++) {\r\n locations[i].label.open(that.config.map, locations[i].marker);\r\n }\r\n\r\n this.config.locations = locations;\r\n },\r\n\r\n renderSpecialityAccordions: function (locations) {\r\n var source = $(\"#location-speciality-accordions-template\").html(),\r\n template,\r\n context,\r\n html;\r\n\r\n if (source) {\r\n template = Handlebars.compile(source);\r\n context = { locations: locations };\r\n html = template(context);\r\n $(\"#location-speciality-accordions-template\").after(html);\r\n //accordion.init(); // todo: not sure about this call.\r\n }\r\n },\r\n\r\n renderAccordions: function (locations) {\r\n\r\n var source = $(\"#location-accordions-template\").html(),\r\n template,\r\n context,\r\n html;\r\n\r\n if(source) {\r\n template = Handlebars.compile(source);\r\n context = {locations: locations};\r\n html = template(context);\t\t\t\t\r\n $(\"#location-accordions-template\").after(html);\r\n //accordion.init();\r\n }\r\n },\r\n\r\n setAccordionDistances: function (locations, lat, lng) {\r\n\r\n var distances = [];\r\n that = this;\r\n\r\n if (locations.length === 0)\r\n {\r\n $(\".js-location-error\").show();\r\n }\r\n\r\n for (var i = 0; i < locations.length; i++) {\t\t \r\n distances[i] = helper.calculateDistance(locations[i].lat, locations[i].lon, lat, lng );\r\n }\r\n\r\n $(\".js-location-accordions .js-location-accordions__distance\").each(function(i) {\r\n $(this).html(distances[i].toFixed(1) + \" miles\");\r\n $(this).parents(\".js-accordion\").attr(\"data-miles\", distances[i].toFixed(1));\r\n });\r\n\r\n var defaultRows = 5;\r\n var isModuleUrl = $(\"#location-search-module\").val();\r\n if (isModuleUrl != undefined) {\r\n if (isModuleUrl != '') {\r\n var number = $(\"#numberOfLocationsToShow\").val();\r\n if (number > 0)\r\n {\r\n defaultRows = number;\r\n }\r\n }\r\n }\r\n\r\n var sortedDivs = $(\".js-location-accordions\").find(\".js-accordion\").toArray().sort(that.sorter).slice(0, defaultRows);\r\n \r\n $(\".js-location-accordions .inner-area\").empty();\r\n\r\n $.each(sortedDivs, function (index, value) {\r\n $(\".js-location-accordions .inner-area\").append(value);\r\n });\r\n\r\n //accordion.init();\r\n\r\n },\r\n\r\n sorter: function (a, b) {\r\n return a.getAttribute('data-miles') - b.getAttribute('data-miles');\r\n }\r\n};\r\n\r\nvar finder = {\r\n init: function () { \r\n \r\n var currentLocation = location.href.split(\"?\")[0];\r\n\r\n $(\"#js-consultant-finder-adv-btn\").on('click', function (e) {\r\n e.preventDefault();\r\n var advSection = $(\"#js-consultant-finder-adv-section\");\r\n if (advSection != undefined) {\r\n advSection.slideToggle();\r\n }\r\n });\r\n\r\n $(\".button-consultant-picker-js\").on('click', function (e) {\r\n e.preventDefault();\r\n \r\n var $consultantFinder = $(this).parents(\".input-consultant-picker-js\"),\r\n consultantUrl = $consultantFinder.find(\".value-input-consultant-picker-js\").val();\r\n\r\n if (consultantUrl !== null && consultantUrl !== 0) {\r\n window.location = consultantUrl;\r\n }\r\n else {\r\n $consultantFinder.find(\".error-input-consultant-picker-js\").text(\"Please select a consultant.\");\r\n } \r\n });\r\n\r\n $(\"#button-profile\").on('click', function (e) {\r\n e.preventDefault();\r\n var hos = $(\"#input-hos\").val();\r\n var ty = $(\"#input-type\").val();\r\n var qs = \"\";\r\n if (hos > 0) { qs += \"filterbyhospital=\" + hos + \"&\"; }\r\n if (ty != \"\") { qs += \"filterbytype=\" + ty; }\r\n window.location = \"?\" + qs;\r\n });\r\n\r\n\r\n $(\".js-finder\").each(function () {\r\n\r\n //set the finder up\r\n\r\n var type = $(this).attr(\"data-type\");\r\n\r\n var finder = $(this);\r\n\r\n if (type == \"consultants\") {\r\n //hospital level\r\n finder.find(\"input[name='treatments']\").on('change',function () {\r\n finder.find(\"input[name='consultantId']\").val(\"\");\r\n finder.find(\"input[name='consultantId']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a consultant\");\r\n //CONSULTANT BY SPECIALTY\r\n finder.find(\"input[name='specialty']\").val(\"\");\r\n finder.find(\"input[name='specialty']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a specialty\");\r\n });\r\n\r\n //CONSULTANT BY SPECIALTY\r\n finder.find(\"input[name='specialty']\").on('change',function () {\r\n finder.find(\"input[name='consultantId']\").val(\"\");\r\n finder.find(\"input[name='consultantId']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a consultant\");\r\n finder.find(\"input[name='treatments']\").val(\"\");\r\n finder.find(\"input[name='treatments']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n });\r\n\r\n finder.find(\"input[name='consultantId']\").on('change',function () {\r\n finder.find(\"input[name='treatments']\").val(\"\");\r\n finder.find(\"input[name='treatments']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n finder.find(\"input[name='specialty']\").val(\"\");\r\n finder.find(\"input[name='specialty']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a speciality\");\r\n });\r\n\r\n //group level\r\n finder.find(\"input[name='postCode']\").keydown(function () {\r\n finder.find(\"input[name='hospitals']\").val(\"\");\r\n finder.find(\"input[name='hospitals']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a hospital\");\r\n\r\n $treatments = finder.find(\"input[name='treatments']\");\r\n $treatments.val(\"\");\r\n $treatments.parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n\r\n $treatments.parents(\".js-filter-dropdown\").attr(\"data-url\", apilocation + \"Finders/SuggestTreatments/?filterByHospital=&filterByTreatmentName=\");\r\n $Dropdown = $treatments.parents(\".js-filter-dropdown\");\r\n filterDropdown.ajaxRequest($Dropdown, apilocation + \"Finders/SuggestTreatments/?filterByHospital=&filterByTreatmentName=\", \"\");\r\n });\r\n\r\n finder.find(\"input[name='hospitals']\").on('change',function () {\r\n finder.find(\"input[name='postCode']\").val(\"\");\r\n\r\n $treatments = finder.find(\"input[name='treatments']\");\r\n $treatments.val(\"\");\r\n $treatments.parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n\r\n $treatments.parents(\".js-filter-dropdown\").attr(\"data-url\", apilocation + \"Finders/SuggestTreatments/?filterByHospital=\" + finder.find(\"input[name='hospitals']\").val() + \"&filterByTreatmentName=\");\r\n $Dropdown = $treatments.parents(\".js-filter-dropdown\");\r\n filterDropdown.ajaxRequest($Dropdown, apilocation + \"Finders/SuggestTreatments/?filterByHospital=\" + finder.find(\"input[name='hospitals']\").val() + \"&filterByTreatmentName=\", \"\");\r\n });\r\n\r\n\r\n\r\n }\r\n else if (type == \"locations\") {\r\n finder.find(\"input[name='postCode']\").keydown(function () {\r\n finder.find(\"input[name='treatments']\").val(\"\");\r\n finder.find(\"input[name='treatments']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n });\r\n finder.find(\"input[name='treatments']\").on('change',function () {\r\n finder.find(\"input[name='postCode']\").val(\"\");\r\n });\r\n }\r\n else if (type == \"video-header\") {\r\n\r\n finder.find(\"input[name='treatment']\").on('change',function () {\r\n\r\n finder.find(\"input[name='postcode']\").val(\"\");\r\n finder.find(\"input[name='postcode']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Enter postcode\");\r\n\r\n finder.find(\"input[name='hospital']\").val(\"\");\r\n finder.find(\"input[name='hospital']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a hospital\");\r\n\r\n finder.find(\"input[name='consultant']\").val(\"\");\r\n finder.find(\"input[name='consultant']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a consultant\");\r\n\r\n });\r\n\r\n finder.find(\"input[name='postcode']\").keydown(function () {\r\n finder.find(\"input[name='hospital']\").val(\"\");\r\n finder.find(\"input[name='hospital']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a hospital\");\r\n\r\n finder.find(\"input[name='treatment']\").val(\"\");\r\n finder.find(\"input[name='treatment']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n });\r\n\r\n finder.find(\"input[name='hospital']\").on('change',function () {\r\n finder.find(\"input[name='postcode']\").val(\"\");\r\n\r\n finder.find(\"input[name='treatment']\").val(\"\");\r\n finder.find(\"input[name='treatment']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n });\r\n\r\n finder.find(\"input[name='consultant']\").on('change',function () {\r\n finder.find(\"input[name='treatment']\").val(\"\");\r\n finder.find(\"input[name='treatment']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n });\r\n }\r\n else if (type == \"testimonials\") {\r\n finder.find(\"input[name='consultant']\").on('change',function () {\r\n finder.find(\"input[name='treatment']\").val(\"\");\r\n finder.find(\"input[name='treatment']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a treatment\");\r\n });\r\n\r\n finder.find(\"input[name='treatment']\").on('change',function () {\r\n finder.find(\"input[name='consultant']\").val(\"\");\r\n finder.find(\"input[name='consultant']\").parent().find(\".js-filter-dropdown__toggle\").text(\"Select a consultant\");\r\n });\r\n }\r\n\r\n });\r\n\r\n\r\n //reset button\r\n $(\".js-finder\").on(\"click\", \".js-finder__reset\", function (e) {\r\n e.preventDefault();\r\n window.location.href = currentLocation;\r\n });\r\n\r\n $(\".js-finder\").on(\"click\", \".js-finder__submit\", function (e) {\r\n e.preventDefault();\r\n\r\n //find the type\r\n var type = $(this).parents(\".js-finder\").attr(\"data-type\");\r\n var actionUrl = $(this).parents(\".js-finder\").find(\"input[name='actionUrl']\").val();\r\n \r\n if (type == \"treatment-only\") {\r\n var treatment = $(this).parents(\".js-finder\").find(\"input[name='treatment-url']\").val();\r\n window.location = treatment;\r\n }\r\n else if (type == \"consultantsaz\") {\r\n var consultantId = $(this).parents(\".js-finder\").find(\"input[name='consultantId']\").val();\r\n location.href = consultantId;\r\n }\r\n else if(type == \"video-header\"){\r\n\r\n var hospital = $(this).parents(\".js-finder\").find(\"input[name='hospital']\").val();\r\n var postCode = $(this).parents(\".js-finder\").find(\"input[name='postcode']\").val();\r\n var treatment = $(this).parents(\".js-finder\").find(\"input[name='treatment']\").val();\r\n var consultant = $(this).parents(\".js-finder\").find(\"input[name='consultant']\").val();\r\n\r\n if (hospital != \"\" && typeof hospital != 'undefined') {\r\n location.href = hospital;\r\n } else if (postCode != \"\" && typeof postCode != 'undefined') {\r\n location.href = \"/locations/?postcode=\" + postCode;\r\n } else if (treatment != \"\" && typeof treatment != 'undefined') {\r\n location.href = treatment;\r\n } else if (consultant != \"\" && typeof consultant != 'undefined') {\r\n location.href = consultant;\r\n }\r\n\r\n }\r\n else if (type == \"appointment\")\r\n {\r\n var hospital = $(this).parents(\".js-finder\").find(\"input[name='hospital']\").val();\r\n var postCode = $(this).parents(\".js-finder\").find(\"input[name='postcode']\").val();\r\n var treatment = $(this).parents(\".js-finder\").find(\"input[name='treatment']\").val();\r\n var consultant = $(this).parents(\".js-finder\").find(\"input[name='consultant']\").val();\r\n\r\n if (hospital != \"\" && typeof hospital != 'undefined') {\r\n location.href = hospital;\r\n } else if (postCode != \"\" && typeof postCode != 'undefined') {\r\n location.href = \"/locations/?postcode=\" + postCode;\r\n } else if (treatment != \"\" && typeof treatment != 'undefined') {\r\n location.href = treatment;\r\n } else if (consultant != \"\" && typeof consultant != 'undefined') {\r\n location.href = consultant;\r\n }\r\n }\r\n else if (type == \"consultants\") {\r\n var hospital = $(this).parents(\".js-finder\").find(\"input[name='hospitals']\").val();\r\n var treatment = $(this).parents(\".js-finder\").find(\"input[name='treatments']\").val();\r\n var postCode = $(this).parents(\".js-finder\").find(\"input[name='postCode']\").val();\r\n var consultant = $(this).parents(\".js-finder\").find(\"input[name='consultantId']\").val(); \r\n\r\n //CONSULTANT BY SPECIALTY\r\n var speciality = $(this).parents(\".js-finder\").find(\"input[name='specialty']\").val();\r\n\r\n if (typeof consultant != 'undefined' && consultant != \"\") {\r\n location.href = consultant;\r\n return;\r\n }\r\n\r\n if (typeof hospital == 'undefined') {\r\n hospital = \"\";\r\n }\r\n\r\n if (typeof treatment == 'undefined') {\r\n treatment = \"\";\r\n }\r\n\r\n if (typeof postCode == 'undefined') {\r\n postCode = \"\";\r\n }\r\n\r\n if (typeof consultant == 'undefined') {\r\n consultant = \"\";\r\n }\r\n\r\n //CONSULTANT BY SPECIALTY\r\n if (typeof speciality == 'undefined') {\r\n speciality = \"\";\r\n } \r\n\r\n var typeSelectedClass = $(this).parents(\".js-finder\").find(\".specialityFilter>ul>li\").find(\"input[name='selector']:checked\").attr('class');\r\n var bookableCheckbox = $(\"#bookable\");\r\n var bookable = false;\r\n if (bookableCheckbox.length > 0) {\r\n bookable = $(\"#bookable\")[0].checked;\r\n }\r\n\r\n if (typeSelectedClass == 'treatment') {\r\n if (postCode != \"\" && treatment == \"\" && hospital == \"\") {\r\n $(this).parents(\".js-finder\").find(\"#Error\").remove();\r\n $(this).parents(\".js-finder\").find(\".inner-area\").append(\"
    Please select a treatment to continue.
    \");\r\n return;\r\n }\r\n }\r\n else {\r\n if (postCode != \"\" && speciality == \"\" && hospital == \"\") {\r\n $(this).parents(\".js-finder\").find(\"#Error\").remove();\r\n $(this).parents(\".js-finder\").find(\".inner-area\").append(\"
    Please select a speciality to continue.
    \");\r\n return;\r\n }\r\n } \r\n\r\n //CONSULTANT BY SPECIALTY - \r\n location.href = actionUrl + \"?filterByTreatment=\" + treatment + \"&filterBySpecialty=\" + speciality + \"&filterByHospital=\" + hospital + \"&filterByName=\" + consultant + \"&filterByPostCode=\" + postCode + \"&filterByBookable=\" + bookable;\r\n //location.href = actionUrl + \"?filterByTreatment=\" + treatment + \"&filterByHospital=\" + hospital + \"&filterByName=\" + consultant + \"&filterByPostCode=\" + postCode;\r\n }\r\n else if (type == \"testimonials\") {\r\n var treatment = $(this).parents(\".js-finder\").find(\"input[name='treatment']\").val();\r\n var consultant = $(this).parents(\".js-finder\").find(\"input[name='consultant']\").val();\r\n\r\n if (typeof treatment == 'undefined') {\r\n treatment = \"\";\r\n }\r\n if (typeof consultant == 'undefined') {\r\n consultant = \"\";\r\n }\r\n\r\n location.href = actionUrl + \"?consultant=\" + consultant + \"&treatment=\" + treatment;\r\n }\r\n else if (type == \"specialLocations\") {\r\n var postCode = $(this).parents(\".js-finder\").find(\"input[name='postCode']\").val();\r\n\r\n if (typeof postCode == 'undefined') {\r\n postCode = \"\";\r\n }\r\n\r\n location.href = \"?postCode=\" + postCode;\r\n }\r\n else if (type == \"siteSearch\") {\r\n var siteQuery = $(this).parents(\".js-finder\").find(\"input[name='query']\").val();\r\n\r\n if (typeof siteQuery == 'undefined') {\r\n siteQuery = \"\";\r\n }\r\n\r\n location.href = actionUrl + \"?query=\" + siteQuery;\r\n }\r\n else if (type == \"hospital-prices\") {\r\n\r\n var hospital = $(this).parents(\".js-finder\").find(\"input[name='hospital']\").val();\r\n\r\n if (hospital != \"\" && typeof hospital != 'undefined') {\r\n location.href = hospital;\r\n }\r\n }\r\n\r\n else {\r\n // console.log(\"No form action triggered\");\r\n }\r\n \r\n }); \r\n\r\n }\r\n};\r\n\r\nfunction trackCall() {\r\n gaHelper.trackEvent(\"Call\", \"Call made from Website\", undefined, undefined, true);\r\n}\r\n\r\nvar filterDropdown = {\r\n init: function () {\r\n\r\n var that = this;\r\n var selectedDefultTreatmentId = $(\"#defaultgrouptreatment\").val();\r\n var selectedDefultTreatmentText = $(\"#defaultTreatmentText\").val(); \r\n\r\n function selectItem ($dropdown, el) {\r\n\r\n $dropdown.removeClass(\"is-on\");\r\n $dropdown.parent(\".select-wrapper\").removeClass(\"is-open\");\r\n\r\n if ($dropdown.data(\"property\") == \"url\") {\r\n $dropdown.find(\".js-filter-dropdown__user-selection\").val($(el).data(\"url\"));\r\n }\r\n else {\r\n $dropdown.find(\".js-filter-dropdown__user-selection\").val($(el).data(\"id\"));\r\n }\r\n\r\n $dropdown.find(\".js-filter-dropdown__user-selection\").trigger('change');\r\n $dropdown.find(\".js-filter-dropdown__toggle\").html($(el).text()); \t\r\n\r\n } \r\n\r\n $(\".js-filter-dropdown\").each(function () {\r\n\r\n var $dropdown = $(this),\r\n $list = $dropdown.find(\".js-filter-dropdown__list\"), \r\n text = $dropdown.find(\".js-filter-dropdown__toggle\").text(),\r\n value = $dropdown.find(\".js-filter-dropdown__user-selection\").val(),\r\n dataUrl = $dropdown.attr(\"data-url\"),\r\n url = apilocation + dataUrl,\r\n searchThrottle,\r\n oldValue = \"\";\r\n if (value == \"\" && selectedDefultTreatmentId != 0) { value = selectedDefultTreatmentId} \r\n\r\n if (typeof dataUrl != 'undefined') {\r\n that.ajaxRequest($dropdown, url, \"\", value); \r\n }\r\n\r\n\r\n $dropdown.on(\"click\", \".js-filter-dropdown__toggle\", function (e) {\r\n\r\n e.preventDefault();\r\n\r\n if ($dropdown.hasClass(\"is-on\")) {\r\n $dropdown.removeClass(\"is-on\");\r\n $dropdown.parent(\".select-wrapper\").removeClass(\"is-open\");\r\n } else {\r\n $dropdown.parent(\".select-wrapper\").addClass(\"is-open\");\r\n $dropdown.addClass(\"is-on\");\r\n $dropdown.find(\".js-filter-dropdown__search\").trigger('focus');\r\n $dropdown.find(\".js-filter-dropdown__search-custom\").trigger('focus');\r\n }\r\n });\r\n\r\n $dropdown.find(\".js-filter-dropdown__list\").on(\"click\", \"li\", function () {\r\n\r\n selectItem($dropdown, this);\r\n\r\n });\r\n\r\n $dropdown.find(\".js-filter-dropdown__search\").on(\"keyup\", function () {\r\n\r\n var $searchInput = $(this),\r\n newValue = $searchInput.val(); \r\n\r\n clearTimeout(searchThrottle);\r\n\r\n searchThrottle = setTimeout(function () {\r\n\r\n if (newValue !== oldValue) {\r\n that.ajaxRequest($dropdown, url, newValue);\r\n oldValue = newValue;\r\n selectedItem = -1;\r\n $list.scrollTop(0);\r\n }\r\n\r\n }, 250);\r\n\r\n });\r\n\r\n $dropdown.find(\".js-filter-dropdown__search-custom\").on(\"keyup\", function () {\r\n\r\n var $searchInput = $(this);\r\n var $searchInputValue = $searchInput.val().toLowerCase();\r\n var $noResults = true;\r\n var $list = $dropdown.find(\".js-filter-dropdown__list\");\r\n var $suggestAPI = $dropdown.attr(\"data-suggest\");\r\n\r\n clearTimeout(searchThrottle);\r\n\r\n searchThrottle = setTimeout(function () {\r\n\r\n if ($searchInputValue == \"\") {\r\n $list.find(\"li\").each(function (index) {\r\n $(this).show();\r\n $noResults = false;\r\n });\r\n }\r\n else {\r\n $list.find(\"li\").each(function (index) {\r\n $(this).hide();\r\n });\r\n\r\n $list.find(\"li[data-name*='\" + $searchInputValue + \"']\").each(function (index) {\r\n $(this).show();\r\n $noResults = false;\r\n });\r\n }\r\n\r\n if ($noResults == true) {\r\n $list.find(\".js-filter-dropdown__list-error\").show();\r\n }\r\n else {\r\n $list.find(\".js-filter-dropdown__list-error\").hide();\r\n }\r\n\r\n }, 250);\r\n\r\n });\r\n\r\n var selectedItem = -1;\r\n\r\n $dropdown.find(\".js-filter-dropdown__search, .js-filter-dropdown__search-custom\").keydown(function (e) { \r\n\r\n\r\n var $items = $dropdown.find(\".js-filter-dropdown__list li\");\r\n\r\n\r\n if(e.which === 40 && selectedItem < $items.length) { \t\t\t\r\n selectedItem++;\r\n } else if (e.which === 38 && selectedItem > -1) {\r\n selectedItem--;\r\n }\r\n\r\n if(selectedItem > -1 && selectedItem < $items.length) {\r\n\r\n $items.removeClass(\"is-selected\");\r\n $items.eq(selectedItem).addClass(\"is-selected\"); \r\n\r\n $list.scrollTop($items.eq(selectedItem).position().top);\r\n\r\n if(e.which === 13) {\r\n e.preventDefault();\r\n selectItem($dropdown,$items[selectedItem]);\r\n }\r\n } \t\t\t\r\n });\r\n\r\n $list.on(\"mouseenter\", \"li\", function () {\r\n $(this).addClass(\"is-selected\").siblings().removeClass(\"is-selected\")\r\n selectedItem = $(this).index();\r\n })\r\n\r\n \r\n\r\n });\r\n\r\n\r\n\r\n\r\n },\r\n ajaxRequest: function ($dropdown, url, searchTerm, selectedValue) {\r\n $.ajax({\r\n url: url + searchTerm,\r\n dataType: \"json\",\r\n }).done(function (data) {\r\n var $list = $dropdown.find(\".js-filter-dropdown__list\").find(\"ul\");\r\n $list.html(\"\");\r\n var d = $.parseJSON(data);\r\n $.each(d[\"Suggestions\"], function (key, obj) {\r\n $list.append('
  • ' + obj.Display + '
  • ');\r\n });\r\n \r\n if (d[\"Error\"] != \"\") {\r\n var decoded = $('
    ').html(d[\"Error\"]).text();\r\n $list.html(decoded);\r\n // AH: enquiry was always undefined. can't locate what enquiry.init does?\r\n // enquiry.init();\r\n \r\n }\r\n\r\n\r\n if (selectedValue != \"\") {\r\n $dropdown.find(\".js-filter-dropdown__toggle\").html($dropdown.find(\"[data-id*='\" + selectedValue + \"']\").html());\r\n }\t\r\n \r\n })\r\n }\r\n};\r\n\r\nvar newsFilterSelect = {\r\n init: function () {\r\n\r\n $('.pagination__filter .select-wrapper__select').selectric({\r\n disableOnMobile: false,\r\n nativeOnMobile: false\r\n });\r\n }\r\n};\r\n\r\nfunction getWindowWidth() {\r\n var e = window, a = 'inner';\r\n if (!('innerWidth' in window )) {\r\n a = 'client';\r\n e = document.documentElement || document.body;\r\n }\r\n return { width : e[ a+'Width' ] , height : e[ a+'Height' ] };\r\n};\r\n\r\nvar paginationFilters = {\r\n init: function () {\r\n var that = this;\r\n $(\".js-pagination__filter__select\").each(function () {\r\n\r\n var $dropdown = $(this);\r\n $dropdown.find(\".select-wrapper__select\").on('change', function () {\r\n var currentLocation = location.href.split(\"?\")[0];\r\n var attributeValue = $(this).attr('data-filter-value');\r\n if (attributeValue === undefined) {\r\n attributeValue = \"type\";\r\n }\r\n\r\n location.href = currentLocation + \"?\" + attributeValue + \"=\" + $(this).find(\"option:selected\").val();\r\n });\r\n });\r\n }\r\n};\r\n\r\nvar externalLinkClass = {\r\n init: function () {\r\n\r\n $('.full-width-text a.button--lightmagenta[target=\"_blank\"]').addClass('icon-new-window').css('paddingRight', '30px');\r\n $('.brand-text-block a.button--lightmagenta[target=\"_blank\"]').addClass('icon-new-window').css('paddingRight', '30px');\r\n $('.centred-text a.button--lightmagenta[target=\"_blank\"]').addClass('icon-new-window').css('paddingRight', '30px');\r\n\r\n }\r\n\r\n};\r\n\r\n\r\nvar cookies = {\r\n cookieKey: 'cookieAgreementSpire',\r\n //cookieKey2: 'cookieStayOnTheWebsite',\r\n init: function () {\r\n var that = this;\r\n\r\n\r\n if (!that.readCookie(that.cookieKey)) {\r\n $('.js-cookie-bar').addClass('show');\r\n }\r\n else {\r\n $('.js-cookie-bar').removeClass('show');\r\n }\r\n\r\n $('.js-cookie-bar-agree').on(\"click\", function (e) {\r\n e.preventDefault();\r\n that.writeCookie(that.cookieKey, \"1\", 30);\r\n $('.js-cookie-bar').removeClass(\"show\");\r\n });\r\n\r\n },\r\n\r\n bannerCookies: function () {\r\n var that = this;\r\n var cookieKeyBase = 'collapseBanner';\r\n\r\n $( \".topAdvert-banner\" ).each( function () {\r\n\r\n var bannerId = $(this).data( \"bannerid\" ); \r\n var cookieKey = cookieKeyBase + bannerId;\r\n var cookie = that.readCookie(cookieKey);\r\n var $bannerContent = $(this).find('.js-accordion--reverse__content');\r\n var $bannerToggle = $(this).find('.js-accordion--reverse__toggle');\r\n var $bannerCTA = $(this).find('.button');\r\n var bannerMaximised = false;\r\n\r\n if (!cookie) {\r\n\r\n $bannerContent.addClass('is-on');\r\n $bannerToggle.addClass('is-on');\r\n bannerMaximised = true;\r\n \r\n gaHelper.trackEvent(\"Banner-\"+bannerId, \"Banner Displayed Maximised\", undefined, undefined, true);\t\t\t\r\n\r\n\r\n } else{\r\n\r\n $bannerContent.removeClass('is-on');\r\n $bannerToggle.removeClass('is-on');\r\n $('.js-accordion--reverse__content--minimised').removeClass('is-on');\t\r\n\r\n bannerMaximised = false;\r\n \r\n gaHelper.trackEvent(\"Banner-\"+bannerId, \"Banner Displayed Minimised\", undefined, undefined, true);\r\n }\r\n\r\n $bannerToggle.on(\"click\", function (e) {\r\n if(bannerMaximised){\r\n if (cookie === null) {\r\n that.writeCookie(cookieKey, true , 1);\r\n }\r\n gaHelper.trackEvent(\"Banner-\"+bannerId, \"User Minimised Banner\");\r\n } else {\t\t\t\t\r\n gaHelper.trackEvent(\"Banner-\"+bannerId, \"User Maximised Banner\");\r\n }\r\n });\r\n\r\n $bannerCTA.on(\"click\", function (e) {\r\n if($bannerToggle.hasClass(\"is-on\")){\r\n gaHelper.trackEvent(\"Banner-\"+bannerId, \"User Clicked CTA - Banner Maximised\");\r\n } else {\t\t\t\t\r\n gaHelper.trackEvent(\"Banner-\"+bannerId, \"User Clicked CTA - Banner Minimised\");\r\n }\r\n });\r\n });\t\r\n },\r\n\r\n cookieKeySurvey: 'closeEnquiery',\r\n surveyCookies: function () {\r\n\r\n var that = this;\r\n\r\n var desktopSurveyMaxCount = $(\"#desktopSurveyMaxCount\").val();\r\n var mobileSurveyMaxCount = $(\"#mobileSurveyMaxCount\").val();\r\n\r\n // if survey is disabled forget it\r\n if (desktopSurveyMaxCount == -1 && mobileSurveyMaxCount == -1) return;\r\n\r\n var $surveyModal = $(\".js-modal--survey\");\r\n var cookie = that.readCookie(that.cookieKeySurvey);\r\n\r\n // if the cookie is not there\r\n if (cookie === null) {\r\n\r\n // decide on max value dependant on desktop/mobile\r\n var surveyMaxCount = -1;\r\n var isDesktop = true;\r\n\r\n if ($(\".site-header\").is(':visible')) {\r\n isDesktop = true;\r\n surveyMaxCount = desktopSurveyMaxCount;\r\n }\r\n else {\r\n isDesktop = false;\r\n surveyMaxCount = mobileSurveyMaxCount;\r\n }\r\n\r\n // get the counter i.e. should we show the survey ?\r\n $.ajax({\r\n url: apilocation + 'SurveyApi/ShowSurvey',\r\n method: \"GET\",\r\n dataType: \"json\",\r\n data: {\r\n \"surveyMaxCount\": surveyMaxCount,\r\n \"isDesktop\": isDesktop\r\n }\r\n }).done(function (data) {\r\n\r\n if (data === true) {\r\n\r\n // write the cookie so this person does not see again for 30 days\r\n that.writeCookie(that.cookieKeySurvey, \"1\", 30);\r\n\r\n // incrment the relevant counter\r\n $.ajax({\r\n url: apilocation + 'SurveyApi/' + (isDesktop ? \"IncrementDesktopSurveyCount\" : \"IncrementMobileSurveyCount\"),\r\n method: \"POST\",\r\n }); \r\n\r\n // show the survey in a while\r\n setTimeout(function () {\r\n $surveyModal.addClass(\"is-on\");\r\n }, 15000);\r\n\r\n }\r\n\r\n }); \r\n\r\n } \r\n\r\n $surveyModal.on(\"click\", \".js-enquiry-form-modal__close\", function (e) {\r\n $(this).parents(\".js-modal\").removeClass(\"is-on\");\r\n });\r\n $surveyModal.on(\"click\", \".js-enquiry-form__give-feedback\", function (e) {\r\n\r\n //get the page url the user have been to before click the \"Give feedback\" button\r\n var firstPage = window.location.href;;\r\n localStorage.setItem(\"firstPage\", firstPage);\r\n var storedfirstPage = localStorage.getItem('firstPage');\r\n\r\n\r\n $(this).parents(\".js-modal\").removeClass(\"is-on\");\r\n //var myWindow = window.open(\"\", \"_blank\", \"toolbar=no,scrollbars=yes,resizable=yes,top=0,left=0,width='700',height=700\" );\r\n var modalUrl = location.protocol + '//' + location.host + '/please-wait.html'\r\n var myWindow = window.open(modalUrl, \"myWindow\", \"scrollbars=1,menubar=1,resizable=1,width=660,height=700\"); // Opens a new window\r\n ;\r\n });\r\n\r\n\r\n },\r\n\r\n\r\n writeCookie: function (name, value, days) {\r\n var date = new Date();\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n var expires = \"; expires=\" + date.toGMTString();\r\n var cookieString = name + \"=\" + value + expires + \"; path=/\";\r\n document.cookie = cookieString;\r\n },\r\n\r\n readCookie: function (name) {\r\n var cookies = document.cookie.split(';');\r\n for (var i = 0; i < cookies.length; i++) {\r\n var cookie = cookies[i];\r\n while (cookie.charAt(0) == ' ') {\r\n cookie = cookie.substring(1, cookie.length);\r\n }\r\n if (cookie.indexOf(name + \"=\") == 0) {\r\n return cookie.substring(name.length + 1, cookie.length);\r\n }\r\n }\r\n return null;\r\n }\r\n};\r\n\r\nvar enquiryFormCTA = {\r\n init: function(){\r\n\r\n var that = this;\r\n that.characterCount();\r\n\r\n $(\".js-modal\").on(\"click\", \".js-enquiry-form__close\", function (e) {\r\n e.preventDefault();\r\n $(\".js-modal\").removeClass(\"is-on\");\r\n $(\"body\").removeClass(\"is-body-modal\");\r\n\r\n if ($('.enquiry-form__thankyou__content').length > 0) {\r\n $('.enquiry-form__thankyou__content').remove();\r\n $('.enquiry-form__content').show();\r\n $(\".enquiry-form-new\").trigger('reset');\r\n }\r\n });\r\n\r\n //$(\".js-enquiry-form__tabs__link--enquiry\").on('click', function () {\r\n // gaHelper.trackEvent(\"Enquire tabs\", \"Click\", 'Request an enquiry', undefined, true);\r\n //});\r\n\r\n //$(\".js-enquiry-form__tabs__link--callback\").on('click', function () {\r\n // gaHelper.trackEvent(\"Enquire tabs\", \"Click\", 'Request a call back', undefined, true);\r\n //});\r\n\r\n\r\n },\r\n characterCount: function () {\r\n var that = this;\r\n var maxCount = $(\"#enquiry\").attr(\"data-parsley-maxlength\");\r\n var counter = 0;\r\n var countText = \"\"; \r\n\r\n $(\"#enquiry\").on('keyup', function (e) {\r\n if ($(\".js-enquiry-textarea\").length > 0) {\r\n counter = ($(\".js-enquiry-textarea\").val().length - 1) + 1;\r\n if (counter > maxCount) {\r\n countText = \"\";\r\n }\r\n else {\r\n countText = \"\";\r\n }\r\n $(\".js-enquiry-textarea-count\").html(countText);\r\n }\r\n });\r\n }\r\n};\r\n\r\n\r\n\r\n//var noOfPages =0;\r\nvar checkIfWesbiteLeft = {\r\n\r\n init: function () {\r\n\r\n var localLink = false;\r\n var resetLocalLink;\r\n var storedTime = localStorage.getItem('time');\r\n var dateNow = new Date().getTime();\r\n\r\n if (!storedTime) {\r\n localStorage.setItem(\"time\", dateNow);\r\n }\r\n\r\n $(\"body\").on(\"click\", \"a\", function () {\r\n if (!(this.hostname && this.hostname !== location.hostname)) {\r\n localLink = true;\r\n }\r\n clearTimeout(resetLocalLink);\r\n resetLocalLink = setTimeout(function () {\r\n localLink = false;\r\n }, 10000);\r\n });\r\n\r\n //count the no of page user have been to (including the refreshes)\r\n if (localStorage.clickcount) {\r\n localStorage.clickcount = Number(localStorage.clickcount) + 1;\r\n } else {\r\n localStorage.clickcount = 1;\r\n }\r\n\r\n $(window).on(\"beforeunload\", function () {\r\n if (!localLink) {\r\n //get the latest page the user have been to before exiting the website\r\n var lastPage = window.location.href;\r\n localStorage.setItem(\"lastPage\", lastPage);\r\n var storedlastPage = localStorage.getItem('lastPage');\r\n }\r\n });\r\n }\r\n\r\n};\r\n\r\n\r\nvar enquiryTabs = {\r\n init: function () {\r\n\r\n $(\".js-enquiry-form__tabs .tabs__content\").first().addClass( \"is-on\");\r\n\r\n var featGridItem = $('.feature-grid__item__text'),\r\n pricedItem = $('.feature-grid__item--priced'),\r\n imageItem = $('.feature-grid__item--image__text');\r\n\r\n $(\".js-enquiry-form__tabs .enquiry-form__tabs__link\").on(\"click\", function (e) {\r\n \r\n e.preventDefault();\r\n\r\n var $navItems = $(this).parents(\".js-enquiry-form__tabs\").find(\".js-enquiry-form__tabs__nav a\"),\r\n $contentItems = $(this).parents(\".js-enquiry-form__tabs\").find(\".js-enquiry-form__tabs__content\"),\r\n index = $navItems.index(this);\r\n\r\n $navItems.removeClass(\"is-on\").eq(index).addClass(\"is-on\");\r\n $contentItems.removeClass(\"is-on\").eq(index).addClass(\"is-on\");\r\n\r\n });\r\n }\r\n};\r\n\r\n\r\n\r\nvar requestForm = {\r\n init: function () {\r\n\r\n var month = new Array();\r\n month[0] = \"Jan\";\r\n month[1] = \"Feb\";\r\n month[2] = \"Mar\";\r\n month[3] = \"Apr\";\r\n month[4] = \"May\";\r\n month[5] = \"Jun\";\r\n month[6] = \"Jul\";\r\n month[7] = \"Aug\";\r\n month[8] = \"Sep\";\r\n month[9] = \"Oct\";\r\n month[10] = \"Nov\";\r\n month[11] = \"Dec\";\r\n\r\n var that = this;\r\n $(\".js-request-form__content__requesting-personal-for-someone-else\").hide();\r\n $(\".js-full-patient-record\").hide();\r\n $(\".js-request-form\").hide();\r\n\r\n if ($(\".request-form\").length > 0) {\r\n $(\".finder--locations\").hide();\r\n }\r\n\r\n $(\".js-medicalRecordsAndPersonal\").on('change', function () {\r\n $(\".js-request-form\").show();\r\n $(\".finder--locations\").hide();\r\n $(\".js-medical-records-only-note\").removeClass(\"is-on\");\r\n });\r\n\r\n $(\".js-medicalRecords\").on('change', function () {\r\n $(\".js-request-form\").hide();\r\n $(\".finder--locations\").show();\r\n $(\".js-medical-records-only-note\").addClass(\"is-on\");\r\n });\r\n\r\n $(\"#forSomeoneElse\").on('change', function () {\r\n $(\".js-request-form__content__requesting-personal-for-someone-else\").show();\r\n $(\"#authorisedPerson\").prop(\"disabled\", false);\r\n $(\"#authorisedPerson\").prop(\"checked\", false);\r\n });\r\n\r\n $(\"#forMyself\").on('change', function () {\r\n $(\".js-request-form__content__requesting-personal-for-someone-else\").hide();\r\n $(\"#authorisedPerson\").prop(\"disabled\", true);\r\n $(\"#authorisedPerson\").prop(\"checked\", false);\r\n });\r\n\r\n $(\"#patientRecordN\").on('change', function () {\r\n $(\".js-full-patient-record\").show();\r\n });\r\n\r\n $(\"#patientRecordY\").on('change', function () {\r\n $(\".js-full-patient-record\").hide();\r\n });\r\n\r\n $(\"#currentPerson\").on('change', function () {\r\n var nowDate = new Date();\r\n var date = nowDate.getDate() + '/' + month[nowDate.getMonth()] + '/' + nowDate.getFullYear(); \r\n\r\n $(\".js-declaration-full-name\").text($(\"#first-name\").val() + \" \" + $(\"#surname\").val());\r\n $(\".js-declaration-date\").text(date);\r\n });\r\n\r\n $(\"#authorisedPerson\").on('change', function () {\r\n\r\n var nowDate = new Date();\r\n var date = nowDate.getDate() + '/' + month[nowDate.getMonth()] + '/' + nowDate.getFullYear(); \r\n $(\".js-declaration-full-name\").text($(\"#first-name-se\").val() + \" \" + $(\"#surname-se\").val());\r\n $(\".js-declaration-date\").text(date);\r\n });\r\n\r\n $(\".js-request-form__submit\").on('click', function (e) {\r\n e.preventDefault();\r\n var thisForm = $(this).parents(\".js-request-form\");\r\n that.submitForm(thisForm);\r\n });\r\n },\r\n\r\n submitForm: function (thisForm) {\r\n\r\n var $submitButton = $(thisForm).find(\".js-request-form__submit\");\r\n var $spinner = thisForm.find('.request-form__button-container__spinner');\r\n\r\n var parsleyConfig = {\r\n errorsContainer: function (pEle) {\r\n var $err = pEle.$element.parents('.js-request-form__content__element').find('.error');\r\n //console.log($err);\r\n return $err;\r\n },\r\n classHandler: function (el) {\r\n return el.$element.closest('.js-request-form__content__element');\r\n },\r\n uiEnabled: true\r\n };\r\n\r\n var form = $(thisForm).parsley(parsleyConfig);\r\n\r\n if (form[0].validate()) {\r\n // Dates\r\n var dobDay = false;\r\n var dobMonth = false;\r\n var dobYear = false;\r\n\r\n var dobDayse = false;\r\n var dobMonthse = false;\r\n var dobYearse = false;\r\n\r\n var tpFromDay = false;\r\n var tpFromMonth = false;\r\n var tpFromYear = false;\r\n\r\n var tpToDay = false;\r\n var tpToMonth = false;\r\n var tpToYear = false;\r\n\r\n var personalDataRequest = '';\r\n var title = '';\r\n var surname = '';\r\n var firstname = '';\r\n var maidenname = '';\r\n var gender = '';\r\n var dob = '';\r\n var emailAddress = '';\r\n var phoneNumber = '';\r\n var address = '';\r\n var postcode = '';\r\n var titlese = '';\r\n var surnamese = '';\r\n var firstnamese = '';\r\n var maidennamese = '';\r\n var genderse = '';\r\n var dobse = '';\r\n var proofAuth = '';\r\n var emailAddressse = '';\r\n var phoneNumberse = '';\r\n var addressse = '';\r\n var postcodese = '';\r\n var relationship = '';\r\n var tpFromDate = '';\r\n var tpToDate = '';\r\n var selectedHospital = '';\r\n var selectedHospitalNodeId = '';\r\n var entirePatientRecord = '';\r\n var pathologyRecords = '';\r\n var radiologyRecords = '';\r\n var pharmacyRecords = '';\r\n var outpatientRecords = '';\r\n var physiotherapyRecords = '';\r\n var theatreRecords = '';\r\n var wardRecords = '';\r\n var oncologyRecords = '';\r\n var endoscopyRecords = '';\r\n var other = '';\r\n var emailCorrespondence = '';\r\n var anyEmails = '';\r\n var anyNamesKeywords = '';\r\n var complaints = '';\r\n var billingInfo = '';\r\n var telRecordings = '';\r\n var otherSpecific = '';\r\n var infoCorrect = '';\r\n var declarationFullName = '';\r\n var declarationDate = '';\r\n\r\n // Handle Radio button choices.\r\n var _personalDataRequest = $(\"input[type='radio'][name='personalDataRequest']:checked\");\r\n if (typeof _personalDataRequest != 'undefined') {\r\n if (typeof $(_personalDataRequest).val() != 'undefined') {\r\n personalDataRequest = $(_personalDataRequest).val();\r\n }\r\n }\r\n\r\n var _gender = $(\"input[type='radio'][name='gender']:checked\");\r\n if (typeof _gender != 'undefined') {\r\n if (typeof $(_gender).val() != 'undefined') {\r\n gender = $(_gender).val();\r\n }\r\n }\r\n\r\n var _genderse = $(\"input[type='radio'][name='genderse']:checked\");\r\n if (typeof _genderse != 'undefined') {\r\n if (typeof $(_genderse).val() != 'undefined') {\r\n genderse = $(_genderse).val();\r\n }\r\n }\r\n\r\n var _proofAuth = $(\"input[type='radio'][name='proofAuth']:checked\");\r\n if (typeof _proofAuth != 'undefined') {\r\n if (typeof $(_proofAuth).val() != 'undefined') {\r\n proofAuth = $(_proofAuth).val();\r\n }\r\n }\r\n\r\n var _entirePatientRecord = $(\"input[type='radio'][name='patientRecord']:checked\");\r\n if (typeof _entirePatientRecord != 'undefined') {\r\n if (typeof $(_entirePatientRecord).val() != 'undefined') {\r\n entirePatientRecord = $(_entirePatientRecord).val();\r\n }\r\n }\r\n\r\n var _emailCorrespondence = $(\"input[type='radio'][name='emailCorrespondence']:checked\");\r\n if (typeof _emailCorrespondence != 'undefined') {\r\n if (typeof $(_emailCorrespondence).val() != 'undefined') {\r\n emailCorrespondence = $(_emailCorrespondence).val();\r\n }\r\n }\r\n\r\n var _complaints = $(\"input[type='radio'][name='complaints']:checked\");\r\n if (typeof _complaints != 'undefined') {\r\n if (typeof $(_complaints).val() != 'undefined') {\r\n complaints = $(_complaints).val();\r\n }\r\n }\r\n\r\n var _billingInfo = $(\"input[type='radio'][name='billingInfo']:checked\");\r\n if (typeof _billingInfo != 'undefined') {\r\n if (typeof $(_billingInfo).val() != 'undefined') {\r\n billingInfo = $(_billingInfo).val();\r\n }\r\n }\r\n \r\n var _telRecordings = $(\"input[type='radio'][name='telRecordings']:checked\");\r\n if (typeof _telRecordings != 'undefined') {\r\n if (typeof $(_telRecordings).val() != 'undefined') {\r\n telRecordings = $(_telRecordings).val();\r\n }\r\n }\r\n\r\n var _infoCorrect = $(\"input[type='radio'][name='infoCorrect']:checked\");\r\n if (typeof _infoCorrect != 'undefined') {\r\n if (typeof $(_infoCorrect).val() != 'undefined') {\r\n infoCorrect = $(_infoCorrect).val();\r\n }\r\n }\r\n\r\n // Patient Records\r\n var _rb1 = $(\"input[type='radio'][name='rb1']:checked\");\r\n if (typeof _rb1 != 'undefined') {\r\n if (typeof $(_rb1).val() != 'undefined') {\r\n pathologyRecords = $(_rb1).val();\r\n }\r\n }\r\n var _rb2 = $(\"input[type='radio'][name='rb2']:checked\");\r\n if (typeof _rb2 != 'undefined') {\r\n if (typeof $(_rb2).val() != 'undefined') {\r\n radiologyRecords = $(_rb2).val();\r\n }\r\n }\r\n var _rb3 = $(\"input[type='radio'][name='rb3']:checked\");\r\n if (typeof _rb3 != 'undefined') {\r\n if (typeof $(_rb3).val() != 'undefined') {\r\n pharmacyRecords = $(_rb3).val();\r\n }\r\n }\r\n var _rb4 = $(\"input[type='radio'][name='rb4']:checked\");\r\n if (typeof _rb4 != 'undefined') {\r\n if (typeof $(_rb4).val() != 'undefined') {\r\n outpatientRecords = $(_rb4).val();\r\n }\r\n }\r\n var _rb5 = $(\"input[type='radio'][name='rb5']:checked\");\r\n if (typeof _rb5 != 'undefined') {\r\n if (typeof $(_rb5).val() != 'undefined') {\r\n physiotherapyRecords = $(_rb5).val();\r\n }\r\n }\r\n var _rb6 = $(\"input[type='radio'][name='rb6']:checked\");\r\n if (typeof _rb6 != 'undefined') {\r\n if (typeof $(_rb6).val() != 'undefined') {\r\n theatreRecords = $(_rb6).val();\r\n }\r\n }\r\n var _rb7 = $(\"input[type='radio'][name='rb7']:checked\");\r\n if (typeof _rb7 != 'undefined') {\r\n if (typeof $(_rb7).val() != 'undefined') {\r\n wardRecords = $(_rb7).val();\r\n }\r\n }\r\n var _rb8 = $(\"input[type='radio'][name='rb8']:checked\");\r\n if (typeof _rb8 != 'undefined') {\r\n if (typeof $(_rb8).val() != 'undefined') {\r\n oncologyRecords = $(_rb8).val();\r\n }\r\n }\r\n var _rb9 = $(\"input[type='radio'][name='rb9']:checked\");\r\n if (typeof _rb9 != 'undefined') {\r\n if (typeof $(_rb9).val() != 'undefined') {\r\n endoscopyRecords = $(_rb9).val();\r\n }\r\n }\r\n\r\n\r\n // Handle Dates\r\n if (typeof $(\"#DOB-day\") != 'undefined') {\r\n if (typeof $(\"#DOB-day\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#DOB-day\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n dobDay = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#DOB-month\") != 'undefined') {\r\n if (typeof $(\"#DOB-month\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#DOB-month\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n dobMonth = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#DOB-year\") != 'undefined') {\r\n if (typeof $(\"#DOB-year\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#DOB-year\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n dobYear = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n dob = (dobDay && dobMonth && dobYear) ? dobYear + \"/\" + dobMonth + \"/\" + dobDay : 'Date of birth not set';\r\n\r\n if (typeof $(\"#DOB-day-se\") != 'undefined') {\r\n if (typeof $(\"#DOB-day-se\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#DOB-day-se\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n dobDayse = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#DOB-month-se\") != 'undefined') {\r\n if (typeof $(\"#DOB-month-se\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#DOB-month-se\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n dobMonthse = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#DOB-year-se\") != 'undefined') {\r\n if (typeof $(\"#DOB-year-se\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#DOB-year-se\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n dobYearse = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n dobse = (dobDayse && dobMonthse && dobYearse) ? dobYearse + \"/\" + dobMonthse + \"/\" + dobDayse : 'Date of birth not set';\r\n\r\n\r\n if (typeof $(\"#tp-from-day\") != 'undefined') {\r\n if (typeof $(\"#tp-from-day\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#tp-from-day\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n tpFromDay = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#tp-from-month\") != 'undefined') {\r\n if (typeof $(\"#tp-from-month\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#tp-from-month\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n tpFromMonth = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#tp-from-year\") != 'undefined') {\r\n if (typeof $(\"#tp-from-year\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#tp-from-year\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n tpFromYear = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n tpFromDate = (tpFromDay && tpFromMonth && tpFromYear) ? tpFromDay + \"/\" + tpFromMonth + \"/\" + tpFromYear : 'From time period not set';\r\n\r\n if (typeof $(\"#tp-to-day\") != 'undefined') {\r\n if (typeof $(\"#tp-to-day\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#tp-to-day\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n tpToDay = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#tp-to-month\") != 'undefined') {\r\n if (typeof $(\"#tp-to-month\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#tp-to-month\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n tpToMonth = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n if (typeof $(\"#tp-to-year\") != 'undefined') {\r\n if (typeof $(\"#tp-to-year\").val() != 'undefined') {\r\n var parsed = parseInt($(\"#tp-to-year\").val(), 10);\r\n if (!isNaN(parsed)) {\r\n tpToYear = parsed;\r\n }\r\n parsed = undefined;\r\n }\r\n }\r\n tpToDate = (tpToDay && tpToMonth && tpToYear) ? tpToDay + \"/\" + tpToMonth + \"/\" + tpToYear : 'To time period not set';\r\n\r\n\r\n // Handle Dropdowns\r\n title = $(\"#title\").val();\r\n titlese = $(\"#title-se\").val();\r\n selectedHospital = $(\"#hospitals option:selected\").text();\r\n selectedHospitalNodeId = $(\"#hospitals\").val();\r\n relationship = $(\"#relationship\").val();\r\n\r\n // Handle textboxes\r\n \r\n title = $(\"#title\").val();\r\n surname = $(\"#surname\").val();\r\n firstname = $(\"#first-name\").val();\r\n maidenname = $(\"#maiden-name\").val();\r\n emailAddress = $(\"#enquiry-email\").val();\r\n phoneNumber = $(\"#phone-number\").val();\r\n address = $(\"#address\").val();\r\n postcode = $(\"#postcode\").val();\r\n titlese = $(\"#title-se\").val();\r\n surnamese = $(\"#surname-se\").val();\r\n firstnamese = $(\"#first-name-se\").val();\r\n maidennamese = $(\"#maiden-name-se\").val();\r\n emailAddressse = $(\"#enquiry-email-se\").val();\r\n phoneNumberse = $(\"#phone-number-se\").val();\r\n addressse = $(\"#address-se\").val();\r\n postcodese = $(\"#postcode-se\").val();\r\n otherPatientRecord = $(\"#other-patient-record\").val();\r\n otherSpecific = $(\"#other-specific\").val();\r\n declarationFullName = $(\"#declaration-full-name\").text();\r\n declarationDate = $(\"#declaration-date\").text();\r\n anyEmails = $(\"#any-emails\").val();\r\n anyNamesKeywords = $(\"#any-names-keywords\").val();\r\n\r\n\r\n // prepare the object before posting.\r\n var requestFields = {\r\n \"personalDataRequest\": personalDataRequest,\r\n \"title\": title,\r\n \"surname\": surname,\r\n \"firstname\": firstname,\r\n \"maidenname\": maidenname,\r\n \"gender\": gender,\r\n \"dob\": dob,\r\n \"emailAddress\": emailAddress,\r\n \"phoneNumber\": phoneNumber,\r\n \"address\": address,\r\n \"postcode\": postcode,\r\n \"titlese\": titlese,\r\n \"surnamese\": surnamese,\r\n \"firstnamese\": firstnamese,\r\n \"maidennamese\": maidennamese,\r\n \"genderse\": genderse,\r\n \"dobse\": dobse,\r\n \"proofAuth\": proofAuth,\r\n \"emailAddressse\": emailAddressse,\r\n \"phoneNumberse\": phoneNumberse,\r\n \"addressse\": addressse,\r\n \"postcodese\": postcodese,\r\n \"relationship\": relationship,\r\n \"tpFromDate\": tpFromDate,\r\n \"tpToDate\": tpToDate,\r\n \"hospital\": selectedHospital,\r\n \"hospitalNodeId\": selectedHospitalNodeId,\r\n \"entirePatientRecord\": entirePatientRecord,\r\n \"pathologyRecords\": pathologyRecords,\r\n \"radiologyRecords\": radiologyRecords,\r\n \"pharmacyRecords\": pharmacyRecords,\r\n \"outpatientRecords\": outpatientRecords,\r\n \"physiotherapyRecords\": physiotherapyRecords,\r\n \"theatreRecords\": theatreRecords,\r\n \"wardRecords\": wardRecords,\r\n \"oncologyRecords\": oncologyRecords,\r\n \"endoscopyRecords\": endoscopyRecords,\r\n \"otherPatientRecord\": otherPatientRecord,\r\n \"emailCorrespondence\": emailCorrespondence,\r\n \"anyEmails\": anyEmails,\r\n \"anyNamesKeywords\": anyNamesKeywords,\r\n \"complaints\": complaints,\r\n \"billingInfo\": billingInfo,\r\n \"telRecordings\": telRecordings,\r\n \"otherSpecific\": otherSpecific,\r\n \"infoCorrect\": infoCorrect,\r\n \"declarationFullName\": declarationFullName,\r\n \"declarationDate\": declarationDate\r\n };\r\n\r\n $submitButton.prop('disabled', true);\r\n $spinner.addClass('request-booking-form__button-container__spinner--on'); \r\n\r\n postRequestForm(requestFields, thisForm, $submitButton, $spinner);\r\n }\r\n else {\r\n // send a GA tracking to say the form wasn't validated.'\r\n }\r\n }\r\n}\r\n\r\nvar eventBookingForm = {\r\n getParsleyConfig: function () {\r\n return {\r\n errorsContainer: function (pEle) {\r\n var $err = pEle.$element.parents('.js-enquiry-form__tabs__content__inner__container__element').find('.error');\r\n return $err;\r\n },\r\n classHandler: function (el) {\r\n return el.$element.closest('.js-enquiry-form__tabs__content__inner__container__element');\r\n },\r\n uiEnabled: true\r\n };\r\n },\r\n init: function () {\r\n var that = this;\r\n var isBookingForm = $(\".js-event-booking-form\").length > 0;\r\n if (!isBookingForm) {\r\n return;\r\n }\r\n $(\".js-event-booking-form\").parsley(that.getParsleyConfig()).on('field:validated', function () { });\r\n $(\".js-event-booking-form__submit\").on('click', function (e) {\r\n e.preventDefault();\r\n var thisForm = $(this).parents(\".js-event-booking-form\");\r\n that.submitForm(thisForm);\r\n\r\n setTimeout(function () {\r\n if ($(\".js-event-booking-form\").find('#parsley-id-17').children('li').length > 0) {\r\n gaHelper.trackEvent(\"Wrong email entered\", \"Submit\", 'Not a valid email', undefined, true);\r\n }\r\n else if ($(\".js-event-booking-form\").find('#parsley-id-19').children('li').length > 0) {\r\n gaHelper.trackEvent(\"Wrong email entered\", \"Submit\", 'Not a valid email', undefined, true);\r\n }\r\n\r\n if ($(\".js-event-booking-form\").find('#parsley-id-21').children('li').length > 0) {\r\n gaHelper.trackEvent(\"Wrong phone number entered\", \"Submit\", 'Not a valid phonenumber', undefined, true);\r\n }\r\n \r\n\r\n }, 2000);\r\n });\r\n },\r\n\r\n removeLastComma: function (str) {\r\n return str.replace(/,\\s*$/, \"\")\r\n },\r\n\r\n submitForm: function (thisForm) {\r\n var that = this;\r\n var $submitButton = $(thisForm).find(\".js-event-booking-form__submit\");\r\n var $spinner = thisForm.find('.event-booking-form__button-container__spinner');\r\n\r\n var form = $(thisForm).parsley(that.getParsleyConfig());\r\n if (form.validate()) {\r\n\r\n var age = '';\r\n var firstName = thisForm.find('#first-name').val();\r\n var surname = thisForm.find('#surname').val();\r\n var dobDay = thisForm.find(\".js-dob-day\").val() ? parseInt(thisForm.find(\".js-dob-day\").val(), 10) : false;\r\n var dobMonth = thisForm.find(\".js-dob-month\").val() ? parseInt(thisForm.find(\".js-dob-month\").val(), 10) : false;\r\n var dobYear = thisForm.find(\".js-dob-year\").val() ? parseInt(thisForm.find(\".js-dob-year\").val(), 10) : false;\r\n var dob = (dobDay && dobMonth && dobYear) ? dobYear + \"/\" + dobMonth + \"/\" + dobDay : 'Date of birth not set';\r\n var emailAddress = thisForm.find('#event-booking-email').val(); // CHECK NAME\r\n var emailAddressConfirm = thisForm.find('#event-booking-email-confirm').val();\r\n var phoneNum = thisForm.find('#phone-number').val(); \r\n var eventDateValue = thisForm.find('#eventDate').val();-form\r\n var eventTitle = thisForm.find('#eventTitle').val(); \r\n var nodeId = thisForm.find('#hidden-node-id').text();\r\n var nearestHospitalName = ''; \r\n var nearestHospitalId = thisForm.find('#nearestHospitalId').val();\r\n var bookingFormDestinationEmail = thisForm.find(\"#bookingFormDestinationEmail\").val();\r\n var bookingFormSpecificTopicsCovered = thisForm.find(\"#enquiry\").val();\r\n var howDidYouHearAboutUs = thisForm.find(\"#enquiry-source\").val(); \r\n var enquiryFormOptinEmail = thisForm.find(\"#optinEmail\").prop(\"checked\");\r\n var enquiryFormOptinSMS = thisForm.find(\"#optinSms\").prop(\"checked\");\r\n var enquiryFormOptinPrivacy = false;\r\n //contact bast time //thisForm.find('#enquiry-besttime-to-contact').text();\r\n var enquiryBestTimeToContact = thisForm.find('#enquiry-besttime-to-contact').val(); \r\n\r\n try {\r\n if (dob !== 'Date of birth not set') {\r\n age = ~~((Date.now() - +new Date(dob)) / (31557600000));\r\n } else {\r\n age = 'Date of birth not set';\r\n }\r\n\r\n } catch (e) {\r\n }\r\n\r\n var marketingOptin = \"\";\r\n if (enquiryFormOptinEmail) {\r\n marketingOptin += \"email,\"\r\n }\r\n if (enquiryFormOptinSMS) {\r\n marketingOptin += \"sms,\"\r\n }\r\n\r\n var enquiryFields = {\r\n \"firstName\": firstName,\r\n \"surname\": surname,\r\n \"dob\": dob,\r\n \"emailAddress\": emailAddress,\r\n \"emailAddressConfirm\": emailAddressConfirm,\r\n \"phoneNum\": phoneNum,\r\n // \"enquiryFormOptin\": enquiryFormOptin,\r\n \"isEvent\": true,\r\n \"eventDate\": eventDateValue,\r\n \"eventTitle\": eventTitle,\r\n \"nearestHospitalId\": nearestHospitalId,\r\n \"nodeId\": nodeId,\r\n \"bookingFormDestinationEmail\": bookingFormDestinationEmail,\r\n // \"enquiryFormOptin\": enquiryFormOptin,\r\n \"bookingFormSpecificTopicsCovered\": bookingFormSpecificTopicsCovered,\r\n \"howDidYouHearAboutUs\": howDidYouHearAboutUs,\r\n \"enquiryFormOptinEmail\": enquiryFormOptinEmail,\r\n \"enquiryFormOptinSMS\": enquiryFormOptinSMS,\r\n \"enquiryFormOptinPrivacy\": enquiryFormOptinPrivacy,\r\n \"enquiryBestTimeToContact\": enquiryBestTimeToContact,\r\n \"marketingOptIn\": this.removeLastComma(marketingOptin)\r\n };\r\n \r\n $submitButton.prop('disabled', true);\r\n $spinner.addClass('event-booking-form__button-container__spinner--on'); \r\n\r\n postEventForm(enquiryFields, thisForm, age, $submitButton, $spinner);\r\n \r\n }\r\n else {\r\n // send a GA tracking to say the form wasn't validated.'\r\n }\r\n },\r\n\r\n\r\n};\r\n\r\nvar enquiryForm = {\r\n init: function () {\r\n var isEnquiryForm = $(\"#enquiry-form\").length > 0;\r\n if (!isEnquiryForm) {\r\n return;\r\n }\r\n\r\n var that = this;\r\n that.enquiryMobileCTAOverCtrl();\r\n that.customValidator();\r\n that.emailValidator();\r\n\r\n $(\".js-enquiry-form__submit\").on('click', function (e) {\r\n\r\n e.preventDefault();\r\n var thisForm = $(this).parents(\".js-enquiry-form\");\r\n\r\n return that.validateAndRecaptchaPassForm(thisForm);\r\n });\r\n\r\n //$(\".js-enquiry-form\").each(function (index) {\r\n\r\n // if ($(this).parsley !== null) {\r\n // $(this).parsley(that.getParsleyConfig()).on('field:validated', function () { });\r\n // }\r\n\r\n //});\r\n },\r\n recordCustomErrorDataLayer: function (field, message) {\r\n var dataLayer = window.dataLayer || [];\r\n dataLayer.push({\r\n 'event': 'enquire_submission',\r\n 'error_field': field,\r\n 'error_message': message\r\n });\r\n },\r\n bindErrorRecorder: function () {\r\n var that = this;\r\n\r\n window.Parsley.on('field:error', function () {\r\n const field = this.$element[0];\r\n const id = field.id ? field.id : field.name;\r\n const required = this.validationResult[0].assert.name == 'required';\r\n var requiredMsg = this.domOptions.requiredMessage ? this.domOptions.requiredMessage : \"Value required.\";\r\n const msg = required ? requiredMsg : this.domOptions.patternMessage;\r\n\r\n that.recordCustomErrorDataLayer(id, msg);\r\n });\r\n },\r\n getParsleyConfig: function () {\r\n return {\r\n errorsContainer: function (pEle) {\r\n var $err = pEle.$element.parents('.js-enquiry-form__tabs__content__inner__container__element').find('.error');\r\n return $err;\r\n },\r\n classHandler: function (el) {\r\n return el.$element.closest('.js-enquiry-form__tabs__content__inner__container__element');\r\n },\r\n uiEnabled: true\r\n };\r\n },\r\n customValidator: function () {\r\n\r\n var $dobErrorRequiredContainer = $('.js-date-required-concatenate'),\r\n $dobContainer = $('.enquiry-form__tabs__content__inner__container__element--dob--required');\r\n\r\n $('.js-enquiry-form__submit').on(\"click\", function () {\r\n\r\n var thisForm = $(this).parents(\".js-enquiry-form\");\r\n\r\n $dobErrorRequiredContainer = $(thisForm).find('.js-date-required-concatenate');\r\n $dobContainer = $(thisForm).find('.enquiry-form__tabs__content__inner__container__element--dob--required');\r\n\r\n var day = parseInt($(thisForm).find(\".js-dob-day-required\").val(), 10);\r\n var month = parseInt($(thisForm).find(\".js-dob-month-required\").val(), 10);\r\n var year = parseInt($(thisForm).find(\".js-dob-year-required\").val(), 10);\r\n\r\n if (isNaN(day) || isNaN(month) || isNaN(year)) {\r\n\r\n $dobErrorRequiredContainer.text('Please complete this information.').show();\r\n $dobContainer.addClass('enquiry-form__tabs__content__inner__container__element--error');\r\n\r\n\r\n } else {\r\n $dobErrorRequiredContainer.hide();\r\n $dobContainer.removeClass('enquiry-form__tabs__content__inner__container__element--error');\r\n\r\n }\r\n\r\n });\r\n\r\n var $form = $(\".js-enquiry-form\");\r\n\r\n $form.find(\".js-dob-day, .js-dob-month, .js-dob-year\").on(\"change\", function () {\r\n\r\n var thisForm = $(this).parents(\".js-enquiry-form\");\r\n\r\n $dobErrorRequiredContainer = $(thisForm).find('.js-date-required-concatenate');\r\n $dobContainer = $(thisForm).find('.enquiry-form__tabs__content__inner__container__element--dob--required');\r\n\r\n var day = parseInt($(thisForm).find(\".js-dob-day\").val(), 10);\r\n var month = parseInt($(thisForm).find(\".js-dob-month\").val(), 10);\r\n var year = parseInt($(thisForm).find(\".js-dob-year\").val(), 10);\r\n\r\n if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\r\n $(thisForm).find(\".js-dob-concatenate\").val(day + \"/\" + month + \"/\" + year);\r\n }\r\n\r\n if (isNaN(day) || isNaN(month) || isNaN(year)) {\r\n\r\n $dobErrorRequiredContainer.text('Please complete this information.').show();\r\n $dobContainer.addClass('enquiry-form__tabs__content__inner__container__element--error');\r\n\r\n\r\n } else {\r\n $dobErrorRequiredContainer.hide();\r\n $dobContainer.removeClass('enquiry-form__tabs__content__inner__container__element--error');\r\n\r\n }\r\n });\r\n\r\n // new appointment for verify eror on select field\r\n $form.find(\".js-dob-day-required, .js-dob-month-required, .js-dob-year-required\").on(\"change\", function () {\r\n\r\n var thisForm = $(this).parents(\".js-enquiry-form\");\r\n\r\n $dobErrorRequiredContainer = $(thisForm).find('.js-date-required-concatenate');\r\n $dobContainer = $(thisForm).find('.enquiry-form__tabs__content__inner__container__element--dob--required');\r\n\r\n var day = parseInt($(thisForm).find(\".js-dob-day-required\").val(), 10);\r\n var month = parseInt($(thisForm).find(\".js-dob-month-required\").val(), 10);\r\n var year = parseInt($(thisForm).find(\".js-dob-year-required\").val(), 10);\r\n\r\n if (isNaN(day) || isNaN(month) || isNaN(year)) {\r\n\r\n $dobErrorRequiredContainer.text('Please complete this information.').show();\r\n $dobContainer.addClass('enquiry-form__tabs__content__inner__container__element--error');\r\n\r\n\r\n } else {\r\n $dobErrorRequiredContainer.hide();\r\n $dobContainer.removeClass('enquiry-form__tabs__content__inner__container__element--error');\r\n\r\n }\r\n\r\n\r\n });\r\n\r\n window.Parsley.addValidator('date', {\r\n requirementType: 'string',\r\n validateString: function (value, requirements, parsleyInstance) {\r\n\r\n var $row = $(parsleyInstance.$element).parents(\".js-enquiry-form__tabs__content__inner__container__element\");\r\n\r\n var day = parseInt($row.find(\".js-dob-day\").val(), 10);\r\n var month = parseInt($row.find(\".js-dob-month\").val(), 10);\r\n var year = parseInt($row.find(\".js-dob-year\").val(), 10);\r\n\r\n if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\r\n\r\n var age = helper.age(day, month, year);\r\n\r\n return age > 17;\r\n }\r\n },\r\n messages: {\r\n en: 'You must be over 18 to submit an enquiry',\r\n }\r\n });\r\n },\r\n emailValidator: function () {\r\n\r\n window.Parsley.addValidator('customequalto', {\r\n requirementType: 'string',\r\n\r\n validateString: function (value, elem, parsleyInstance) {\r\n\r\n $(elem).on(\"keyup\", _.debounce(function () {\r\n parsleyInstance.validate();\r\n }, 100));\r\n\r\n if (value.length > 0 && $(elem).length > 0) {\r\n return value.toLowerCase() === $(elem).val().toLowerCase();\r\n }\r\n return false;\r\n }\r\n });\r\n },\r\n removeLastComma: function (str) {\r\n return str.replace(/,\\s*$/, \"\")\r\n },\r\n validateAndRecaptchaPassForm: function (thisForm) {\r\n\r\n var that = this;\r\n\r\n var siteKey = document.getElementById(\"recaptchKey\").value;\r\n var $spinner = $(thisForm).find('.enquiry-form__button-container__spinner');\r\n\r\n var form = $(thisForm).parsley(that.getParsleyConfig());\r\n that.bindErrorRecorder();\r\n\r\n if (form.validate()) {\r\n // Validate recaptcha\r\n\r\n grecaptcha.ready(function () {\r\n grecaptcha.execute(siteKey, { action: 'enquiryform' }).then(function (token) {\r\n $('[name=\"g-recaptcha-response\"]').val(token);\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: apilocation + 'EnquiryFormApi/VerifyRecaptcha',\r\n data: token,\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\"\r\n }).done(function (data) {\r\n\r\n if (data) {\r\n console.log('Validated ready to submit enquiry');\r\n $spinner.addClass('enquiry-form__button-container__spinner--on');\r\n that.setupEnquiryFields(thisForm);\r\n return true;\r\n }\r\n else {\r\n console.log('Verify recaptcha failed');\r\n $spinner.removeClass('enquiry-form__button-container__spinner--on');\r\n $(\"#recaptchaError\").text(\"There was an issue submitting this form, please try again later.\");\r\n $(\"#recaptchaError\").show();\r\n return false;\r\n }\r\n }).fail(function (xhr, status, error) {\r\n var errorMessage = xhr.status + ': ' + xhr.statusText\r\n console.log('Failed to submit Form error = .' + errorMessage);\r\n $spinner.removeClass('enquiry-form__button-container__spinner--on');\r\n $(\"#recaptchaError\").text(\"There was an issue submitting this form, please try again later.\");\r\n $(\"#recaptchaError\").show();\r\n return false;\r\n });\r\n });\r\n });\r\n\r\n }\r\n },\r\n enquiryMobileCTAOverCtrl: function () {\r\n var el1 = $(\".js-call-to-action__clickToCall\");\r\n var el2 = $(\".js-inpageEnquiryForm\");\r\n\r\n if (el1.length > 0 && el2.length > 0) {\r\n $(window).on('scroll', function () {\r\n if ($(\".js-inpageEnquiryForm\").visible(true)) {\r\n $(\".js-call-to-action__clickToCall\").addClass(\"is-hidden\");\r\n }\r\n else {\r\n $(\".js-call-to-action__clickToCall\").removeClass(\"is-hidden\");\r\n }\r\n });\r\n }\r\n },\r\n setupEnquiryFields: function (thisForm) {\r\n\r\n var $submitButton = $(thisForm).find(\".js-enquiry-form__submit\");\r\n var $spinner = $(thisForm).find('.enquiry-form__button-container__spinner');\r\n\r\n var selectedHospital = $(thisForm).find('#select-hospital');\r\n var selectedHospitalValue = selectedHospital.val();\r\n\r\n var enquirySource = $(thisForm).find('#hidden-enquiry-source').text();\r\n var enquiryType = $(thisForm).find('#enquiry-type option:selected').text();\r\n var fundingType = $(thisForm).find('#funding-type option:selected').text();\r\n var enquiry = $(thisForm).find('#enquiry').val();\r\n var title = $(thisForm).find('#title').val();\r\n var firstName = $(thisForm).find('#first-name').val();\r\n var surname = $(thisForm).find('#surname').val();\r\n var dobDay = $(thisForm).find(\".js-dob-day\").val() ? parseInt($(thisForm).find(\".js-dob-day\").val(), 10) : false;\r\n var dobMonth = $(thisForm).find(\".js-dob-month\").val() ? parseInt($(thisForm).find(\".js-dob-month\").val(), 10) : false;\r\n var dobYear = $(thisForm).find(\".js-dob-year\").val() ? parseInt($(thisForm).find(\".js-dob-year\").val(), 10) : false;\r\n var dob = (dobDay && dobMonth && dobYear) ? dobYear + \"/\" + dobMonth + \"/\" + dobDay : 'Date of birth not set';\r\n var postcodeRaw = $(thisForm).find('#postcode').val();\r\n var postcode = postcodeRaw;\r\n var emailAddress = $(thisForm).find('#enquiry-email').val(); \r\n var emailAddressConfirm = $(thisForm).find('#enquiry-email-confirm').val();\r\n var phoneNum = $(thisForm).find('#phone-number').val();\r\n var enquiryFormOptin = $(thisForm).find('.enquiry-form__tabs__content__inner__container__element__checkbox').is(':checked');\r\n var nodeId = $(thisForm).find('#hidden-node-id').text();\r\n var isEnquiry = $(thisForm).find('#hidden-is-enquiry').text();\r\n var nearestHospitalName = '';\r\n var nearestHospitalId = '';\r\n var timerId = 'enquiry-form-thankyou-timer';\r\n var timer = $(thisForm).find('#' + timerId);\r\n var age = '';\r\n var partialPostCode = postcode;\r\n var floodLightCategory = 'mkenqry';\r\n var floodLightEnquiryString = 'u7=' + enquiryType;\r\n var hospitalNotFoundMessage = 'Your nearest hospital could not be found with the postcode provided. Please check your postcode or select a hospital manually.';\r\n var optinEmail = $(thisForm).find(\"input[name='optinEmail']\").prop(\"checked\");\r\n var optinSMS = $(thisForm).find(\"input[name='optinSms']\").prop(\"checked\");\r\n var optinPrivacy = $(thisForm).find(\"input[name='optinPrivacy']\").prop(\"checked\");\r\n var preferredConsultant = $(thisForm).find('#preferred-consultant').val();\r\n var selectedSpeciality = $(thisForm).find('#select-speciality');\r\n var selectedSpecialityValue = selectedSpeciality.val();\r\n var preferredDate = $(thisForm).find('#date').val();\r\n var selectedTime = $(thisForm).find('#select-time');\r\n var selectedTimeValue = selectedTime.val();\r\n var isAppointment = $(thisForm).find('#hidden-is-appointment').text();\r\n var enquiryBestTimeToContact = $(thisForm).find('#enquiry-besttime-to-contact option:selected').text();\r\n\r\n try {\r\n if (dob !== 'Date of birth not set') {\r\n age = ~~((Date.now() - +new Date(dob)) / (31557600000));\r\n } else {\r\n age = 'Date of birth not set';\r\n }\r\n\r\n } catch (e) {\r\n }\r\n\r\n try {\r\n var match = postcodeRaw.match(/(([A-Za-z]{1,2}[0-9]{1,2})(|[ 0-9]))(?=[0-9][A-Za-z])/); //Get first part of UK postcode\r\n partialPostCode = $.trim(match[0]);\r\n if (!partialPostCode) partialPostCode = postcode;\r\n } catch (e) {\r\n }\r\n\r\n if (isEnquiry === 'False') {\r\n emailAddress = $(thisForm).find('#callback-email').val();\r\n emailAddressConfirm = $(thisForm).find('#callback-email-confirm').val();\r\n timerId = 'callback-form-thankyou-timer';\r\n floodLightCategory = 'rqtcllbk';\r\n floodLightEnquiryString = 'u8=' + enquiryType;\r\n }\r\n\r\n try {\r\n floodLightEnquiryString = encodeURI(floodLightEnquiryString);\r\n } catch (e) {\r\n }\r\n\r\n var marketingOptin = \"\";\r\n if (optinEmail) {\r\n marketingOptin += \"email,\"\r\n }\r\n if (optinSMS) {\r\n marketingOptin += \"sms,\"\r\n }\r\n\r\n var enquiryFields = {\r\n \"enquirySource\": enquirySource,\r\n \"enquiryType\": enquiryType,\r\n \"fundingType\": fundingType,\r\n \"enquiry\": enquiry,\r\n \"title\": title,\r\n \"firstName\": firstName,\r\n \"surname\": surname,\r\n \"dob\": dob,\r\n \"postcode\": postcode,\r\n \"emailAddress\": emailAddress,\r\n \"emailAddressConfirm\": emailAddressConfirm,\r\n \"phoneNum\": phoneNum,\r\n \"enquiryFormOptin\": enquiryFormOptin,\r\n \"nodeId\": nodeId,\r\n \"isEnquiry\": isEnquiry,\r\n \"nearestHospitalName\": nearestHospitalName,\r\n \"nearestHospitalId\": nearestHospitalId,\r\n \"perferredConsultant\": preferredConsultant,\r\n \"perferredSpeciality\": selectedSpecialityValue,\r\n \"perferredDate\": preferredDate,\r\n \"perferredTime\": selectedTimeValue,\r\n \"isAppointment\": isAppointment,\r\n \"isEvent\": false,\r\n \"enquiryFormOptinSMS\": optinSMS,\r\n \"enquiryFormOptinEmail\": optinEmail,\r\n \"enquiryFormOptinPrivacy\": optinPrivacy,\r\n \"enquiryBestTimeToContact\": enquiryBestTimeToContact,\r\n \"marketingOptIn\": this.removeLastComma(marketingOptin)\r\n };\r\n\r\n if (selectedHospitalValue === 'nearest') { // Get nearest hospital\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: apilocation + 'EnquiryFormApi/NearestHospital',\r\n data: JSON.stringify({ \"postcode\": postcode }),\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\"\r\n }).done(function (data) {\r\n\r\n if (data.length > 0) {\r\n enquiryFields.nearestHospitalName = data[0];\r\n enquiryFields.nearestHospitalId = data[1];\r\n postForm(enquiryFields, thisForm, age, $submitButton, floodLightCategory, partialPostCode, floodLightEnquiryString, $spinner);\r\n\r\n } else { // Error: Hospital not found\r\n\r\n $submitButton.prop('disabled', false);\r\n $spinner.removeClass('enquiry-form__button-container__spinner--on');\r\n\r\n var $postcodeDiv = $('.enquiry-form__tabs__content__inner__container__element--postcode');\r\n var $selectHospitalDiv = $('.js-enquiry-form__tabs__content__inner__container__element-select-hospital');\r\n trackingModule.gaTrackEvent(\"Nearest hospital not found\", \"Submit\", undefined, undefined, true);\r\n\r\n if ($postcodeDiv.length > 0) {\r\n $postcodeDiv.addClass('enquiry-form__tabs__content__inner__container__element--error');\r\n }\r\n\r\n if ($selectHospitalDiv.length > 0) {\r\n $selectHospitalDiv.addClass('enquiry-form__tabs__content__inner__container__element--error');\r\n $selectHospitalDiv.find('.error').html(hospitalNotFoundMessage);\r\n }\r\n }\r\n\r\n }).always(function () {\r\n });\r\n\r\n } else { //Hospital manually selected by user\r\n enquiryFields.nearestHospitalName = $(selectedHospital).find('option:selected').text();\r\n enquiryFields.nearestHospitalId = selectedHospitalValue;\r\n postForm(enquiryFields, thisForm, age, $submitButton, floodLightCategory, partialPostCode, floodLightEnquiryString, $spinner);\r\n }\r\n }\r\n\r\n};\r\n\r\nvar postRequestForm = function (requestFields, thisForm, $submitButton, $spinner) {\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: apilocation + 'EnquiryFormApi/SendSubjectAccessRequest',\r\n data: JSON.stringify(requestFields),\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\"\r\n }).done(function (data) {\r\n\r\n var floodLightCategory = 'mkrequest';\r\n var enquiryFields = {};\r\n enquiryFields.enquiryType = '';\r\n enquiryFields.fundingType = '';\r\n enquiryFields.marketingOptIn = '';\r\n enquiryFields.nearestHospitalName = '';\r\n\r\n postToThankYou(false, requestFields.hospitalNodeId, requestFields.dob, floodLightCategory, requestFields.postcode, \"\", \"\", enquiryFields);\r\n });\r\n\r\n};\r\n\r\nvar postEventForm = function (enquiryFields, thisForm, age, $submitButton, $spinner) {\r\n // Show the spinner;\r\n $.ajax({\r\n type: \"POST\",\r\n url: apilocation + 'EnquiryFormApi/SendEventEnquiry',\r\n data: JSON.stringify(enquiryFields),\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\"\r\n }).done(function (data) {\r\n //if (data.length > 0 && (data.length != 2 && data[0] != \"WebId\")) {\r\n if (data.length > 0 && data[0] != \"WebId\") {\r\n var errorString = \"\";\r\n try {\r\n errorString = JSON.stringify(data).replace('{', '').replace('}', '');\r\n } catch (e) {\r\n }\r\n\r\n if (enquiryFields.isEvent === 'True') {\r\n gaHelper.trackEvent(\"Event Booking\", \"Server Side Error\", errorString, undefined, true);\r\n }\r\n }\r\n else {\r\n $(\".event-booking-form__content\").removeClass(\"is-on\");\r\n $(\".thank-you-event-booking-form__content\").addClass(\"is-on\");\r\n\r\n setTimeout(function () {\r\n $('#event-booking-form')[0].reset();\r\n $(\".thank-you-event-booking-form__content\").removeClass(\"is-on\");\r\n $(\".event-booking-form__content\").addClass(\"is-on\");\r\n }, 4000);\r\n\r\n gaHelper.trackEvent(\"Event Booking\", \"Successful Submit\", \"Current URL: \" + window.location.href + \", Enquiry type: Event\" + \", Age: \" + age + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin, undefined, false);\r\n }\r\n\r\n $submitButton.prop('disabled', false);\r\n $spinner.removeClass('event-booking-form__button-container__spinner--on');\r\n\r\n }).fail(function (data) {\r\n\r\n gaHelper.trackEvent(\"Event Booking\", \"Failed to Submit\", \"Current URL: \" + window.location.href + \", Enquiry type: Event\" + \", Age: \" + age + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin, undefined, false);\r\n\r\n $submitButton.prop('disabled', false);\r\n $spinner.removeClass('event-booking-form__button-container__spinner--on');\r\n });\r\n};\r\n\r\nvar recaptchaExpired = function () {\r\n grecaptcha.reset();\r\n var $submitButton = $(thisForm).find(\".js-enquiry-form__submit\");\r\n $submitButton.prop('disabled', false);\r\n}\r\n\r\nvar encryptString = function (content) {\r\n\r\n if (content === undefined || content === \"\" || content === null) {\r\n return \"\";\r\n }\r\n\r\n return sha256(content);\r\n}\r\n\r\nvar postForm = function (enquiryFields, thisForm, age, $submitButton, floodLightCategory, partialPostCode, floodLightEnquiryString, $spinner) { \r\n\r\n $submitButton.prop('disabled', true);\r\n\r\n function addSubmissionToDataLayer(dataLayerFields, webId) {\r\n\r\n return new Promise(function (resolve, reject) {\r\n\r\n dataLayer.push({\r\n \"event\": \"enquire_submission\",\r\n \"enquiry_type\": dataLayerFields.enquiryType ? dataLayerFields.enquiryType.toLowerCase() : \"\",\r\n \"marketing_opt_in\": dataLayerFields.marketingOptIn ? dataLayerFields.marketingOptIn.toLowerCase() : \"\",\r\n \"web_id\": webId ? webId.toLowerCase() : null,\r\n \"hospital\": dataLayerFields.nearestHospitalName ? dataLayerFields.nearestHospitalName.toLowerCase() : \"\",\r\n \"status\": \"success\",\r\n \"funding_type\": dataLayerFields.fundingType ? dataLayerFields.fundingType.toLowerCase() : \"\",\r\n \"user_provided_data\": {\r\n \"email_address\": dataLayerFields.emailAddress ? encryptString(dataLayerFields.emailAddress.toLowerCase()) : \"\",\r\n \"phone_number\": dataLayerFields.phoneNum ? encryptString(dataLayerFields.phoneNum.toLowerCase()) : \"\",\r\n \"address\": {\r\n \"first_name\": dataLayerFields.firstName ? encryptString(dataLayerFields.firstName.toLowerCase()) : \"\",\r\n \"last_name\": dataLayerFields.surname ? encryptString(dataLayerFields.surname.toLowerCase()) : \"\",\r\n \"postal_code\": dataLayerFields.postcode ? encryptString(dataLayerFields.postcode.toLowerCase()) : \"\"\r\n }\r\n }\r\n });\r\n\r\n resolve();\r\n }).then(function (result) {\r\n console.log(\"Added enquire_submission\");\r\n });\r\n }\r\n\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: apilocation + 'EnquiryFormApi/SendEnquiry',\r\n data: JSON.stringify(enquiryFields),\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\"\r\n }).done(function (data) {\r\n\r\n var dataLayer = window.dataLayer || [];\r\n\r\n var isInPageEnquiry = $(\"#in-page-enquiry\").val();\r\n\r\n $(\"#inpageEnquiryForm\").hide();\r\n $(\"#inpageEnquiryThankyou\").show();\r\n\r\n var hospital = enquiryFields.nearestHospitalName;\r\n\r\n //ga('send', 'event', { 'dimension5': hospital });\r\n\r\n // Inpage Enquiry Form\r\n if (data.length > 0 && (data.length != 2 && data[0] != \"WebId\")) {\r\n var errorString = \"\";\r\n try {\r\n errorString = JSON.stringify(data2).replace('{', '').replace('}', '');\r\n } catch(e) { \r\n }\r\n\r\n if (enquiryFields.isEnquiry === 'True') {\r\n gaHelper.trackEvent(\"Enquiry\", \"Server Side Error\", errorString, undefined, true);\r\n } else {\r\n gaHelper.trackEvent(\"Call back\", \"Server Side Error\", errorString, undefined, true);\r\n }\r\n \r\n\r\n } else { // Main enquiry form which posts to thank you page.\r\n\r\n var webId = data[1];\r\n\r\n if (isInPageEnquiry == \"true\") {\r\n //ga('send', 'event', { 'dimension4': webId });\r\n dataLayer.push({ 'webId': webId });\r\n }\r\n\r\n // Post to Thank you page.\r\n var dataLayerFields = enquiryFields;\r\n addSubmissionToDataLayer(dataLayerFields, webId).then(function (result) {\r\n\r\n console.log('posting to thank you page');\r\n\r\n postToThankYou(enquiryFields.isEnquiry, enquiryFields.nearestHospitalId, enquiryFields.dob, floodLightCategory, partialPostCode, floodLightEnquiryString, webId, enquiryFields);\r\n\r\n });\r\n\r\n if (enquiryFields.isEnquiry === 'True') {\r\n\r\n // SW-0655 debug, does the url contain query string params ? if so we want to strip them off and add browser info to the GA event\r\n var browserInfo = '';\r\n var enquiryFormUrl = window.location.href;\r\n var urlHasQueryString = enquiryFormUrl.indexOf('?') > -1;\r\n\r\n if (urlHasQueryString) {\r\n enquiryFormUrl = enquiryFormUrl.split('?')[0];\r\n browserInfo = navigator.appCodeName + '|' + navigator.appName + '|' + navigator.appVersion + '|' + navigator.cookieEnabled + '|' + navigator.language + '|' + navigator.onLine + '|' + navigator.platform + '|' + navigator.userAgent;\r\n }\r\n\r\n //gaHelper.trackEvent(\"Enquiry\", \"Successful Submit\", \"Current URL: \" + window.location.href + \", Enquiry type: \" + enquiryFields.enquiryType + \", Title: \" + enquiryFields.title + \", Age: \" + age + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin + \", WebId:\" + webId + \", Contact:\" + enquiryFields.enquiryBestTimeToContact , undefined, false);\r\n //gaHelper.trackEvent(\"Enquiry\", \"Successful Submit\", \"Current URL: \" + window.location.href + \", Enquiry type: \" + enquiryFields.enquiryType + \", Title: \" + enquiryFields.title + \", Age: \" + age + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin + \", WebId:\" + webId, undefined, false);\r\n // gaHelper.trackEvent(\"Enquiry\", \"Successful Submit\", \"Current URL: \" + enquiryFormUrl + \", Enquiry type: \" + enquiryFields.enquiryType + \", Funding Type: \" + enquiryFields.fundingType + \", Title: \" + enquiryFields.title + \", Age: \" + age + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin + \", WebId:\" + webId + \",BrowserInfo:\" + browserInfo, undefined, false);\r\n // gaHelper.trackEvent(\"Enquiry\", \"Successful Submit\", \"Current URL: \" + enquiryFormUrl + \", Enquiry type: \" + enquiryFields.enquiryType + \", Funding Type: \" + enquiryFields.fundingType + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin + \", WebId:\" + webId, undefined, false);\r\n } else {\r\n //gaHelper.trackEvent(\"Call back\", \"Successful Submit\", \"Current URL: \" + window.location.href + \", Enquiry type: \" + enquiryFields.enquiryType + \", Title: \" + enquiryFields.title + \", Age: \" + age + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin + \", WebId:\" + webId + \", Contact:\" + enquiryFields.enquiryBestTimeToContact, undefined, false);\r\n gaHelper.trackEvent(\"Call back\", \"Successful Submit\", \"Current URL: \" + window.location.href + \", Enquiry type: \" + enquiryFields.enquiryType + \", Funding Type: \" + enquiryFields.fundingType + \", Title: \" + enquiryFields.title + \", Age: \" + age + \", Marketing opt in: \" + enquiryFields.enquiryFormOptin + \", WebId:\" + webId, undefined, false);\r\n }\r\n\r\n\r\n //var axel = Math.random() + \"\";\r\n //var a = axel * 10000000000000;\r\n //var device = \"Desktop\";\r\n //var isMobile = window.matchMedia(\"only screen and (max-width: 760px)\");\r\n //if (isMobile.matches) {\r\n // device = \"Mobile\";\r\n //} \r\n \r\n //$('body').append(''); \r\n\r\n\r\n var floodLightThankYouAttributes = document.getElementById('js-floodlight-thankyou-attributes');\r\n var device = \"Desktop\";\r\n var isMobile = window.matchMedia(\"only screen and (max-width: 760px)\");\r\n if (isMobile.matches) {\r\n device = \"Mobile\";\r\n }\r\n //var hospital = encodeURIComponent(document.getElementsByTagName(\"body\")[0].getAttribute('data-hospital-name'));\r\n\r\n //var hospital = hospital; // encodeURIComponent($(\"#select-hospital option:selected\").text());\r\n var treatment = encodeURIComponent(document.getElementsByTagName(\"body\")[0].getAttribute('data-treatment-name'));\r\n var dob = enquiryFields.dob;\r\n var partialPostcode = partialPostCode;\r\n var webId = webId;\r\n\r\n var iframeStr = '';\r\n\r\n // $('body').append(iframeStr);\r\n\r\n \r\n }\r\n });\r\n};\r\n\r\nvar postToThankYou = function (isEnquiry, nearestHospitalId, dob, floodLightCategory, partialPostCode, floodLightEnquiryString, webId, enquiryFields) {\r\n\r\n var thankYouPostForm = $(\"#thankYouPost\");\r\n\r\n thankYouPostForm.find(\"#isEnquiry\").val(isEnquiry);\r\n thankYouPostForm.find(\"#nearestHospitalId\").val(nearestHospitalId);\r\n thankYouPostForm.find(\"#dob\").val(dob);\r\n thankYouPostForm.find(\"#partialPostcode\").val(partialPostCode);\r\n thankYouPostForm.find(\"#floodLightEnquiryString\").val(floodLightEnquiryString);\r\n thankYouPostForm.find(\"#floodLightCategory\").val(floodLightCategory);\r\n thankYouPostForm.find(\"#webId\").val(webId);\r\n\r\n thankYouPostForm.find(\"#enquiryType\").val(enquiryFields.enquiryType);\r\n thankYouPostForm.find(\"#fundingType\").val(enquiryFields.fundingType);\r\n thankYouPostForm.find(\"#marketingOptIn\").val(enquiryFields.marketingOptIn);\r\n thankYouPostForm.find(\"#nearestHospitalName\").val(enquiryFields.nearestHospitalName);\r\n thankYouPostForm.find(\"#emailAddress\").val(enquiryFields.emailAddress);\r\n\r\n thankYouPostForm.submit();\r\n};\r\n\r\nvar siteNavMobile = {\r\n init: function () { \r\n\r\n var $navElements = $(\".js-site-nav-mobile, .js-site-nav-mobile-toggle\");\r\n var $contactElements = $(\".js-contact-mobile-toggle, .js-contact-mobile\");\r\n var $expandableNavItems = $(\".site-nav-mobile__l1 ul li\").has(\".site-nav-mobile__l2 ul li\").children('a');\r\n var $searchElements = $(\".js-site-search-mobile-toggle, .js-site-search-mobile\");\r\n\r\n var backgroundImg = $(\".hero-home__image--mobile\").attr(\"style\");\r\n if (backgroundImg === undefined) {\r\n }\r\n else {\r\n var url = backgroundImg.replace(/(url\\(|\\)|'|\")/gi, '');\r\n url = url.trim().replace(\"background-image:\", \"\");\r\n if (url.length > 0) {\r\n $(\".js-site-header-mobile\").addClass('remove-background');\r\n }\r\n }\r\n\r\n $expandableNavItems.addClass('hasItems');\r\n\r\n\r\n $($expandableNavItems).on(\"click\", function () {\r\n $(this).toggleClass(\"is-on\");\r\n //$expandableNavItems.toggleClass('is-on');\r\n });\r\n\r\n // Burger Menu Clicked.\r\n $(\".js-site-nav-mobile-toggle\").on(\"click\", function (e) {\r\n\r\n e.preventDefault();\t\t\r\n\r\n $searchElements.removeClass(\"is-on\");\r\n $contactElements.removeClass(\"is-on\");\r\n\r\n if ($navElements.hasClass(\"is-on\")) {\r\n $navElements.removeClass(\"is-on\");\r\n $(\"body\").removeAttr(\"style\");\r\n } else { \r\n $navElements.addClass(\"is-on\");\r\n $contactElements.removeClass(\"is-on\");\r\n $(\"body\").attr(\"style\", \"position:fixed\");\r\n }\r\n });\r\n\r\n // Search Menu Clicked\r\n $(\".js-site-search-mobile-toggle\").on(\"click\", function (e) {\r\n\r\n e.preventDefault();\r\n\r\n $contactElements.removeClass(\"is-on\");\r\n $navElements.removeClass(\"is-on\");\r\n\r\n if ($searchElements.hasClass(\"is-on\")) {\r\n $searchElements.removeClass(\"is-on\");\r\n } else {\r\n $searchElements.addClass(\"is-on\");\r\n }\r\n });\r\n \r\n\r\n // Contact Phone Icon clicked.\r\n $(\".js-contact-mobile-toggle\").on(\"click\", function (e) {\r\n\r\n e.preventDefault();\r\n\r\n $searchElements.removeClass(\"is-on\");\r\n $navElements.removeClass(\"is-on\");\r\n\r\n if ($contactElements.hasClass(\"is-on\")) {\r\n $contactElements.removeClass(\"is-on\"); \r\n\r\n $(\".js-contact-mobile-toggle\").removeClass(\"is-on\");\r\n\r\n } else { \r\n $contactElements.addClass(\"is-on\");\r\n $navElements.removeClass(\"is-on\");\r\n\r\n $(\".js-contact-mobile-toggle\").addClass(\"is-on\");\r\n }\r\n });\r\n\r\n // old mega menu\r\n $(\".site-nav-mobile__l2\").siblings(\"a\").on(\"click\", function (e) {\r\n var $item = $(this).siblings(\".site-nav-mobile__l2\");\r\n\r\n if ($item.find(\".site-nav-mobile__list\").children().length > 0) {\r\n e.preventDefault();\r\n if($item.hasClass(\"is-on\")){\r\n $(this).siblings(\".site-nav-mobile__l2\").removeClass(\"is-on\");\r\n } else { \r\n $(this).siblings(\".site-nav-mobile__l2\").addClass(\"is-on\");\r\n }\r\n }\t\t\t\r\n })\r\n\r\n // new mega menu\r\n $(\".site-nav-mobile__l2\").siblings(\"a\").on(\"click\", function (e) {\r\n var $item = $(this).siblings(\".site-nav-mobile__l2\");\r\n\r\n if ($item.find(\".mega-menu__items\").children().length > 0) {\r\n e.preventDefault();\r\n if($item.hasClass(\"is-on\")){\r\n $(this).siblings(\".site-nav-mobile__l2\").removeClass(\"is-on\");\r\n } else { \r\n $(this).siblings(\".site-nav-mobile__l2\").addClass(\"is-on\");\r\n }\r\n }\t\t\t\r\n })\r\n }\r\n};\r\n\r\nvar callToAction = {\r\n\r\n config: {\r\n ctaSelector: \".js-call-to-action--desktop\",\r\n $ctaHandle : $(\".js-call-to-action__handle\")\r\n },\r\n\r\n init: function () {\r\n\r\n var c = this.config;\r\n\r\n if (sessionStorage.getItem('isExistingSpireSession') == null) {\r\n //cookies.writeCookie('ctaClosed', 0, 10); \r\n try{\r\n sessionStorage.setItem('isExistingSpireSession', 1);\r\n } catch (e) {\r\n // console.log(e);\r\n }\t\t \r\n }\r\n\r\n var $cta = $(this).parent(c.ctaSelector);\r\n\r\n //if ($(\"body\").find(\"section\").hasClass(\"enquiry-form\")) {\r\n // $cta.removeClass(\"is-on\");\r\n // //cookies.writeCookie('ctaClosed', 1, 10);\r\n //} else {\r\n // $cta.addClass(\"is-on\");\r\n // //cookies.writeCookie('ctaClosed', 0, 10);\r\n //}\t\t\r\n\r\n //callToAction.toggleVisibility();\r\n\r\n c.$ctaHandle.parent(c.ctaSelector).removeClass(\"call-to-action--desktop--initial-hide\"); //Class for initial hide of element to prevent flash of content when ctaClosed cookie is set, before JS kicks in\r\n\r\n\r\n c.$ctaHandle.on(\"click\", function (e) {\r\n e.preventDefault();\r\n var $cta = $(this).parent(c.ctaSelector);\r\n\r\n if ( $cta.hasClass(\"is-on\") || ($(\"body\").hasClass(\"enquiry-form\")) ) {\r\n $cta.removeClass(\"is-on\");\r\n //cookies.writeCookie('ctaClosed', 1, 10);\r\n } else {\r\n $cta.addClass(\"is-on\");\r\n //cookies.writeCookie('ctaClosed', 0, 10);\r\n }\r\n });\r\n\r\n //var toggleCtaVisibility = helper.debounce(function(element) {\r\n // callToAction.toggleVisibility();\r\n //},250);\r\n \r\n //window.addEventListener('resize', toggleCtaVisibility);\r\n },\r\n\r\n //toggleVisibility: function() {\r\n\r\n // var c = this.config,\r\n // $window = $(window),\r\n // $cta = c.$ctaHandle.parent(c.ctaSelector);\r\n\r\n // if ( \r\n // //SP-840: Stop content being obstructed at certain resolutions \r\n // //(($window.height() < 1100 && $window.width() < 1550 && $window.width() > 1150 || $window.width() < 1250) && (sessionStorage.getItem('isExistingSpireSession') == null || cookies.readCookie('ctaClosed') != 0)) \r\n // //|| cookies.readCookie('ctaClosed') && cookies.readCookie('ctaClosed') != 0) { \r\n\r\n // ($window.height() < 1100 && $window.width() < 1550 && $window.width() > 1150 || $window.width() < 1250) && (sessionStorage.getItem('isExistingSpireSession') == null)) { \r\n // $cta.removeClass(\"is-on\");\r\n // } else {\r\n // $cta.addClass(\"is-on\");\r\n // }\r\n //}\t\r\n};\r\n\r\nvar searchMobileNav = {\r\n\r\n config: {\r\n $nav: $(\".js-pagination__categories__nav-mobile\"),\r\n select: $(\".js-pagination__categories__nav-mobile\").find('.select-wrapper__select')\r\n },\r\n\r\n init: function() {\r\n this.redirect();\r\n },\r\n\r\n redirect: function() {\r\n var $select = this.config.select;\r\n\r\n $select.on('change', function () {\r\n var url = $(this).find(':selected').data(\"url\");\r\n window.location = url;\r\n });\t\r\n }\r\n};\r\n\r\nvar consultantNav = {\r\n config: {\r\n nav: $(\".js-consultant-content__nav\"),\r\n navMobile: $(\".js-consultant-content__nav-mobile\"),\r\n content: $(\".js-consultant-content\"),\r\n header: $(\".js-site-header\").find(\".site-header__fixed\")\r\n },\r\n init: function () {\r\n var config = this.config,\r\n that = this;\r\n\r\n that.setDimensions();\r\n\r\n $(window).on(\"resize\", function () {\r\n that.setDimensions();\r\n });\r\n\r\n config.nav.waypoint({\r\n handler: function(direction) {\r\n if(direction === \"down\"){\r\n $(this.element).addClass(\"is-sticky\")\r\n .find(\".js-consultant-content__nav__list\").css({\r\n top: config.header.height() + 40\r\n });\r\n\r\n } else if(direction === \"up\"){\r\n $(this.element).removeClass(\"is-sticky\");\t\t\t\t\r\n }\r\n },\r\n offset: function () {\r\n return config.header.height();\r\n }\r\n });\r\n\r\n config.content.waypoint({\r\n handler: function (direction) {\r\n if(direction === \"down\"){\r\n config.nav.addClass(\"is-stuck-to-bottom\");\r\n } else if(direction === \"up\"){\r\n config.nav.removeClass(\"is-stuck-to-bottom\");\r\n }\r\n },\r\n offset: function () {\r\n return (400 - this.element.clientHeight);\r\n }\r\n });\r\n\r\n config.nav.on(\"click\", \"a\", function (e) {\r\n e.preventDefault();\r\n id = $(this).attr(\"href\");\r\n $(\"body, html\").animate({\"scrollTop\": $(id).offset().top - 130}, 500);\r\n });\r\n\r\n config.navMobile.find(\"select\").on(\"change\", function (e) {\r\n e.preventDefault();\r\n id = $(this).val();\r\n\r\n if ($(id).length > 0) {\r\n $(\"body, html\").scrollTop($(id).position().top);\r\n }\t\t\t\r\n });\r\n\r\n if (config.content.find(\".consultant-content__section\").length > 0) {\r\n config.content.find(\".consultant-content__section\").waypoint({\r\n handler: function(direction) {\r\n\r\n id = '#'+this.element.id;\r\n\r\n config.nav.find(\"a.is-on\").removeClass(\"is-on\");\r\n if(direction === \"down\"){\r\n config.nav.find(\"a[href=\"+id+\"]\").addClass(\"is-on\");\r\n } else if(direction === \"up\"){\r\n config.nav.find(\"a[href=\"+id+\"]\").parents(\"li\").prev().find(\"a\").addClass(\"is-on\");\r\n }\r\n },\t\t\t\r\n offset: function () {\r\n return config.header.height() + 50;\r\n }\r\n });\r\n }\r\n },\r\n setDimensions: function () {\r\n\r\n var config = this.config,\r\n $navList = config.nav.find(\".js-consultant-content__nav__list\");\r\n\r\n if (config.nav.length > 0 && $navList.length > 0) {\t\r\n\r\n config.nav.height(\"auto\");\r\n config.nav.height(config.content.height());\r\n\r\n $navList.css({\r\n left: config.nav.position().left, \r\n width: config.nav.width(),\r\n });\r\n }\r\n }\r\n\r\n};\r\n\r\nvar topMenu = {\r\n config: {\r\n $menu: $(\".js-site-header__top-menu\")\r\n },\r\n init: function () {\r\n var c = this.config,\r\n pageFound = false;\r\n\r\n c.$menu.find(\".js-site-header__top-menu__item\").each(function () {\r\n var path = window.location.href;\r\n path = path.substring(path.indexOf(\"//\"));\r\n if (path.indexOf($(this).children(\"a\").attr(\"href\")) === 0) {\r\n $(this).addClass(\"is-selected\");\r\n pageFound = true;\r\n }\r\n });\r\n\r\n if(!pageFound){\r\n if($(\"body\").hasClass(\"body--hospital\")){\r\n // $(\".js-site-header__top-menu__item--select-hospital\").addClass(\"is-selected\");\r\n } else {\r\n // $(\".js-site-header__top-menu__item--main-website\").addClass(\"is-selected\");\r\n }\r\n }\r\n }\r\n};\r\n\r\nvar telephoneLinks = {\r\n init: function () {\r\n $(\"a[href^=tel]\").on(\"click\", function (e) {\r\n if( !(/Android|iPhone|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) ) {\r\n e.preventDefault();\r\n }\r\n });\r\n }\r\n};\r\n\r\n\r\nvar iosSelectFix = {\r\n\r\n init: function () {\r\n\r\n // iOS hack: Add an optgroup to every select in order to avoid truncating the content\r\n var windowWidth = getWindowWidth().width;\r\n var isIos = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\r\n if (isIos && windowWidth < 600) {\r\n var selects = document.querySelectorAll(\"select\");\r\n for (var i = 0; i < selects.length; i++ ){\r\n selects[i].appendChild(document.createElement(\"optgroup\"));\r\n }\r\n }\r\n }\r\n};\r\n\r\n//CONSULTANT BY SPECIALTY\r\nvar tooltip = {\r\n\r\n init: function () {\r\n\r\n $(document).bind('click', function (e) {\r\n //var $target = e.toElement || e.originalEvent.target || e.relatedTarget || e.target || function () { throw \"Failed to attach an event target!\"; }\r\n if (!$(e.target).closest('.tooltip').length && !$(e.target).closest('.toggle-tt').length) {\r\n $(\".tooltip\").removeClass('fade in active');\r\n }\r\n });\r\n \r\n $(\".toggle-tt\").on(\"click\", function () { \r\n $(\".tooltip\" ).removeClass('fade in active');\r\n $( this ).parent('li').find( \".tooltip\" ).toggleClass('fade in active');\r\n \r\n });\r\n\r\n $('[id^=\"close\"]').on('click', function(){\r\n $(this).parent(\".tooltip\").removeClass('fade in active'); \r\n });\r\n\r\n if ($('.specialityFilter').length > 0){\r\n if ($('.specialityFilter input:checked')[0].id == \"s-option\") {\r\n tooltip.select(\"specialty\"); \r\n } \r\n }\r\n\r\n $(\"#t-option\").on('click', function(){\r\n tooltip.select(\"treatment\");\r\n });\r\n\r\n $(\"#s-option\").on('click', function(){\r\n tooltip.select(\"specialty\");\r\n });\r\n },\r\n select: function (option) {\r\n if (option == \"specialty\") { \r\n $('.finder__cell.speciality').css('display', 'inline-block'); \r\n $('.finder__cell.treatment').css('display', 'none');\r\n var isTreatmentSet = helper.getQueryStringByName(\"filterByTreatment\");\r\n if (isTreatmentSet) {\r\n $(\".js-filter-dropdown__user-selection[name*='treatments']\").attr('value', '');\r\n }\r\n }\r\n\r\n else { \r\n $('.finder__cell.treatment').removeAttr('style'); \r\n $('.finder__cell.speciality').css('display', 'none');\r\n var isSpecialitySet = helper.getQueryStringByName(\"filterBySpeciality\");\r\n if (isSpecialitySet) {\r\n $(\".js-filter-dropdown__user-selection[name*='speciality']\").attr('value', '');\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\nvar datepicker = {\r\n\r\n init: function () {\r\n\r\n $('#date').attr('readonly', true);\r\n try{\r\n var disabledDays = $(\"#date\").data(\"blocked-dates\").split(\",\"); \r\n } \r\n catch(err) {\r\n //error\r\n } \r\n \r\n $('#date').datepicker({\r\n minDate : 0,\r\n dateFormat: 'yy-mm-dd', \r\n onClose: function () {\r\n $(this).parsley().validate();\r\n\r\n datepicker.checkAppointmentTimes();\r\n },\r\n beforeShowDay: function(date){\r\n var day = date.getDay();\r\n var string = jQuery.datepicker.formatDate('yy-mm-dd', date);\r\n var isDisabled = ($.inArray(string, disabledDays) != -1);\r\n \r\n return [!isDisabled];\r\n\r\n }}); \r\n },\r\n checkAppointmentTimes: function () {\r\n\r\n $(\"#select-time option[value*='Morning']\").prop('disabled', false);\r\n $(\"#select-time option[value*='Afternoon']\").prop('disabled', false);\r\n $(\"#select-time option[value*='Evening']\").prop('disabled', false);\r\n\r\n var nodeid = $('#hidden-node-id').text();\r\n var day = $('#date').val();\r\n \r\n $.ajax({\r\n type: \"POST\",\r\n url: apilocation + 'EnquiryFormApi/BlockedTimes',\r\n data: JSON.stringify({ \"NodeId\": nodeid, \"Date\" :day}),\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\"\r\n }).done(function (data) {\r\n if (data.length > 0) {\r\n if (data[0] == 'True') {\r\n $(\"#select-time option[value*='Morning']\").prop('disabled', true);\r\n }\r\n if (data[1] == 'True') {\r\n $(\"#select-time option[value*='Afternoon']\").prop('disabled', true);\r\n }\r\n if (data[2] == 'True') {\r\n $(\"#select-time option[value*='Evening']\").prop('disabled', true);\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\n\r\n\r\nvar clickTocall = {\r\n\r\n init: function () {\r\n\r\n $(\"#clickToCall .call-to-action__link--callback\").on(\"click\", function () {\r\n //gaHelper.trackEvent(\"Call to Action\", \"Mobile Call to Action phone was clicked\", $(this).html(), undefined, true);\r\n });\r\n\r\n $(\"#clickToCall .call-to-action__link--enquiry\").on(\"click\", function () {\r\n //gaHelper.trackEvent(\"Call to Action\", \"Mobile Call to Action enquiry was clicked\", 'Make enquiry', undefined, true);\r\n });\r\n\r\n } \r\n}\r\n\r\nvar callToActionFullwidth = {\r\n init: function () {\r\n $(\".js-call-to-action__phone\").on(\"click\", function () {\r\n //gaHelper.trackEvent(\"Call to Action\", \"Call to Action phone was clicked - full width\", $(this).html(), undefined, true);\r\n });\r\n\r\n $(\".js-call-to-action__submit\").on(\"click\", function () {\r\n //gaHelper.trackEvent(\"Call to Action\", \"Enquire button was clicked\", 'Make enquire - full width', undefined, true);\r\n });\r\n\r\n }\r\n}\r\n\r\nvar footerTracking = {\r\n init: function () {\r\n this.globalItems();\r\n },\r\n \r\n globalItems: function () {\r\n $(\".js-socialmedia-facebook\").on(\"click\", function () {\r\n gaHelper.trackEvent(\"Social Media Button Clicked - Facebook\", \"Click\", \"Current URL: \" + window.location.href, undefined, true);\r\n });\r\n\r\n $(\".js-socialmedia-twitter\").on(\"click\", function () {\r\n gaHelper.trackEvent(\"Social Media Button Clicked - twitter\", \"Click\", \"Current URL: \" + window.location.href, undefined, true);\r\n });\r\n\r\n $(\".js-socialmedia-linkedin\").on(\"click\", function () {\r\n gaHelper.trackEvent(\"Social Media Button Clicked - linkedin\", \"Click\", \"Current URL: \" + window.location.href, undefined, true);\r\n });\r\n\r\n $(\".js-socialmedia-youTube\").on(\"click\", function () {\r\n gaHelper.trackEvent(\"Social Media Button Clicked - youTube\", \"Click\", \"Current URL: \" + window.location.href, undefined, true);\r\n });\r\n\r\n $(\".js-socialmedia-instagram\").on(\"click\", function () {\r\n gaHelper.trackEvent(\"Social Media Button Clicked - instagram\", \"Click\", \"Current URL: \" + window.location.href, undefined, true);\r\n });\r\n }\r\n}\r\n\r\nvar locationsCTA = {\r\n \r\n track: function (name, href) { \r\n //gaHelper.trackEvent(\"Find us page, CTA\", \"Click\", \"Current URL: \" + window.location.href + \", Name: \" + name + \", Link: \" + href, null, true);\r\n }\r\n\r\n};\r\n \r\nvar consultantTracking = {\r\n init: function () {\r\n this.globalItems();\r\n },\r\n globalItems: function () {\r\n $(\".js-private-secretary-email\").on(\"click\", function () {\r\n var text = $(this).text(); \r\n //gaHelper.trackEvent(\"Private Secretary Email Link\", \"Click\", \"Current URL: \" + window.location.href + \" - Email = \" + text, undefined, true);\r\n });\r\n }\r\n};\r\n\r\nvar treatmentPickerWithThreeColumns = {\r\n init: function () { \r\n $(\".js_treatment-picker-three-columns__content__toggle\").hide();\r\n this.globalItems();\r\n },\r\n globalItems: function () {\r\n $(\".js_treatment-picker-three-columns__content__see-more\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n $(\".treatment-picker-three-columns__content__see-more\").hide();\r\n $(\".js_treatment-picker-three-columns__content__toggle\").show();\r\n var featGridItem = $('.feature-grid__item__text');\r\n featGridItem.matchHeight();\r\n gaHelper.trackEvent(\"Homepage see more treatments\", \"Click\", \"Open\", undefined, true);\r\n });\r\n }\r\n};\r\n\r\nvar homepageGallery = {\r\n init: function () {\r\n \r\n function getCurrentIndex() {\r\n return parseInt($('.slick-current').attr('data-slick-index'), 10) + 1;\r\n }\r\n\r\n function sliderClickEvent(idx) {\r\n if (idx) {\r\n //gaHelper.trackEvent(\"New homepage slider\", \"Click\", \"Slide \" + idx, undefined, true);\r\n }\r\n else {\r\n //gaHelper.trackEvent(\"New homepage slider\", \"Click\", \"Slide \" + getCurrentIndex(), undefined, true);\r\n }\r\n }\r\n\r\n $('.homepage-gallery').slick({\r\n dots: true,\r\n infinite: true,\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n arrows: true,\r\n autoplay: true,\r\n autoplaySpeed: 6000,\r\n pauseOnHover: false\r\n });\r\n\r\n // hide in case we only have 1 slide\r\n $('.peek-underlay').hide();\r\n\r\n // previous button\r\n $('.slick-prev').mouseover(function () { \r\n $('.peek-wrapper.prev .peek-underlay').show();\r\n $('.peek-wrapper.prev .peek-text').stop().addClass('shown');\r\n });\r\n\r\n $('.slick-prev').mouseout(function () {\r\n $('.peek-wrapper.prev .peek-text').stop().removeClass('shown');\r\n });\r\n\r\n $('.slick-prev').on('click', function () {\r\n $('.peek-wrapper.prev .peek-text').stop().removeClass('shown');\r\n $('.peek-wrapper.prev .peek-underlay').hide();\r\n sliderClickEvent();\r\n });\r\n\r\n // next button\r\n $('.slick-next').mouseover(function () {\r\n $('.peek-wrapper.next .peek-underlay').show();\r\n $('.peek-wrapper.next .peek-text').stop().addClass('shown');\r\n });\r\n\r\n $('.slick-next').mouseout(function () {\r\n $('.peek-wrapper.next .peek-text').stop().removeClass('shown');\r\n });\r\n\r\n $('.slick-next').on('click', function () {\r\n $('.peek-wrapper.next .peek-text').stop().removeClass('shown');\r\n $('.peek-wrapper.next .peek-underlay').hide();\r\n sliderClickEvent();\r\n });\r\n\r\n $('.homepage-gallery .slick-dots').after().on('click', function () {\r\n $('.homepage-gallery').slick('slickPause');\r\n });\r\n\r\n $('.slick-dots li button').on('click', function () {\r\n sliderClickEvent($(this).text());\r\n });\r\n }\r\n};\r\n\r\n\r\nvar treatmentCarousel = {\r\n init: function () {\r\n \r\n function getCurrentIndex() {\r\n return parseInt($('.slick-current').attr('data-slick-index'), 10) + 1;\r\n }\r\n\r\n function sliderClickEvent(idx) {\r\n if (idx) {\r\n //gaHelper.trackEvent(\"Treatment carousel slider\", \"Click\", \"Slide \" + idx, undefined, true);\r\n }\r\n else {\r\n //gaHelper.trackEvent(\"Treatment carousel slider\", \"Click\", \"Slide \" + getCurrentIndex(), undefined, true);\r\n }\r\n }\r\n\r\n $('.treatment-carousel').slick({\r\n dots: true,\r\n infinite: true,\r\n slidesToShow: 3,\r\n slidesToScroll: 1,\r\n arrows: true,\r\n autoplay: false,\r\n autoplaySpeed: 6000,\r\n pauseOnHover: false,\r\n responsive: [\r\n {\r\n breakpoint: 991,\r\n settings: {\r\n slidesToShow: 1\r\n }\r\n }\r\n ]\r\n });\r\n }\r\n};\r\n\r\nvar makeEnquiry = {\r\n init: function () {\r\n \r\n //$('.contact-us-bar__inner__enquire-text-container__enquire-link a').on('click', function () {\r\n // gaHelper.trackEvent(\"Button\", \"Click\", \"Current URL: \" + window.location.href + \", Name: Make an enquiry, Link: \" + $(this).attr('href'), undefined, true);\r\n //});\r\n\r\n }\r\n};\r\n\r\nvar globalNotification = {\r\n init: function () {\r\n $('.panel-title').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n $('#collapseTwo').toggleClass('toggleDiv');\r\n });\r\n }\r\n}\r\n\r\n\r\nvar COBPSConsultant= {\r\n\r\n init: function () {\r\n \r\n $(\".consultant-content__section__practising-at .viewTreatments a\").on(\"click\", function (e) {\r\n\r\n e.preventDefault();\r\n\r\n var accordionName = $(this).attr('href').replace(\"#\", \"\");\r\n var accordionHeader = $(\"a[name=\" + accordionName + \"]\");\r\n\r\n var $content = $(accordionHeader).parents(\".js-accordion\").find(\".js-accordion__content\");\r\n $(accordionHeader).addClass(\"is-on\");\r\n $content.addClass(\"is-on\");\r\n //gaHelper.trackEvent(\"Accordion\", \"Open\", $(this).text(), null, true);\r\n\r\n $('html, body').animate({ scrollTop: $(accordionHeader).offset().top - 100 }, 'slow');\r\n });\r\n\r\n\r\n $(\".consultant-header__text a.makeAnEnquiry\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n var makeEnquiryForm = $(\"a[name=consultantInpageEnquiryForm]\"); \r\n $('html, body').animate({ scrollTop: $(makeEnquiryForm).offset().top - 100 }, 'slow');\r\n });\r\n\r\n\r\n\r\n }\r\n}\r\n\r\nvar hospitalTreatmentConsultantFinder = {\r\n init: function () {\r\n this.globalItems();\r\n },\r\n globalItems: function () {\r\n $(\".js-hospital-consultant-finder__search__consultants\").hide();\r\n $(\".js-hospital-consultant-finder__search__hospital\").hide();\r\n\r\n $(\".js-hospital-consultant-finder__search__content__consultant--button\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n hospitalTreatmentConsultantFinder.showConsultantsFinder();\r\n gaHelper.trackEvent(\"I want to slider\", \"Click\", 'Find a consultant open', null, true);\r\n });\r\n\r\n $(\".js-hospital-consultant-finder__search__content__hospital--button\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n hospitalTreatmentConsultantFinder.showHospitalFinder();\r\n gaHelper.trackEvent(\"I want to slider\", \"Click\", 'Find a hospital open', null, true);\r\n });\r\n\r\n $(\".js-hospital-consultant-finder__search__header--close\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n hospitalTreatmentConsultantFinder.reset();\r\n }); \r\n\r\n $(\".js-hospital-consultant-finder__search__hospital__next\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n hospitalTreatmentConsultantFinder.showConsultantsFinder();\r\n gaHelper.trackEvent(\"I want to slider\", \"Click\", 'Find a consultant open next', null, true);\r\n });\r\n\r\n $(\".js-hospital-consultant-finder__search__consultant__prev\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n hospitalTreatmentConsultantFinder.showHospitalFinder();\r\n gaHelper.trackEvent(\"I want to slider\", \"Click\", 'Find a hospital open next', null, true); \r\n });\r\n\r\n $(\".js-hospital-consultant-finder__search__consultants--show\").show();\r\n },\r\n showConsultantsFinder: function () {\r\n $(\".js-hospital-consultant-finder__search__main\").hide();\r\n $(\".js-hospital-consultant-finder__search__consultants\").show();\r\n $(\".js-hospital-consultant-finder__search__hospital\").hide();\r\n },\r\n showHospitalFinder: function () {\r\n $(\".js-hospital-consultant-finder__search__main\").hide();\r\n $(\".js-hospital-consultant-finder__search__consultants\").hide();\r\n $(\".js-hospital-consultant-finder__search__hospital\").show();\r\n },\r\n reset: function () {\r\n $(\".js-hospital-consultant-finder__search__consultants\").hide();\r\n $(\".js-hospital-consultant-finder__search__hospital\").hide();\r\n $(\".js-hospital-consultant-finder__search__main\").show();\r\n }\r\n};\r\n\r\n\r\nvar searchOverlay = {\r\n\r\n init: function () {\r\n\r\n var that = this;\r\n\r\n let searchOverlay = $('.search-overlay');\r\n\r\n var clearAndHideSuggestions = function () {\r\n $('#search-overlay-suggestion-list').html('');\r\n $('.search-overlay-suggestions-container').hide();\r\n };\r\n\r\n var search = function () {\r\n let query = $('#search-overlay-text-input').val();\r\n let origin = $('#search-overlay-location-input-geo').val();\r\n\r\n if (query.length > 0) {\r\n window.location.href = '/search/?query=' + encodeURIComponent(query) + '&origin=' + encodeURIComponent(origin);\r\n }\r\n };\r\n\r\n var locationLookupSetup = function () {\r\n\r\n $.getScript('https://maps.googleapis.com/maps/api/js?key=AIzaSyALpZboQbieD8FePSqE0JK2LdTvHlnAZy4&libraries=places', function () {\r\n\r\n const lookup = document.querySelector('.location-lookup-input');\r\n\r\n const locationOptions = {\r\n fields: [\"formatted_address\", \"geometry\", \"name\"],\r\n strictBounds: false,\r\n componentRestrictions: { 'country': 'gb' },\r\n types: ['geocode']\r\n };\r\n\r\n let autocomplete = new google.maps.places.Autocomplete(lookup, locationOptions);\r\n\r\n autocomplete.addListener(\"place_changed\", function () {\r\n let place = autocomplete.getPlace();\r\n let latlong = place.geometry.location;\r\n $('#' + lookup.id + '-geo').val(latlong.lat() + ';' + latlong.lng());\r\n });\r\n\r\n });\r\n\r\n\r\n };\r\n\r\n var requestAutocompleteResults = function (query, success) {\r\n\r\n this.domain = $(\"#funnelbackDomain\").val();\r\n const col = $(\"#funnelbackCollection\").val();\r\n this.profile = \"/s/search.json?profile=spire-website\";\r\n this.suggestProfile = \"/s/suggest.json?profile=spire-website\";\r\n this.collection = \"collection=\" + col;\r\n this.searchPathUrl = \"/search\";\r\n\r\n\r\n let url = this.domain + this.suggestProfile + \"&\" + this.collection + \"&fmt=json++&alpha=0.5&show=10&sort=0&partial_query=\" + query;\r\n $.ajax({\r\n type: \"GET\",\r\n url: url,\r\n success: success\r\n });\r\n }\r\n\r\n locationLookupSetup();\r\n\r\n $('#search-overlay-close').on('click', function () {\r\n searchOverlay.hide();\r\n $('body').css('overflow', bodyOverflow);\r\n\r\n $('#search-overlay-text-input').val('');\r\n $('#search-overlay-location-input').val('');\r\n $('#search-overlay-location-input-geo').val('');\r\n clearAndHideSuggestions();\r\n });\r\n\r\n $('.open-overlay-search-button').on('click', function () {\r\n searchOverlay.show();\r\n let body = $('body');\r\n bodyOverflow = body.css('overflow');\r\n body.css('overflow', 'hidden');\r\n });\r\n\r\n $('#search-overlay-submit').on('click', function () {\r\n search();\r\n });\r\n\r\n $('#search-overlay-text-input').on('input', function () {\r\n\r\n requestAutocompleteResults($(this).val(), function (data) {\r\n let list = $('#search-overlay-suggestion-list');\r\n\r\n if (data.length < 1) {\r\n that.clearAndHideSuggestions();\r\n return;\r\n }\r\n\r\n $('.search-overlay-suggestions-container').show();\r\n\r\n list.html('');\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n list.append(`
  • ${data[i].disp}
  • `);\r\n if (i === 8) {\r\n break;\r\n }\r\n }\r\n\r\n });\r\n\r\n });\r\n\r\n $('#search-overlay-suggestion-list').on('click', 'li', function () {\r\n let input = $('#search-overlay-text-input');\r\n input.val($(this).text());\r\n input.trigger('input');\r\n });\r\n\r\n $('#search-overlay-text-input').on('keydown', function (e) {\r\n if (e.keyCode === 13) {\r\n that.search();\r\n }\r\n });\r\n\r\n $('#search-overlay-location-mylocation').on('click', function () {\r\n let setLocation = function (position) {\r\n $('#search-overlay-location-input').val('My Location');\r\n $('#search-overlay-location-input-geo').val(position.coords.latitude + ';' + position.coords.longitude)\r\n }\r\n\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(setLocation);\r\n }\r\n });\r\n\r\n \r\n\r\n }\r\n};\r\n\r\n\r\nfunction addCommas(nStr) {\r\n nStr += '';\r\n x = nStr.split('.');\r\n x1 = x[0];\r\n x2 = x.length > 1 ? '.' + x[1] : '';\r\n var rgx = /(\\d+)(\\d{3})/;\r\n while (rgx.test(x1)) {\r\n x1 = x1.replace(rgx, '$1' + ',' + '$2');\r\n }\r\n return x1 + x2;\r\n}\r\n\r\nfunction formatToPercentage(amount) {\r\n return parseFloat(amount * 100).toFixed(1) + \"%\";\r\n}\r\n\r\nfunction formatToCurrency(amount) {\r\n return \"£\" + addCommas(Math.round(amount));\r\n}\r\n\r\nfunction loadPricingTemplate(element, url, treatmentName, treatmentCode) {\r\n\r\n let bodyElement = document.getElementsByTagName('body')[0];\r\n var hospitalName = bodyElement.dataset.hospitalName;\r\n var paymentButtonText = \"Find a payment plan that suits you\";\r\n var showFinanceCalculatorLink = document.getElementById(\"showFinanceCalculatorLink\").value;\r\n var initialConsultantFeeMissingText = document.getElementById(\"initialConsultantFeeMissingText\").value;\r\n var overridePriceFeeMissingText = document.getElementById(\"overridePriceFeeMissingText\").value;\r\n var enquiryFormUrl = document.getElementById(\"enquiryFormUrl\").value;\r\n\r\n var template = ``;\r\n var innerTemplate = ``;\r\n\r\n template +=\r\n `
    \r\n
    `;\r\n\r\n for (var i = 0; i < element.ProceduresApi.length; i++) {\r\n var item = element.ProceduresApi[i];\r\n var monthlyPayment, loanAmount, depositTyped, term, representativeAprTyped, totalAmountPayable = 0;\r\n var procedureName = item.Procedure;\r\n var procedureCode = item.ProcedureCode;\r\n var initialConsultantFee = item.InitialConsultation;\r\n var treatmentPrice = formatToCurrency(item.TreatmentPrice);\r\n var guidePrice = \"from \" + formatToCurrency(item.GuidePrice);\r\n\r\n\r\n /* Treatment Loan values */\r\n if (item.TreatmentLoan != null) {\r\n monthlyPayment = item.TreatmentLoan.MonthlyPayment == null ? \"\" : formatToCurrency(item.TreatmentLoan.MonthlyPayment);\r\n loanAmount = formatToCurrency(item.TreatmentLoan.LoanAmount);\r\n depositTyped = formatToCurrency(item.TreatmentLoan.Deposit);\r\n term = item.TreatmentLoan.Term + \" months\";\r\n representativeAprTyped = formatToPercentage(item.TreatmentLoan.RepresentativeAPR);\r\n totalAmountPayable = formatToCurrency(item.TreatmentLoan.TotalAmountPayable);\r\n } \r\n /* End treatment loan values */\r\n \r\n \r\n var financeCalculatorlink = \"/patient-information/finance-calculator/?treatmentAmount=\" + item.TreatmentPrice + \"&treatmentCode=\" + treatmentCode + \"&treatmentName=\" + treatmentName + \"&hospitalName=\" + hospitalName;\r\n\r\n if (initialConsultantFee == \"0\" || initialConsultantFee == \"-9999\") {\r\n initialConsultantFee = initialConsultantFeeMissingText;\r\n }\r\n else {\r\n initialConsultantFee = \"from \" + formatToCurrency(initialConsultantFee);\r\n }\r\n\r\n if (item.RateCardPrice != 0 && item.RateCardPrice != -9999\r\n && item.ConsultantPrice != 0 && item.ConsultantPrice != -9999\r\n && item.AnaesthetistPrice != 0 && item.AnaesthetistPrice != -9999) {\r\n\r\n innerTemplate += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n if (monthlyPayment.length > 0) {\r\n innerTemplate += `\r\n \r\n \r\n `;\r\n }\r\n\r\n innerTemplate += `\r\n \r\n \r\n \r\n \r\n \r\n
    ${procedureName}
    Initial consultation${initialConsultantFee}
    Treatment${treatmentPrice}
    AftercareIncluded
    From price${guidePrice}
    \r\n Monthly treatment price
    \r\n (Loan applicable to the treatment cost and excludes the initial consultation)\r\n
    ${monthlyPayment}
    \r\n ${paymentButtonText}\r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n Representative example:\r\n
    Loan amount${loanAmount}
    Deposit${depositTyped}
    Loan period${term}
    Representative APR${representativeAprTyped}
    Total amount repayable${totalAmountPayable}
    \r\n
    \r\n\r\n
    `;\r\n\r\n }\r\n }\r\n\r\n if (innerTemplate == \"\") {\r\n innerTemplate += `

    ` + overridePriceFeeMissingText + `

    `;\r\n }\r\n\r\n innerTemplate +=\r\n ``;\r\n\r\n template += innerTemplate + `
    `;\r\n\r\n return template;\r\n};\r\n\r\nvar pricing = {\r\n\r\n loadPrices() {\r\n\r\n let bodyElement = document.getElementsByTagName('body')[0];\r\n var hospitalid = bodyElement.dataset.id;\r\n var that = this;\r\n var endpoint = apilocation + \"treatmentapi/GetCurrentHospitalTreatments?hospitalid=\" + hospitalid;\r\n $(\".loading\").addClass(\"show\");\r\n\r\n $.ajax({\r\n method: \"GET\",\r\n url: endpoint,\r\n dataType: \"json\",\r\n }).done(function (data) {\r\n //console.log(data);\r\n var template = ``;\r\n data.treatments.forEach(element => {\r\n\r\n template += `
    \r\n
    \r\n \r\n

    ` + element.TreatmentName\r\n + `

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    We can't display a fee for this procedure just now. Call us for a quote.

    \r\n
    \r\n
    \r\n
    `;\r\n });\r\n\r\n $(\".js-pricing\").html(template);\r\n })\r\n .always(function () {\r\n $(\".loading\").removeClass(\"show\");\r\n });\r\n },\r\n\r\n clickEvents() {\r\n $(\"body\").on(\"click\", \".js-accordion__toggle\", function (e) {\r\n\r\n e.preventDefault();\r\n\r\n var that = this;\r\n\r\n var ison = $(this).hasClass(\"is-on\");\r\n\r\n if (typeof ison !== 'undefined' && ison !== false) {\r\n // Get treatment nodeid and pass to page\r\n var treatmentId = $(this).closest(\".js-accordion\").data(\"id\");\r\n var treatmentUrl = $(this).closest(\".js-accordion\").data(\"url\");\r\n var enquiryFormUrl = document.getElementById(\"enquiryFormUrl\").value;\r\n var treatmentName = $(this).closest(\".js-accordion\").data(\"treatmentname\");\r\n var treatmentCode = $(this).closest(\".js-accordion\").data(\"code\");\r\n var url = apilocation + \"pricingapi/GetHospitalTreatmentPrices?id=\" + treatmentId;\r\n var overridePriceFeeMissingText = document.getElementById(\"overridePriceFeeMissingText\").value;\r\n $(\".loading\").addClass(\"show\");\r\n\r\n $.ajax({\r\n method: \"GET\",\r\n url: url,\r\n dataType: \"json\",\r\n }).done(function (data) {\r\n var template = ``;\r\n if (data.ProceduresApi.length > 0) {\r\n //console.log(data);\r\n template = loadPricingTemplate(data, treatmentUrl, treatmentName, treatmentCode);\r\n }\r\n else {\r\n template = `
    \r\n
    \r\n

    ${overridePriceFeeMissingText}

    \r\n
    \r\n \r\n
    `;\r\n }\r\n $(that).closest(\".js-accordion\").find(\".js-accordion__pricing__content\").find(\".procedure-price-content\").html(template);\r\n\r\n })\r\n .always(function () {\r\n $(\".loading\").removeClass(\"show\");\r\n });\r\n }\r\n\r\n });\r\n }, \r\n\r\n init() {\r\n let bodyElement = document.getElementsByTagName('body')[0];\r\n let dataType = bodyElement.dataset.dtype;\r\n var apiPricingPage = $(bodyElement).find(\".js-pricing\");\r\n if (dataType == \"hospitaltreatmentprices\" && apiPricingPage.length > 0) {\r\n this.loadPrices();\r\n this.clickEvents();\r\n }\r\n \r\n }\r\n};\r\n\r\n\r\nvar livePerson = {\r\n\r\n init: function () {\r\n\r\n $(\".call-to-action--floatingButton .chat\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n $('.LPMcontainer').click();\r\n });\r\n\r\n }\r\n};\r\n\r\nvar cookiesSettings = {\r\n init: function () {\r\n\r\n $(\".site-footer__top li a:contains('Cookie settings')\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n OneTrust.ToggleInfoDisplay();\r\n });\r\n\r\n }\r\n}\r\n\r\nvar liveChat = {\r\n init: function () {\r\n this.storedItemKey = \"liveChatTimes\";\r\n this.storedItem = null;\r\n\r\n this.checkCache();\r\n },\r\n\r\n checkCache() {\r\n this.storedItem = JSON.parse(localStorage.getItem(this.storedItemKey));\r\n let lastRequest = this.storedItem != null ? new Date(this.storedItem.lastRequest) : null;\r\n let dateNow = new Date(Date.now());\r\n\r\n if (lastRequest == null\r\n || dateNow.getDate() !== lastRequest.getDate()\r\n || lastRequest.getHours() > dateNow.getHours()\r\n ) {\r\n this.getLatestTimes();\r\n } else {\r\n this.updateChatStatus();\r\n }\r\n },\r\n \r\n getLatestTimes() {\r\n let that = this;\r\n let request = new XMLHttpRequest();\r\n request.onreadystatechange = function (request, event) {\r\n let result = request.currentTarget;\r\n if (result.readyState === 4 && result.status === 200) {\r\n let response = JSON.parse(result.response);\r\n let newItem = {};\r\n newItem.from = new Date(response.From);\r\n newItem.until = new Date(response.Until);\r\n newItem.lastRequest = new Date(Date.now());\r\n localStorage.setItem(that.storedItemKey, JSON.stringify(newItem));\r\n that.storedItem = newItem;\r\n\r\n that.updateChatStatus();\r\n }\r\n };\r\n request.open(\"GET\", apilocation + \"ChatApi/Status\", true);\r\n request.send(null);\r\n },\r\n \r\n updateChatStatus(firstTime = true) {\r\n let that = this;\r\n let from = new Date(this.storedItem.from);\r\n let fromMins = (from.getHours() * 60) + from.getMinutes();\r\n let until = new Date(this.storedItem.until);\r\n let untilMins = (until.getHours() * 60) + until.getMinutes();\r\n let now = new Date(Date.now());\r\n let nowMins = (now.getHours() * 60) + now.getMinutes();\r\n\r\n let desktopLive = document.querySelector(\"#desktopLive\");\r\n let desktopFaq = document.querySelector(\"#desktopFaq\");\r\n let mobileLive = document.querySelector(\"#mobileLive\");\r\n let mobileFaq = document.querySelector(\"#mobileFaq\");\r\n let desktopElementsMissing = (desktopLive == null || desktopFaq == null);\r\n if (firstTime && desktopElementsMissing) {\r\n addEventListener(\"load\", (event) => { that.updateChatStatus(false) })\r\n }\r\n\r\n let changeMobile = !(mobileLive == null || mobileFaq == null);\r\n let changeDesktop = !desktopElementsMissing;\r\n\r\n if (fromMins < nowMins && untilMins > nowMins) {\r\n if (changeDesktop) {\r\n desktopLive.style.display = \"\";\r\n desktopFaq.style.display = \"none\"\r\n }\r\n\r\n if (changeMobile) {\r\n mobileLive.style.display = \"\";\r\n mobileFaq.style.display = \"none\";\r\n }\r\n } else {\r\n if (changeDesktop) {\r\n desktopLive.style.display = \"none\";\r\n desktopFaq.style.display = \"\"\r\n }\r\n\r\n if (changeMobile) {\r\n mobileLive.style.display = \"none\";\r\n mobileFaq.style.display = \"\";\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n$(function () { \r\n callToAction.init();\r\n externalLinkClass.init();\r\n //newsFilterSelect.init();\r\n callBackRequest.init();\r\n noImageHeader.init();\r\n // scrollArrow.init();\r\n // homepageHero.init();\r\n liquidHero.init();\r\n iosSelectFix.init();\t\r\n consultantImgCrop.init();\r\n gallery.init();\r\n galleryLightbox.init();\r\n videoLightbox.init();\r\n stickyHeader.init();\r\n awards.init();\r\n siteHeader.init();\r\n siteHeaderLocations.init();\r\n siteHeaderEnquiry.init();\r\n siteHeaderSearch.init();\r\n siteNav.init();\r\n searchMobileNav.init();\r\n matchHeight.init();\r\n accordion.init();\r\n tabs.init();\r\n insurers.init();\r\n notice.init();\r\n alphabeticFilter.init();\r\n dateValidation.init();\r\n locationMap.init();\r\n finder.init();\r\n enquiryForm.init();\r\n enquiryFormCTA.init();\r\n filterDropdown.init();\r\n paginationFilters.init();\r\n cookies.init();\r\n cookies.surveyCookies();\r\n cookies.bannerCookies();\r\n checkIfWesbiteLeft.init();\r\n enquiryTabs.init();\r\n siteNavMobile.init(); \r\n consultantNav.init();\r\n siteHeaderTracking.init();\r\n gpConnectTracking.init();\r\n ctaTracking.init();\r\n topMenu.init();\r\n tooltip.init(); \r\n datepicker.init(); \r\n telephoneLinks.init();\r\n eventBookingForm.init();\r\n clickTocall.init();\r\n consultantTracking.init();\r\n footerTracking.init(); \r\n callToActionFullwidth.init();\r\n homepageGallery.init();\r\n makeEnquiry.init();\r\n treatmentPickerWithThreeColumns.init();\r\n hospitalTreatmentConsultantFinder.init();\r\n COBPSConsultant.init();\r\n requestForm.init();\r\n treatmentCarousel.init();\r\n globalNotification.init();\r\n pricing.init();\r\n searchOverlay.init();\r\n livePerson.init();\r\n cookiesSettings.init();\r\n liveChat.init();\r\n});\r\n\r\n//Get all query strings from current URL\r\nfunction getURLQueryStrings() { \r\n var assoc = {};\r\n var decode = function (s) { return decodeURIComponent(s.replace(/\\+/g, \" \")); };\r\n var queryString = location.search.substring(1); \r\n var keyValues = queryString.split('&'); \r\n\r\n for(var i in keyValues) { \r\n var key = keyValues[i].split('=');\r\n if (key.length > 1) {\r\n assoc[decode(key[0])] = decode(key[1]);\r\n }\r\n } \r\n\r\n return assoc; \r\n}\r\n\r\n\r\n\r\n\r\n"],"file":"script-min.js"}