!function(){"use strict";function link($scope,element,attributes,ngModel){element.on("click",(function(event){this.href=this.href+document.location.hash}))}angular.module("app").directive("cshAddHash",[function(){return{restrict:"A",link:link}}])}(),function(){"use strict";angular.module("app").directive("cshBindHtml",["$compile",function($compile){return function(scope,element,attrs){scope.$watch((function(scope){return scope.$eval(attrs.cshBindHtml)}),(function(value){element.html(value),$compile(element.contents())(scope)}))}}])}(),function(){"use strict";angular.module("app").directive("cshCountButton",["$compile",function($compile){return{replace:!1,restrict:"A",scope:!0,require:"ngModel",link:function($scope,element,attributes,ngModel){var value,getDecimalTop=function(value,power){return value>=power?-200:20},getTop=function(value,power){var top=-20*Math.floor(value%(10*power)/power);return value
 
 
 
 
 
 
')).show(),$compile(element.contents())($scope);var items=element.children()[1].children[0].children;$scope.$watch((function(){return ngModel.$viewValue}),(function(newValue,oldValue){void 0!==newValue&&function(animate){var animationTime=animate?500:0,value=ngModel.$viewValue;$(items[5]).animate({top:getTop(value,1)+"px"},animationTime),$(items[4]).animate({top:getTop(value,10)+"px"},animationTime),$(items[3]).animate({top:getTop(value,100)+"px"},animationTime),$(items[2]).animate({top:getDecimalTop(value,1e3)+"px"},animationTime),$(items[1]).animate({top:getTop(value,1e3)+"px"},animationTime),$(items[0]).animate({top:getTop(value,1e4)+"px"},animationTime)}(!0)}))}}}])}(),function(){"use strict";angular.module("app").directive("cshPhoneInput",["$compile","cshphoneinputservice",function($compile,cshPhoneInputService){var directive={replace:!1,restrict:"A",scope:{},require:"ngModel",link:function($scope,element,attributes,ngModel){cshPhoneInputService.getCountryNames(attributes.langid).then((function(data){for(var countryData=$.fn.intlTelInput.getCountryData(),i=0;i'),countryCode=$('
');function updateCountryCodeDisplay(dialCode){element.css("padding-left",eval(56+9*dialCode.length)+"px"),countryCode.text(dialCode)}countryCodeContainer.append(countryCode),countryCodeContainer.insertAfter(dropDown),telInput.find("ul.country-list li").on("classadded",(function(ev,newClasses){"active"==newClasses&&(updateCountryCodeDisplay("+"+$(this).data("dial-code")),tel.focus())})),updateCountryCodeDisplay("+"+telInput.find("ul.country-list li.active").data("dial-code"))}),(function(errors){}))}};return directive}])}(),function(){"use strict";function cshDatepickerPopup(){return{require:["ngModel","?^cshDatepickerPopupInterval"],restrict:"A",scope:{minDate:"=",status:"=",occupationalRules:"=",format:"@",autoFocusSubmit:"=",onClose:"&"},link:function($scope,element,attributes,ctrl){var _changed=!1,ngModel=ctrl[0],ngInterval=ctrl[1],hiddenName=(element.attr("name")||element.attr("id"))+"_submit";$('').insertBefore(element);var _pickerHeader,containerClass=attributes.datepickerContainer?attributes.datepickerContainer:ngInterval?"."+ngInterval.cssClass:"",pickerClass=ngInterval&&ngInterval.pickers?0==ngInterval.pickers.length?"picker__from":"picker__to":"",picker=element.pickadate({format:$scope.format,klass:{picker:"picker "+pickerClass},container:containerClass,containerHidden:hiddenName,onOpen:function(){picker.get("select")?picker.set("highlight",picker.get("select").pick):ngInterval.pickers&&2==ngInterval.pickers.length?ngInterval.pickers[0]===picker?picker.set("highlight",picker.get("min").pick):ngInterval.pickers[1]===picker&&(ngInterval.pickers[0].get("select")?picker.set("highlight",ngInterval.pickers[0].get("select").pick):picker.set("highlight",picker.get("min").pick)):picker.set("highlight",picker.get("min").pick),setSelectedInterval($(".picker__day",this.$root),ngInterval.pickers),_changed=!1},onClose:function(){_changed&&ngInterval&&ngInterval.pickers[0]===picker?ngInterval.pickers[1].open():_changed&&ngInterval&&ngInterval.pickers[1]===picker&&($scope.onClose(),$scope.autoFocusSubmit&&$(element).closest("form").find(":submit").focus()),$(document.activeElement).blur(),_changed=!1},onRender:function(){$("
").prependTo($(".picker__box",this.$root)),$("
").insertBefore($(".picker__footer",this.$root)),attributes.info&&$(".picker__title",this.$root).html(attributes.info);var dates=$(".picker__day",this.$root);_pickerHeader=function(pickerHeader,currPicker,pickers){if(!pickers||2!=pickers.length)return;var from=pickers[0],to=pickers[1];if(from.title&&to.title){var toClass=currPicker==to?"active":"inactive",html='
'+from.title+'
'+to.title+"
";pickerHeader&&pickerHeader.remove(),pickerHeader=$(html).prependTo($(".picker__wrap",currPicker.$root)),$(pickerHeader.children()[0]).click((function(){to.close(),from.open()})),$(pickerHeader.children()[1]).click((function(){from.close(),to.open()}))}return pickerHeader}(_pickerHeader,picker,ngInterval.pickers),function(dates,statuses,currPicker,pickers){if(!statuses)return;$.each(dates,(function(i,elm){var pattern,dateElm=$(elm),date=moment(dateElm.data("pick")).toDate(),shouldBeDisabled=!1;pickers&&2===pickers.length&&(pattern=currPicker===pickers[0]?12:21,shouldBeDisabled=statuses[date]===pattern);statuses[date]&&(2===statuses[date]||shouldBeDisabled)&&dateElm.addClass("picker__day--disabled")}))}(dates,$scope.status,picker,ngInterval.pickers),ngInterval.pickers&&2===ngInterval.pickers.length&&(function(dates,rules,currentPicker,pickers,dateStatuses){if(!rules)return;currentPicker.$root.hasClass("picker--occupational-rules")||currentPicker.$root.addClass("picker--occupational-rules");var fromDate=pickers[0].get("select")?pickers[0].get("select").obj:null;$.each(dates.filter(":not(.picker__day--disabled)"),(function(i,elm){var dateElm=$(elm),date=moment(dateElm.data("pick")).toDate();currentPicker===pickers[0]?isChangeoverDay("in",date)&&hasValidCheckOutDate(date)||setNotSelectable(dateElm):fromDate?isChangeoverDay("out",date)&&isValidCheckOutDate(fromDate,date)||setNotSelectable(dateElm):isChangeoverDay("out",date)||setNotSelectable(dateElm)})),fromDate&&rules.texts&¤tPicker===pickers[1]&&$(".picker__info-sub",currentPicker.$root).html(rules.texts.minimumStayInfo+" "+rules.texts.minStayNightsTexts[getMinStayForDate(fromDate)]);function getNotSelectableReason(date){if(dateStatuses[date]&&2===dateStatuses[date])return"alreadyBooked";if(pickers[0]===currentPicker)return"notAvailableForCheckIn";if(fromDate){var minStay=getMinStayForDate(fromDate),daysBetween=moment(date).diff(moment(fromDate),"d");if(daysBetween<1)return"checkOutBeforeCheckIn";if(daysBetween-1)}function isValidCheckOutDate(fromDate,date){var minStay=getMinStayForDate(fromDate),firstSelectable=moment(fromDate).add(minStay,"d").toDate(),firstUnavailableDate=findFirstUnavailableDate(fromDate);return!(date=firstUnavailableDate)}function hasValidCheckOutDate(date){var minStay=getMinStayForDate(date),firstSelectable=moment(date).add(minStay,"d").toDate(),firstUnavailableDate=findFirstUnavailableDate(date);return!!(firstUnavailableDate>=firstSelectable&&existsCheckOutDateBetween(firstSelectable,firstUnavailableDate))}function getMinStayForDate(date){for(var i=0;rules.minimumStayPeriods&&i=date)return rules.minimumStayPeriods[i].minStay;return 1}function findFirstUnavailableDate(fromDate){return dateStatuses?null==dateStatuses.lastUnavailableDate||dateStatuses.lastUnavailableDate<=fromDate?moment(rules.availableUntil).add(1,"d").toDate():dateStatuses.nextUnavailableDate&&dateStatuses.nextUnavailableDate[fromDate]?moment(dateStatuses.nextUnavailableDate[fromDate]).toDate():moment(rules.availableUntil).add(1,"d").toDate():moment(rules.availableUntil).add(1,"d").toDate()}function existsCheckOutDateBetween(fromDate,toDate){for(var dateCurrent=fromDate;dateCurrent-1)return!0;return!1}function existsBookedDatesBetween(fromDate,toDate){return findFirstUnavailableDate(fromDate)=hoverTicks||ticks===hoverTicks)&&elm.addClass("picker__day--interval-hover picker__day--interval-hover-middle")}function hoverTo(elm,ticks,hoverTicks){(from&&ticks>=from&&ticks<=hoverTicks||ticks===hoverTicks)&&elm.addClass("picker__day--interval-select picker__day--interval-hover-middle")}hoverableDates.on("mouseenter",(function(hover){var hoverDate=$(hover.target);dates.removeClass("picker__day--interval-hover"),dates.removeClass("picker__day--interval-hover-middle"),$.each(dates,(function(i,date){var seekDate=$(date);isFrom?hoverFrom(seekDate,seekDate.data("pick"),hoverDate.data("pick")):hoverTo(seekDate,seekDate.data("pick"),hoverDate.data("pick"))}))})),hoverableDates.on("mouseleave",(function(){dates.removeClass("picker__day--interval-hover"),dates.removeClass("picker__day--interval-hover-middle")}))}(dates,this,ngInterval.pickers))},onStop:function(){},onSet:function(thingSet){void 0!==thingSet&&null!=thingSet&&void 0!==thingSet.clear||(_changed=!0)},today:""}).pickadate("picker");picker.title=attributes.title,ngInterval&&ngInterval.pickers.push(picker),ngModel.$formatters.push((function(modelValue){return modelValue?(picker.set("select",modelValue),picker.get("value")):""})),ngModel.$parsers.push((function(viewValue){var obj=picker.get("select");return obj?obj.obj:null})),$scope.$watch("minDate",(function(newValue,oldValue){var minDate=moment(newValue).utc(!1).toDate();picker.set("min",minDate)}))}}}function setNotSelectable(elm){elm.hasClass("available")||elm.addClass("available"),elm.hasClass("picker__day--disabled")||elm.addClass("picker__day--disabled")}function setSelectedInterval(dates,pickers){if(pickers&&2===pickers.length){var from=pickers[0].get("select"),to=pickers[1].get("select");null!=from&&null!=to&&$.each(dates,(function(i,elm){var dateElm=$(elm),currPick=dateElm.data("pick");currPick>=from.pick&&currPick<=to.pick&&(dateElm.addClass("picker__day--interval-select"),dateElm.addClass("picker__day--interval-select-middle"))}))}}angular.module("app").directive("cshDatepickerPopup",cshDatepickerPopup),cshDatepickerPopup.$inject=[]}(),function(){"use strict";function cshDatepickerPopupInterval(){return{restrict:"A",controller:function($scope,$sce){this.pickers=[],this.cssClass="cshDatepickerPopupInterval"},link:{pre:function($scope,element,attributes,ctrl){element.addClass(ctrl.cssClass)}}}}angular.module("app").directive("cshDatepickerPopupInterval",cshDatepickerPopupInterval),cshDatepickerPopupInterval.$inject=[]}(),function(){"use strict";angular.module("app").directive("cshDropdownWrap",["$compile",function($compile){return{restrict:"A",require:"ngModel",scope:{ngModel:"="},link:function($scope,$element,$attr,ngModel){$scope.items=function(select,selectedValue){for(var items=[],options=select.children(),isNumber="number"==typeof selectedValue,i=0;i '),function(elem,attributes){for(var i=0;i=0;i--)-1!=funcs[i].toString().indexOf(text)&&funcs.splice(i,1)}angular.module("app").directive("input",["config",function(config){return{restrict:"E",require:"?ngModel",priority:1,link:function(scope,element,attr,ctrl){if(!config||!config.emailRegex)return;if(!ctrl)return;if("email"!==attr.type.toLowerCase())return;function cshEmailValidator(value){return function(ctrl,validatorName,validity,value){return ctrl.$setValidity(validatorName,validity),validity?value:void 0}(ctrl,"email",ctrl.$isEmpty(value)||config.emailRegex.test(value),value)}remove(ctrl.$formatters,'"email"'),remove(ctrl.$parsers,'"email"'),remove(ctrl.$formatters,"'email'"),remove(ctrl.$parsers,"'email'"),ctrl.$formatters.push(cshEmailValidator),ctrl.$parsers.push(cshEmailValidator)}}}])}(),function(){"use strict";function link($scope,element,attributes,ngModel){element.on("click",(function(event){event.stopPropagation(),($(attributes.cshInvoke,element.parent())||$(attributes.cshInvoke)).trigger("click")}))}angular.module("app").directive("cshInvoke",[function(){return{restrict:"A",link:link}}])}(),function(){"use strict";angular.module("app").directive("cshKeyEnter",(function(){return function(scope,element,attrs){element.bind("keydown keypress",(function(event){13===event.which&&(scope.$apply((function(){scope.$eval(attrs.cshKeyEnter)})),event.preventDefault())}))}}))}(),function(){"use strict";angular.module("app").directive("cshLoadingIndicator",[function(){return{replace:!0,template:'
',restrict:"A",scope:{backgroundOpacity:"=",contentOpacity:"="}}}])}(),function(){"use strict";angular.module("app").directive("cshLoadingIndicatorFb",[function(){return{replace:!0,template:'
',restrict:"A"}}])}(),function(){"use strict";function cshKeyValueTexts(){return{replace:!1,restrict:"AE",template:'
',scope:{cshKeyValueTexts:"=",cshKey:"="},link:function($scope,element,attributes,ctrl){$scope.value=function(){if(!$scope.cshKeyValueTexts)return"*";for(var i=0;i<$scope.cshKeyValueTexts.length;i++)if($scope.cshKeyValueTexts[i].key==$scope.cshKey)return $scope.cshKeyValueTexts[i].value;return""}}}}angular.module("app").directive("cshKeyValueTexts",cshKeyValueTexts),cshKeyValueTexts.$inject=[]}(),function(){"use strict";angular.module("app").directive("cshLazyload",[function(){return{restrict:"A",link:function($scope,element,attributes){element.addClass("lazyload"),element.one("appear",(function(){$(this).addClass("lazyload-triggered")})),element.lazyload(),setTimeout((function(){element.lazyload()})),$scope.$watch((function(){return element.is(":visible")}),(function(){element.lazyload()})),element.bind("load",(function(){setTimeout((function(){element.attr("src")===attributes.original&&element.addClass("lazyload-loaded")}))}))}}}])}(),function(){"use strict";angular.module("app").directive("cshLoadmore",[function(){return{restrict:"A",link:function($scope,element,attributes){var distance=attributes.distance||0,action=$scope.action,$element=$(element),$window=$(window),isLoading=!1,loaderLastPosition=0,loaderSamePositionCount=0;element.addClass("csh-load-more");var checkLoadMore=function(){var windowBottom=$window.scrollTop()+$window.height(),loaderPositionBeforeLoad=$element.offset().top-distance;loaderPositionBeforeLoad ':rating>=i?' ':rating>=i-.5?' ':' ';element.html(result)}}}])}(),function(){"use strict";angular.module("app").directive("counter",(function(){return{restrict:"A",scope:{value:"=value"},template:' ',link:function(scope,element,attributes){if(angular.isUndefined(scope.value))throw"Missing the value attribute on the counter directive.";var min=angular.isUndefined(attributes.min)?null:parseInt(attributes.min),max=angular.isUndefined(attributes.max)?null:parseInt(attributes.max),step=angular.isUndefined(attributes.step)?1:parseInt(attributes.step);element.addClass("counter-container"),scope.readonly=!!angular.isUndefined(attributes.editable);var setValue=function(val){scope.value=parseInt(val)};setValue(scope.value),scope.minus=function(){if(min&&(scope.value<=min||scope.value-step<=min)||0===min&&scope.value<1)return setValue(min),!1;setValue(scope.value-step)},scope.plus=function(){if(max&&(scope.value>=max||scope.value+step>=max))return setValue(max),!1;setValue(scope.value+step)},scope.changed=function(){return scope.value||setValue(0),/[0-9]/.test(scope.value)?setValue(scope.value):setValue(scope.min),min&&(scope.value<=min||scope.value-step<=min)?(setValue(min),!1):max&&(scope.value>=max||scope.value+step>=max)?(setValue(max),!1):void setValue(scope.value)}}}}))}(),function(){"use strict";angular.module("app").directive("shLoader",[function(){return{replace:!0,template:'
',restrict:"A",scope:{backgroundOpacity:"=",contentOpacity:"="}}}])}(),function(){"use strict";var shLocationsearch=function(){var latestSuggestions={query:"",suggestions:[]};function createBloodhound(type){var bloodhound=new Bloodhound({locationType:type,limit:40,datumTokenizer:Bloodhound.tokenizers.obj.whitespace("value"),queryTokenizer:Bloodhound.tokenizers.whitespace,dupDetector:function(remoteMatch,localMatch){return!1},remote:{locationType:type,url:baseUrl,filter:function(data){const result=[];return data.items.map((resp=>{const dataResult={path:resp.pathname,text:resp.value,id:0};result.push(dataResult)})),result}}});return bloodhound.initialize(),bloodhound}function getSuggestionToUseFromLatestSuggestions(){for(var suggestionToUse=null,suggestionToUseOrder=43,suggestionOrder=[3,1,2,7,4,5,0,6],i=0;i0?latestSuggestions.suggestions=suggestions:latestSuggestions.suggestions=[]):suggestions.length>0&&(latestSuggestions.suggestions=latestSuggestions.suggestions.concat(suggestions)),cb(suggestions)}))},templates:{header:"

"+header+"

",suggestion:function(data){return data.text}}})).on("typeahead:selected",(function(obj,data){latestSuggestions.query="",latestSuggestions.suggestions=[],currentValue=data.regionId,lastSelectedText=data.value,scope.$apply((function(){ngModel.$setViewValue(data.id)})),localStorage.set("newSearchPath",data.path)})),element.bind("blur",(function(event){if(isNaN(parseInt(element.val())))if((null==element.val()||element.val().length<3)&&(latestSuggestions.query="",latestSuggestions.suggestions=[]),null!=element.val()&&null!=lastSelectedText&&element.val().toLowerCase()==lastSelectedText.toLowerCase());else{var suggestionToUse=getSuggestionToUseFromLatestSuggestions();null!=suggestionToUse&&(element.typeahead("val",suggestionToUse.text),currentValue=suggestionToUse.id,lastSelectedText=suggestionToUse.text,scope.$apply((function(){ngModel.$setViewValue(suggestionToUse.id)}))),event.preventDefault(),element.typeahead("close")}})),element.bind("keydown",(function(event){var key=void 0===event.which?event.keyCode:event.which;if((key<37||key>40)&&$(".tt-dropdown-menu").scrollTop(0),13===key&&isNaN(parseInt(element.val()))){if((null==element.val()||element.val().length<3)&&(latestSuggestions.query="",latestSuggestions.suggestions=[]),null==element.val()||null==lastSelectedText||element.val().toLowerCase()!=lastSelectedText.toLowerCase()){var suggestionToUse=getSuggestionToUseFromLatestSuggestions();null!=suggestionToUse&&(element.typeahead("val",suggestionToUse.text),currentValue=suggestionToUse.id,lastSelectedText=suggestionToUse.text,scope.$apply((function(){ngModel.$setViewValue(suggestionToUse.id)})))}if(attributes.datefromelementid){var dateFromElement=$("#"+attributes.datefromelementid);dateFromElement&&(dateFromElement.focus(),event.preventDefault())}}})),element.change((function(){isNaN(parseInt(element.val()))||(currentValue="p"+element.val(),scope.$apply((function(){ngModel.$setViewValue(currentValue)})))})),element.click((function(){element.select()})),ngModel.$formatters.push((function(modelValue){if(!propertySearchUI.isFrontPage||!isInit){var value=function(value,text){var result={value:value,text:text};return null===value&&(result.value=parseInt(localStorage.get("location.id")),result.text=localStorage.get("location.text")),localStorage.set("location.id",result.regionId),localStorage.set("location.text",result.value),result}(modelValue,element.val());if(isNaN(parseInt(value.text))||!isInit)return currentValue=value.value,value.value,lastSelectedText=value.text,ngModel.$setViewValue(currentValue),element.typeahead("val",value.text),isInit=!1,value.text;isInit=!1}return isInit=!1,null})),ngModel.$parsers.push((function(viewValue){return currentValue||null}))}}}}();let baseUrl="";window.location.host.includes("vakantiehuizenspanje.nl")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2279&locale=nl-nl¤cy=EUR"),window.location.host.includes("vacancesespagne.fr")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2359&locale=fr-fr¤cy=EUR"),window.location.host.includes("ferienwohnungen-spanien.de")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2360&locale=de-de¤cy=EUR"),window.location.host.includes("feriebolig-spania.no")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2499&locale=no-no¤cy=NOK"),window.location.host.includes("wakacje-hiszpania.pl")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2339&locale=pl-pl¤cy=PLN"),window.location.host.includes("ferias-espanha.pt")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2380&locale=pt-pt¤cy=EUR"),window.location.host.includes("feriebolig-spanien.dk")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2300&locale=da-dk¤cy=DKK"),window.location.host.includes("affittivacanze-spagna.it")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2381&locale=it-it¤cy=DKK"),window.location.host.includes("semesterbostad-spanien.se")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2319&locale=sv-se¤cy=SEK"),window.location.host.includes("spain-holiday.com")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2259&locale=en-gb¤cy=GBP"),window.location.host.includes("vacaciones-espana.es")&&(baseUrl="https://api.holidu.com/old/rest/v6/search/autocomplete/%QUERY?domainId=2379&locale=es-es¤cy=EUR"),angular.module("app").directive("shLocationsearch",shLocationsearch),shLocationsearch.$inject=["cshLocalStorage","propertySearchUI","$timeout"]}(),function(){"use strict";angular.module("app").directive("shPropertyMap",["$window","cshGoogleMapConfig",function($window,mapConfig){return{restrict:"A",controller:function($scope,$sce){this.mapReady=[]},link:function($scope,element,attributes,ctrl){var mapElement=element[0],zoom=parseInt(attributes.zoom)||6,latitude=parseFloat(attributes.latitude)||46,longitude=parseFloat(attributes.longitude)||-19,latlng=new google.maps.LatLng(latitude,longitude),mapOptions=$.extend({zoom:zoom,center:latlng,mapTypeControlOptions:{position:google.maps.ControlPosition.TOP_LEFT},maxZoom:18},mapConfig.mapOptions,{draggable:!0}),map=ctrl.map=new google.maps.Map(mapElement,mapOptions);$("body").on("shown.bs.tab",(function(e,a,b){element.is(":visible")&&(google.maps.event.trigger(map,"resize"),fitMarkers())})),$scope.$watch((function(){return element.parent().is(":visible")}),(function(){element.is(":visible")&&(google.maps.event.trigger(map,"resize"),fitMarkers())}));var zoomToFitMarkers=[];function fitMarkers(){fitBounds(map,zoomToFitMarkers)}function fitBounds(map,markers){if(0!=markers.length&&element.is(":visible")){for(var bounds=new google.maps.LatLngBounds,i=0;i
',require:"^shPropertyMap",restrict:"A",scope:{shMapMarkersProperty:"=",propertyId:"=propertyid"},link:function($scope,element,attributes,ctrl){var infoWindow=new google.maps.InfoWindow({content:element[0]});function initialize(map,markers){setTimeout((function(){!function(map,markers){markerClusterer&&markerClusterer.clearMarkers();for(var i=0;i27.470876&&longitude>-18.449004,marker={position:new google.maps.LatLng(latitude,longitude),icon:iconMarker,title:value.title,id:value.id,zoomToFit:zoomToFit},mapMarker=ctrl.addMarker(marker);mapMarkers.push(mapMarker),google.maps.event.addListener(mapMarker,"click",(function(){select(this)}))}google.maps.event.addListener(map,"click",(function(){select(null)})),markerClusterer=new MarkerClusterer(map,mapMarkers,clusterOptions),ctrl.markersChanged()}(map,markers)}),100)}google.maps.event.addListener(infoWindow,"closeclick",(function(){select(null)})),ctrl.mapReady.push((function(){initialize(ctrl.map,$scope.shMapMarkersProperty||[])})),$scope.$watch("shMapMarkersProperty",(function(){initialize(ctrl.map,$scope.shMapMarkersProperty||[])}));var selected=null,mapMarkers=[],markerClusterer=null;selected=null;function select(marker){selected&&(selected.setIcon(iconMarker),toggleInfoWindow(selected.map,null,null)),marker&&(marker.setIcon("https://sh-assets.holidu.com/imagecache/pics-uk/mapmarker-property-orange.png"),toggleInfoWindow(marker.map,marker,marker.id)),selected=marker}function toggleInfoWindow(map,marker,propertyId){$scope.propertyId=propertyId,infoWindow.close(),marker&&$scope.$apply((function(){$scope.propertyId=propertyId,infoWindow.open(map,marker)}))}angular.element($window).resize((function(){select(null)}))}}}])}(),angular.module("ui.bootstrap",["ui.bootstrap.pagination"]),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function($scope,$attrs,$parse){var self=this,ngModelCtrl={$setViewValue:angular.noop},setNumPages=$attrs.numPages?$parse($attrs.numPages).assign:angular.noop;this.init=function(ngModelCtrl_,config){ngModelCtrl=ngModelCtrl_,this.config=config,ngModelCtrl.$render=function(){self.render()},$attrs.itemsPerPage?$scope.$parent.$watch($parse($attrs.itemsPerPage),(function(value){self.itemsPerPage=parseInt(value,10),$scope.totalPages=self.calculateTotalPages()})):this.itemsPerPage=config.itemsPerPage},this.calculateTotalPages=function(){var totalPages=this.itemsPerPage<1?1:Math.ceil($scope.totalItems/this.itemsPerPage);return Math.max(totalPages||0,1)},this.render=function(){$scope.page=parseInt(ngModelCtrl.$viewValue,10)||1},$scope.selectPage=function(page){$scope.page!==page&&page>0&&page<=$scope.totalPages&&(ngModelCtrl.$setViewValue(page),ngModelCtrl.$render())},$scope.getText=function(key){return $scope[key+"Text"]||self.config[key+"Text"]},$scope.noPrevious=function(){return 1===$scope.page},$scope.noNext=function(){return $scope.page===$scope.totalPages},$scope.$watch("totalItems",(function(){$scope.totalPages=self.calculateTotalPages()})),$scope.$watch("totalPages",(function(value){setNumPages($scope.$parent,value),$scope.page>value?$scope.selectPage(value):ngModelCtrl.$render()}))}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function($parse,paginationConfig){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",template:'',replace:!0,link:function(scope,element,attrs,ctrls){var paginationCtrl=ctrls[0],ngModelCtrl=ctrls[1];if(ngModelCtrl){var maxSize=angular.isDefined(attrs.maxSize)?scope.$parent.$eval(attrs.maxSize):paginationConfig.maxSize,rotate=angular.isDefined(attrs.rotate)?scope.$parent.$eval(attrs.rotate):paginationConfig.rotate;scope.boundaryLinks=angular.isDefined(attrs.boundaryLinks)?scope.$parent.$eval(attrs.boundaryLinks):paginationConfig.boundaryLinks,scope.directionLinks=angular.isDefined(attrs.directionLinks)?scope.$parent.$eval(attrs.directionLinks):paginationConfig.directionLinks,paginationCtrl.init(ngModelCtrl,paginationConfig),attrs.maxSize&&scope.$parent.$watch($parse(attrs.maxSize),(function(value){maxSize=parseInt(value,10),paginationCtrl.render()}));var originalRender=paginationCtrl.render;paginationCtrl.render=function(){originalRender(),scope.page>0&&scope.page<=scope.totalPages&&(scope.pages=function(currentPage,totalPages){var pages=[],startPage=1,endPage=totalPages,isMaxSized=angular.isDefined(maxSize)&&maxSizetotalPages&&(startPage=(endPage=totalPages)-maxSize+1):(startPage=(Math.ceil(currentPage/maxSize)-1)*maxSize+1,endPage=Math.min(startPage+maxSize-1,totalPages)));for(var number=startPage;number<=endPage;number++){var page=makePage(number,number,number===currentPage);pages.push(page)}if(isMaxSized&&!rotate){if(startPage>1){var previousPageSet=makePage(startPage-1,"...",!1);pages.unshift(previousPageSet)}if(endPage0),function(){if(backdropDomEl&&-1==backdropIndex()){var backdropScopeRef=backdropScope;removeAfterAnimate(backdropDomEl,backdropScope,150,(function(){backdropScopeRef.$destroy(),backdropScopeRef=null})),backdropDomEl=void 0,backdropScope=void 0}}()}))}function removeAfterAnimate(domEl,scope,emulateTime,done){scope.animate=!1;var transitionEndEventName=$transition.transitionEndEventName;if(transitionEndEventName){var timeout=$timeout(afterAnimating,emulateTime);domEl.bind(transitionEndEventName,(function(){$timeout.cancel(timeout),afterAnimating(),scope.$apply()}))}else $timeout(afterAnimating);function afterAnimating(){afterAnimating.done||(afterAnimating.done=!0,domEl.remove(),done&&done())}}return $rootScope.$watch(backdropIndex,(function(newBackdropIndex){backdropScope&&(backdropScope.index=newBackdropIndex)})),$document.bind("keydown",(function(evt){var modal;27===evt.which&&(modal=openedWindows.top())&&modal.value.keyboard&&(evt.preventDefault(),$rootScope.$apply((function(){$modalStack.dismiss(modal.key,"escape key press")})))})),$modalStack.open=function(modalInstance,modal){openedWindows.add(modalInstance,{deferred:modal.deferred,modalScope:modal.scope,backdrop:modal.backdrop,keyboard:modal.keyboard});var body=$document.find("body").eq(0),currBackdropIndex=backdropIndex();if(currBackdropIndex>=0&&!backdropDomEl){(backdropScope=$rootScope.$new(!0)).index=currBackdropIndex;var angularBackgroundDomEl=angular.element("
");angularBackgroundDomEl.attr("backdrop-class",modal.backdropClass),backdropDomEl=$compile(angularBackgroundDomEl)(backdropScope),body.append(backdropDomEl)}var angularDomEl=angular.element("
");angularDomEl.attr({"template-url":modal.windowTemplateUrl,"window-class":modal.windowClass,size:modal.size,index:openedWindows.length()-1,animate:"animate"}).html(modal.content);var modalDomEl=$compile(angularDomEl)(modal.scope);openedWindows.top().value.modalDomEl=modalDomEl,body.append(modalDomEl),body.addClass("modal-open")},$modalStack.close=function(modalInstance,result){var modalWindow=openedWindows.get(modalInstance);modalWindow&&(modalWindow.value.deferred.resolve(result),removeModalWindow(modalInstance))},$modalStack.dismiss=function(modalInstance,reason){var modalWindow=openedWindows.get(modalInstance);modalWindow&&(modalWindow.value.deferred.reject(reason),removeModalWindow(modalInstance))},$modalStack.dismissAll=function(reason){for(var topModal=this.getTop();topModal;)this.dismiss(topModal.key,reason),topModal=this.getTop()},$modalStack.getTop=function(){return openedWindows.top()},$modalStack}]).provider("$modal",(function(){var $modalProvider={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function($injector,$rootScope,$q,$http,$templateCache,$controller,$modalStack){var $modal={};return $modal.open=function(modalOptions){var modalResultDeferred=$q.defer(),modalOpenedDeferred=$q.defer(),modalInstance={result:modalResultDeferred.promise,opened:modalOpenedDeferred.promise,close:function(result){$modalStack.close(modalInstance,result)},dismiss:function(reason){$modalStack.dismiss(modalInstance,reason)}};if((modalOptions=angular.extend({},$modalProvider.options,modalOptions)).resolve=modalOptions.resolve||{},!modalOptions.template&&!modalOptions.templateUrl)throw new Error("One of template or templateUrl options is required.");var resolves,promisesArr,options,templateAndResolvePromise=$q.all([(options=modalOptions,options.template?$q.when(options.template):$http.get(angular.isFunction(options.templateUrl)?options.templateUrl():options.templateUrl,{cache:$templateCache}).then((function(result){return result.data})))].concat((resolves=modalOptions.resolve,promisesArr=[],angular.forEach(resolves,(function(value){(angular.isFunction(value)||angular.isArray(value))&&promisesArr.push($q.when($injector.invoke(value)))})),promisesArr)));return templateAndResolvePromise.then((function(tplAndVars){var modalScope=(modalOptions.scope||$rootScope).$new();modalScope.$close=modalInstance.close,modalScope.$dismiss=modalInstance.dismiss;var ctrlInstance,ctrlLocals={},resolveIter=1;modalOptions.controller&&(ctrlLocals.$scope=modalScope,ctrlLocals.$modalInstance=modalInstance,angular.forEach(modalOptions.resolve,(function(value,key){ctrlLocals[key]=tplAndVars[resolveIter++]})),ctrlInstance=$controller(modalOptions.controller,ctrlLocals),modalOptions.controllerAs&&(modalScope[modalOptions.controllerAs]=ctrlInstance)),$modalStack.open(modalInstance,{scope:modalScope,deferred:modalResultDeferred,content:tplAndVars[0],backdrop:modalOptions.backdrop,keyboard:modalOptions.keyboard,backdropClass:modalOptions.backdropClass,windowClass:modalOptions.windowClass,windowTemplateUrl:modalOptions.windowTemplateUrl,size:modalOptions.size})}),(function(reason){modalResultDeferred.reject(reason)})),templateAndResolvePromise.then((function(){modalOpenedDeferred.resolve(!0)}),(function(){modalOpenedDeferred.reject(!1)})),modalInstance},$modal}]};return $modalProvider})),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function($q,$timeout,$rootScope){var $transition=function(element,trigger,options){options=options||{};var deferred=$q.defer(),endEventName=$transition[options.animation?"animationEndEventName":"transitionEndEventName"],transitionEndHandler=function(event){$rootScope.$apply((function(){element.unbind(endEventName,transitionEndHandler),deferred.resolve(element)}))};return endEventName&&element.bind(endEventName,transitionEndHandler),$timeout((function(){angular.isString(trigger)?element.addClass(trigger):angular.isFunction(trigger)?trigger(element):angular.isObject(trigger)&&element.css(trigger),endEventName||deferred.resolve(element)})),deferred.promise.cancel=function(){endEventName&&element.unbind(endEventName,transitionEndHandler),deferred.reject("Transition cancelled")},deferred.promise},transElement=document.createElement("trans");function findEndEventName(endEventNames){for(var name in endEventNames)if(void 0!==transElement.style[name])return endEventNames[name]}return $transition.transitionEndEventName=findEndEventName({WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}),$transition.animationEndEventName=findEndEventName({WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"}),$transition}]),function(){"use strict";angular.module("app").directive("cshSocialMedia",["social",function(social){return{restrict:"A",scope:!0,template:'-
',link:function($scope,element,attributes){element.addClass("social-buttons"),"ontouchstart"in document.documentElement?element.addClass("touch"):element.addClass("no-touch");var img=$("#"+attributes.image),otherSite=attributes.otherSite;$scope.click=function(type,event){switch(event.preventDefault(),type){case 0:social.facebookclick(img,otherSite);break;case 1:social.googleclick(img,otherSite);break;case 2:social.twitterclick(img,otherSite);break;case 3:social.pinitclick(img);break;case 4:social.whatsappclick(img,otherSite)}},$scope.textShares=social.textShares,$scope.showCount="true"==(attributes.showCount||"").toLowerCase(),$scope.countValue=0,$scope.showCount&&social.totalsharecount().then((function(count){$scope.countValue=count})),$scope.visible=function(type){return 3!=type||0!=img.length}}}}])}(),function(){"use strict";angular.module("app").directive("cshRatingInput",(function(){return{restrict:"A",require:"ngModel",template:'
',scope:{rating:"@",max:"=",onRatingSelected:"&",initialValue:"=",halfStarEnabled:"="},link:function(scope,element,attributes,ngModel){var updateStars=function(){scope.stars=[];for(var filledCount=scope.hoverValue&&scope.hoverValue>0?scope.hoverValue:ngModel.$modelValue,i=0;i=filledCount&&filledCount-i!=.5||!filledCount};scope.stars.push(star)}},originalIsEmpty=ngModel.$isEmpty;ngModel.$isEmpty=function(value){return 0===value||originalIsEmpty.call(ngModel,value)},ngModel.$render=function(){updateStars()},scope.toggle=function(index,e){if(!scope.readonly||"true"!==scope.readonly){var half=!1;if(scope.halfStarEnabled){var xpos=void 0===e.offsetX?e.originalEvent.layerX:e.offsetX,width=e.currentTarget.clientWidth;Number(xpos)=200&&status<300||304===status}},_transformResponse:{value:function(response,headers){var headersGetter=this._headersGetter(headers);return forEach($http.defaults.transformResponse,(function(transformFn){response=transformFn(response,headersGetter)})),response}},_parseHeaders:{value:function(headers){var key,val,i,parsed={};return headers?(forEach(headers.split("\n"),(function(line){i=line.indexOf(":"),key=line.slice(0,i).trim().toLowerCase(),val=line.slice(i+1).trim(),key&&(parsed[key]=parsed[key]?parsed[key]+", "+val:val)})),parsed):parsed}},_headersGetter:{value:function(parsedHeaders){return function(name){return name?parsedHeaders[name.toLowerCase()]||null:parsedHeaders}}},_xhrTransport:{value:function(item){var _this=this,xhr=item._xhr=new XMLHttpRequest,form=new FormData;if(this._onBeforeUploadItem(item),forEach(item.formData,(function(obj){forEach(obj,(function(value,key){form.append(key,value)}))})),"number"!=typeof item._file.size)throw new TypeError("The file specified is no longer valid");form.append(item.alias,item._file,item.file.name),xhr.upload.onprogress=function(event){var progress=Math.round(event.lengthComputable?100*event.loaded/event.total:0);_this._onProgressItem(item,progress)},xhr.onload=function(){var headers=_this._parseHeaders(xhr.getAllResponseHeaders()),response=_this._transformResponse(xhr.response,headers),gist=_this._isSuccessCode(xhr.status)?"Success":"Error";_this["_on"+gist+"Item"](item,response,xhr.status,headers),_this._onCompleteItem(item,response,xhr.status,headers)},xhr.onerror=function(){var headers=_this._parseHeaders(xhr.getAllResponseHeaders()),response=_this._transformResponse(xhr.response,headers);_this._onErrorItem(item,response,xhr.status,headers),_this._onCompleteItem(item,response,xhr.status,headers)},xhr.onabort=function(){var headers=_this._parseHeaders(xhr.getAllResponseHeaders()),response=_this._transformResponse(xhr.response,headers);_this._onCancelItem(item,response,xhr.status,headers),_this._onCompleteItem(item,response,xhr.status,headers)},xhr.open(item.method,item.url,!0),xhr.withCredentials=item.withCredentials,forEach(item.headers,(function(value,name){xhr.setRequestHeader(name,value)})),xhr.send(form),this._render()}},_iframeTransport:{value:function(item){var _this=this,form=element('
'),iframe=element('