{"version":3,"sources":["jqExtensions.js","CancelableRequests.js","ChartSerieColorizer.js","ChartSerieNameCreator.js","ConfigurableInfiniteScrollList.js","Core.js","DialogModalManager.js","EstateFilterController.js","EstateMapController.js","EstatePanelContextManager.js","FileUploadManager.js","ImagesDragDropUpload.js","ImagesUploadManager.js","inputSuggestions.js","JqExtensions.js","MapAreaEditor.js","MapCogScoreBox.js","MapHandDrawer.js","MapLabel.js","MapManager.js","MapShadowCircle.js","MapTooltip.js","MapUtils.js","MapValueRangeBox.js","PriceAnalysisMapController.js","RangeSlider.js","SortTableHead.js","SortTypeSelectPositionManager.js","TableManager.js","TooltipCustomClass.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9uBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACh0CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"core.js","sourcesContent":["(function () {\r\n $.fn.numberVal = function (newVal) {\r\n var $input = $(this);\r\n\r\n if (newVal !== undefined) {\r\n $input.val(newVal);\r\n //formatNumericInput($input);\r\n }\r\n else {\r\n var val = $input.val();\r\n\r\n if (val === null || val === undefined || !val.length) {\r\n return null;\r\n }\r\n\r\n return parseFloat(val.replace(/\\./g, \"\"));\r\n }\r\n };\r\n\r\n $.fn.optionsDropDown = function (onCloseDropDownFn) {\r\n $(this).each(function () {\r\n var $this = $(this);\r\n var $checkboxes = $this.find('input[type=checkbox]:not([data-toggle])');\r\n var $toggleAllCheckbox = $this.find('input[type=checkbox][data-toggle-all]');\r\n var $selectBtn = $this.find('button[data-select-button]:first > span');\r\n var $dropdownList = $this.find('.dropdown-menu');\r\n var name = $this.attr('data-name') || $this.attr('data-empty-text');\r\n var textFormattingDisabled = $this.attr('data-disable-text-formatting') !== undefined;\r\n\r\n function refresh() {\r\n var everyChecked = $checkboxes.not(':disabled').length === $checkboxes.not(':disabled').filter(':checked').length && $checkboxes.not(':disabled').length;\r\n $toggleAllCheckbox.prop('checked', everyChecked);\r\n\r\n if (!textFormattingDisabled) {\r\n var options = [];\r\n\r\n $checkboxes.not(':disabled').filter(':checked').each(function () {\r\n options.push($(this).attr('data-label'));\r\n });\r\n\r\n if (options.length) {\r\n if (name) {\r\n var value = '' + name + ': ';\r\n\r\n if (everyChecked) {\r\n value += 'Alle';\r\n } else {\r\n if (options.length === 1) {\r\n value += options[0];\r\n } else {\r\n value += options.length;\r\n }\r\n }\r\n } else {\r\n value = options.join(', ');\r\n }\r\n\r\n $selectBtn.html(value);\r\n } else {\r\n $selectBtn.html(name ? name : '-');\r\n }\r\n }\r\n }\r\n\r\n initOptionsListFields(refresh, $this);\r\n initFilterCheckboxesList($this);\r\n\r\n $dropdownList.add($this.find('*[data-keep-open-on-click]')).click(function (e) {\r\n e.stopPropagation();\r\n });\r\n\r\n $this.on('shown.bs.dropdown',\r\n function () {\r\n $dropdownList.perfectScrollbar('update');\r\n });\r\n\r\n // if (onCloseDropDownFn) {\r\n // $this.on('hidden.bs.dropdown', onCloseDropDownFn);\r\n // }\r\n\r\n refresh();\r\n });\r\n };\r\n\r\n function setCheckboxStateByControllingField(controllingField) {\r\n var $checkboxes = controllingField.find('input[type=checkbox]:not([data-toggle])');\r\n if($checkboxes.length) {\r\n $('[data-observe-controlling-field=\"' + controllingField.data('name') + '\"]').each(function(controlledFieldIndex, controlledField) {\r\n $checkboxes.each(function(checkboxIndex, checkbox) {\r\n if($(controlledField).find('input[type=checkbox][data-label=\"' + $(checkbox).data('label') + '\"]:not([data-toggle])').length) {\r\n $(controlledField).find('input[type=checkbox][data-label=\"' + $(checkbox).data('label') + '\"]:not([data-toggle])').each(function(controlledCheckboxIndex, controlledCheckbox) {\r\n $(controlledCheckbox).prop('checked', $(checkbox).prop('checked'));\r\n });\r\n }\r\n if($(controlledField).find('.checkbox.group-top-node-checkbox[data-label=\"' + $(checkbox).data('label') + '\"]').length) {\r\n $(controlledField).find('.checkbox.group-top-node-checkbox[data-label=\"' + $(checkbox).data('label') + '\"]').each(function(controlledGroupIndex, controlledGroup) {\r\n var groupCheckboxes = $(controlledGroup).next('[data-sub-options]').find('input[type=checkbox]:not([data-toggle])');\r\n var groupToggle = $(controlledField).find('.checkbox.group-top-node-checkbox[data-label=\"' + $(checkbox).data('label') + '\"]').find('input[type=checkbox][data-toggle-tree-node]');\r\n \r\n var checkboxIsChecked = $(checkbox).prop('checked');\r\n\r\n groupCheckboxes.prop('checked', checkboxIsChecked).prop('disabled', !checkboxIsChecked);\r\n groupToggle.prop('disabled', !checkboxIsChecked).prop('checked', checkboxIsChecked).trigger('change');\r\n });\r\n }\r\n \r\n $(controlledField)\r\n .find('input[type=checkbox][data-toggle-all]')\r\n .prop('disabled', !($(controlledField).find('input[type=checkbox]:not([data-toggle]):not(:disabled)').length))\r\n ;\r\n });\r\n });\r\n }\r\n }\r\n\r\n function initOptionsListFields(fn, view) {\r\n 'use strict';\r\n\r\n var $checkboxes = view.find('input[type=checkbox]:not([data-toggle])');\r\n var $toggleNodeCheckboxes = view.find('input[type=checkbox][data-toggle-tree-node]');\r\n var $toggleNodeExpandArrows = view.find(\"img.tree-expand-arrow\");\r\n var $toggleAllCheckbox = view.find('input[type=checkbox][data-toggle-all]');\r\n\r\n setCheckboxGroupStateOnInitialize(view);\r\n\r\n $checkboxes.change(function () {\r\n var $checkbox = $(this);\r\n var $list = $checkbox.closest('ul');\r\n if($('[data-observe-controlling-field=\"' + view.data('name') + '\"]').length) {\r\n setCheckboxStateByControllingField(view);\r\n }\r\n\r\n if ($list.is('[data-sub-options]')) {\r\n var anyNodeWithCategoryChecked = $list.closest('ul').find('input[type=checkbox]:checked').length > 0;\r\n var anyNodeWithoutCategoryChecked = $list.parents('li[data-group-top-node]').find('ul[data-sub-options]').last().find('input[type=checkbox]:checked').length > 0;\r\n\r\n var $toggleNodeCheckbox = $list.parents('li[data-group-top-node]').find('input[type=checkbox][data-toggle-tree-node]:first');\r\n var $toggleLocalNodeCheckbox = $list.parent('li[data-group-top-node]').find('input[type=checkbox][data-toggle-tree-node]:first');\r\n\r\n $toggleNodeCheckbox.prop('checked', (anyNodeWithCategoryChecked || anyNodeWithoutCategoryChecked));\r\n\r\n var anyWithinLocalNodeChecked = $list.parent('li[data-group-top-node]').find('input[type=checkbox]:checked').length > 1;\r\n $toggleLocalNodeCheckbox.prop('checked', anyWithinLocalNodeChecked);\r\n }\r\n\r\n fn();\r\n });\r\n\r\n $toggleAllCheckbox.change(function () {\r\n var selectAll = $toggleAllCheckbox.is(':checked');\r\n\r\n $checkboxes.not(':disabled').prop('checked', selectAll);\r\n $toggleNodeCheckboxes.not(':disabled').prop('checked', selectAll);\r\n \r\n setCheckboxStateByControllingField($(this).parents('[data-options-dropdown]'));\r\n fn();\r\n });\r\n\r\n $toggleNodeCheckboxes.change(function () {\r\n var $checkbox = $(this);\r\n var $toggleNodeCheckbox = $checkbox.parents('li[data-group-top-node]').find('input[type=checkbox][data-toggle-tree-node]:first');\r\n var $nodeCheckboxes = $checkbox.closest('li').find('input[type=checkbox]:not(:disabled)');\r\n var anyNodeWithoutCategoryChecked = $checkbox.closest('ul').parents('li[data-group-top-node]').find('ul[data-sub-options]').last().find('input[type=checkbox]:checked').length > 0;\r\n\r\n var check = $checkbox.is(':checked');\r\n\r\n $toggleNodeCheckbox.prop('checked', check || anyNodeWithoutCategoryChecked);\r\n $nodeCheckboxes.prop('checked', check);\r\n\r\n var $parentGroup = $checkbox.parents('ul[data-sub-options]');\r\n if ($parentGroup.length) {\r\n toggleParentCheckboxGroup($parentGroup);\r\n }\r\n\r\n fn();\r\n });\r\n\r\n $toggleNodeExpandArrows.click(function () {\r\n var $icon = $(this);\r\n var $nodeCheckboxes = $icon.closest('li').find('ul');\r\n\r\n $nodeCheckboxes.toggle();\r\n $icon.toggleClass(\"fold\");\r\n });\r\n }\r\n\r\n function setCheckboxGroupStateOnInitialize(view) {\r\n var $lastLevelCheckboxesGroup = view.find('ul[data-sub-options]:not([data-group])');\r\n $lastLevelCheckboxesGroup.each(function () {\r\n let $lastLevelGroup = $(this);\r\n toggleParentCheckboxGroup($lastLevelGroup);\r\n });\r\n }\r\n\r\n function toggleParentCheckboxGroup($group) {\r\n var $notCheckedInGroup = $group.find('>li .checkbox input[type=\"checkbox\"]:not(:checked)');\r\n var $topNodeGroupCheckbox = $group.prev('.checkbox');\r\n if ($topNodeGroupCheckbox.length) {\r\n var isAllChecked = $notCheckedInGroup.length === 0;\r\n $topNodeGroupCheckbox.children('input[type=\"checkbox\"]').prop('checked', isAllChecked);\r\n }\r\n var $parentGroup = $group.parents('ul[data-sub-options]');\r\n if ($parentGroup.length) {\r\n toggleParentCheckboxGroup($parentGroup);\r\n }\r\n }\r\n\r\n function initFilterCheckboxesList(view) {\r\n var $checkboxes = view.find('li[data-group]');\r\n var $lastLevelCheckboxesGroup = view.find('ul[data-sub-options]:not([data-group])');\r\n var $allTopNodesGroup = view.find('li[data-group-top-node]');\r\n var $filterInput = view.find('[data-filter-input]');\r\n var $dropdownList = view.find('.dropdown-menu');\r\n var $selectAllItem = view.find('.select-all-item');\r\n\r\n setCheckboxStateByControllingField(view);\r\n\r\n if ($filterInput.length) {\r\n $filterInput.on(\"input\", function () {\r\n var term = $(this).val();\r\n $allTopNodesGroup.removeClass('hidden-group-top-node-checkbox');\r\n $checkboxes.show().unmark();\r\n $selectAllItem.show();\r\n if (term) {\r\n $checkboxes.mark(term, {\r\n separateWordSearch: false,\r\n diacritics: false,\r\n done: function () {\r\n $checkboxes.not(\":has(mark)\").hide();\r\n $selectAllItem.hide();\r\n hideEmptyTopNodes();\r\n }\r\n });\r\n }\r\n $dropdownList.perfectScrollbar('update');\r\n });\r\n\r\n view.on('hidden.bs.dropdown',\r\n function () {\r\n $checkboxes.show().unmark();\r\n $filterInput.val('');\r\n $selectAllItem.show();\r\n $allTopNodesGroup.removeClass('hidden-group-top-node-checkbox');\r\n });\r\n }\r\n\r\n function hideEmptyTopNodes() {\r\n $lastLevelCheckboxesGroup.each(function () {\r\n let $lastLevelGroup = $(this);\r\n let $downListVisibleCheckboxes = $lastLevelGroup.find('li[data-group]:visible');\r\n let $allParentsTopNode = $lastLevelGroup.parents('li[data-group-top-node]');\r\n if ($downListVisibleCheckboxes.length) {\r\n $allParentsTopNode.removeClass('hidden-group-top-node-checkbox');\r\n } else {\r\n $allParentsTopNode.addClass('hidden-group-top-node-checkbox');\r\n }\r\n });\r\n }\r\n }\r\n\r\n $.fn.postalCodeInput = function () {\r\n function filterChars($input) {\r\n $input.val($input.val().replace(/[^\\d].+/, ''));\r\n }\r\n\r\n function format($input) {\r\n var value = $input.val();\r\n\r\n for (var i = value.length; i < 5; i++) {\r\n value = '0' + value;\r\n }\r\n\r\n $input.val(value);\r\n }\r\n\r\n $(this).each(function () {\r\n var $this = $(this);\r\n\r\n $this.on('keypress keyup blur', function (e) {\r\n filterChars($this);\r\n\r\n if (e.which < 48 || e.which > 57) {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n $this.on('blur', function (e) {\r\n format($this);\r\n });\r\n\r\n filterChars($this);\r\n format($this);\r\n });\r\n };\r\n\r\n $.fn.numberRangeFields = function() {\r\n $(this).each(function() {\r\n var $this = $(this);\r\n $this.attr('data-number-range-initialized', '');\r\n\r\n var inputFrom = $this.find('[data-input-from]');\r\n var inputTo = $this.find('[data-input-to]');\r\n\r\n inputFrom.on('change', function() {\r\n var currentValue = AutoNumeric.getAutoNumericElement($(this).get(0)).getNumber();\r\n var rangeBox = $(this).parents('[data-number-range]');\r\n var inputTo = rangeBox.find('[data-input-to]');\r\n var currentMaxValue = AutoNumeric.getAutoNumericElement(inputTo.get(0)).getNumber();\r\n if(inputTo.val() == '' || currentMaxValue == 0) {\r\n currentMaxValue = parseFloat(rangeBox.data('max'));\r\n }\r\n if(currentValue > currentMaxValue) {\r\n AutoNumeric.getAutoNumericElement($(this).get(0)).set(currentMaxValue);\r\n }\r\n });\r\n\r\n inputTo.on('change', function() {\r\n var currentValue = AutoNumeric.getAutoNumericElement($(this).get(0)).getNumber();\r\n var rangeBox = $(this).parents('[data-number-range]');\r\n var inputFrom = rangeBox.find('[data-input-from]');\r\n var currentMinValue = AutoNumeric.getAutoNumericElement(inputFrom.get(0)).getNumber();\r\n if(inputFrom.val() == '' || currentMinValue == 0) {\r\n currentMinValue = parseFloat(rangeBox.data('min'));\r\n }\r\n if(currentValue < currentMinValue) {\r\n AutoNumeric.getAutoNumericElement($(this).get(0)).set(currentMinValue);\r\n }\r\n\r\n });\r\n });\r\n }\r\n setTimeout(function() {\r\n $('[data-number-range]:not([data-number-range-initialized]').numberRangeFields();\r\n });\r\n\r\n})();\r\n\r\n//$.fn.enableNumeric = function () {\r\n// var $input = $(this);\r\n\r\n// if (!$input.is('input, textarea')) {\r\n// throw 'Trying to enable numeric formatter on element being not input nor textarea.';\r\n// }\r\n\r\n// formatNumericInput($input);\r\n\r\n// $input.on('change paste keyup', function () {\r\n// formatNumericInput($input);\r\n// });\r\n//};\r\n\r\n//function formatNumericInput($input) {\r\n// $input.val(format.call($input.val().split('.').join(''), '.', ','));\r\n//}\r\n\r\n//function format(comma, period) {\r\n// comma = comma || ',';\r\n// period = period || '.';\r\n// var split = this.toString().split('.');\r\n// var numeric = split[0];\r\n// var decimal = split.length > 1 ? period + split[1] : '';\r\n// var reg = /(\\d+)(\\d{3})/;\r\n// while (reg.test(numeric)) {\r\n// numeric = numeric.replace(reg, '$1' + comma + '$2');\r\n// }\r\n// return numeric + decimal;\r\n//}","var CancelableRequests = (function () {\r\n var requests = {};\r\n\r\n return {\r\n add: function (name, jqxhr) {\r\n requests[name] = jqxhr;\r\n },\r\n\r\n abort: function (name) {\r\n var lastJqxhr = requests[name];\r\n\r\n if (lastJqxhr) {\r\n lastJqxhr.abort();\r\n delete requests[name];\r\n }\r\n },\r\n\r\n // abort + add\r\n register: function (name, jqxhr) {\r\n var lastJqxhr = requests[name];\r\n\r\n if (lastJqxhr) {\r\n lastJqxhr.abort();\r\n }\r\n\r\n requests[name] = jqxhr;\r\n }\r\n };\r\n})();","var ChartSerieColorizer = function () {\r\n 'use strict';\r\n\r\n var LINE_CHART_COLORS = [\r\n \"#1f59a6\", \"#f1c40f\", \"#2ecc71\", \"#e67e22\", \"#9b59b6\", \"#27ae60\", \"#95a5a6\",\r\n \"#f39c12\", \"#c0392b\", \"#1abc9c\", \"#8e44ad\", \"#7f8c8d\", \"#bdc3c7\", \"#2980b9\",\r\n \"#d35400\", \"#34495e\", \"#ecf0f1\", \"#e74c3c\", \"#16a085\", \"#2c3e50\"\r\n ];\r\n\r\n var self = this;\r\n var elementsWithAssignedColor = [];\r\n var serieDynamicCount = 0;\r\n var serieCount = 0;\r\n var dynamicInitialization = false;\r\n\r\n function initializeSerieColors(serie) {\r\n if (!elementsWithAssignedColor.some(x => x.name == serie.Name)) {\r\n var color = LINE_CHART_COLORS[serieCount++ % LINE_CHART_COLORS.length];\r\n elementsWithAssignedColor.push({ name: serie.Name, color: color });\r\n }\r\n }\r\n\r\n self.getFor = function (serie) {\r\n if (dynamicInitialization) {\r\n return LINE_CHART_COLORS[serieDynamicCount++ % LINE_CHART_COLORS.length];\r\n } else {\r\n return elementsWithAssignedColor.find(x => x.name === serie.Name).color;\r\n }\r\n }\r\n\r\n self.init = function (series) {\r\n if (series === undefined || series === null)\r\n throw 'Series must not be null or undefined';\r\n\r\n if (series.length > LINE_CHART_COLORS.length) {\r\n serieDynamicCount = 0;\r\n dynamicInitialization = true;\r\n } else {\r\n series.forEach(initializeSerieColors);\r\n dynamicInitialization = false;\r\n }\r\n };\r\n}","var ChartSerieNameCreator = function(withTotalCount) {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n function getNameWithTotalCount(serie) {\r\n var totalCount = 0;\r\n\r\n serie.Values.forEach(function(val) {\r\n var getNestedValues = function(obj) {\r\n var result = obj;\r\n\r\n if (result.Value === undefined) {\r\n return result.reduce((a, b) => a + b, 0);\r\n } else {\r\n if (Array.isArray(obj.Value)) {\r\n return getNestedValues(obj.Value.map(o => o.Value));\r\n }\r\n }\r\n\r\n return result['Value'];\r\n }\r\n var res = getNestedValues(val);\r\n totalCount += res;\r\n });\r\n\r\n totalCount = AutoNumeric.toIntNumberString(totalCount);\r\n\r\n return `${serie.Name} (${totalCount})`;\r\n }\r\n\r\n self.getFor = function(serie) {\r\n if (withTotalCount) {\r\n return getNameWithTotalCount(serie);\r\n } else {\r\n return serie.Name;\r\n }\r\n }\r\n}","/**\r\n *\r\n * settings = {\r\n * getResultsNextPageUrl,\r\n * onLoading,\r\n * resultsPageData,\r\n * onResultsAppend,\r\n * onLoaded,\r\n * onInitialised,\r\n * windowScrollBreakpoint,\r\n * scrollableWrapper, //fixed infinity scroll on 4k screens. Set for ex.: '#scrollableActivitiesTableWrapper .responsive-results-table' or for WINDOW scroll: '.page-container > .main-content'\r\n * },\r\n * scrollType: CONTAINER, WINDOW, CHANGE_ON_BREAKPOINT\r\n */\r\n\r\nvar ConfigurableInfiniteScrollList = function (resultsListElement, settings, scrollType) {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n scrollType = scrollType || 'CONTAINER';\r\n\r\n const RESULTS_REQUEST_NAME = \"resultsLoading-\" + Math.random().toString(36).substring(2, 20);\r\n\r\n var $resultsListElement = null;\r\n var $resultsListContainer = null;\r\n\r\n var initialising = false;\r\n var resultsPageLoading = false;\r\n var resultsCurrentPage = 0;\r\n var resultsMaxPageReached = false;\r\n\r\n function setScrollableWrapperHeight(wrapperEl) {\r\n var cssHeightUnit = scrollType === \"WINDOW\" ? \"vh\" : \"%\";\r\n $(wrapperEl).css(\"min-height\", \"110\" + cssHeightUnit);\r\n }\r\n\r\n function loadResultsNextPage() {\r\n resultsPageLoading = true;\r\n\r\n if (typeof (settings.onLoading) === 'function') {\r\n settings.onLoading();\r\n }\r\n\r\n if (typeof (settings.onNextPageLoading) === 'function') {\r\n settings.onNextPageLoading();\r\n }\r\n\r\n var data = {\r\n PageNumber: resultsCurrentPage + 1\r\n };\r\n\r\n if (typeof (settings.resultsPageData) === 'function') {\r\n settings.resultsPageData(data);\r\n }\r\n\r\n $.post(settings.getResultsNextPageUrl, data)\r\n .done(function (res) {\r\n $resultsListElement.append(res.ContentHtml);\r\n\r\n if (typeof (settings.onResultsAppend) === 'function') {\r\n settings.onResultsAppend(res);\r\n }\r\n\r\n if (settings.scrollableWrapper) {\r\n setScrollableWrapperHeight(settings.scrollableWrapper);\r\n }\r\n\r\n if (res.IsLastPage) {\r\n resultsMaxPageReached = true;\r\n }\r\n else {\r\n resultsCurrentPage++;\r\n }\r\n })\r\n .always(onAfterLoadedActions);\r\n }\r\n\r\n function reloadResults() {\r\n CancelableRequests.abort(RESULTS_REQUEST_NAME);\r\n\r\n resultsPageLoading = true;\r\n\r\n if (typeof (settings.onLoading) === 'function') {\r\n settings.onLoading();\r\n }\r\n\r\n if (typeof (settings.onFullReloadLoading) === 'function') {\r\n settings.onFullReloadLoading();\r\n }\r\n\r\n var data = {\r\n PageNumber: resultsCurrentPage + 1\r\n };\r\n\r\n if (typeof (settings.resultsPageData) === 'function') {\r\n settings.resultsPageData(data);\r\n }\r\n\r\n CancelableRequests.add(RESULTS_REQUEST_NAME, $.post(settings.getResultsNextPageUrl, data)\r\n .done(function (res) {\r\n $resultsListElement.html(res.ContentHtml);\r\n\r\n if (typeof (settings.onResultsAppend) === 'function') {\r\n settings.onResultsAppend(res);\r\n }\r\n\r\n if (settings.scrollableWrapper) {\r\n setScrollableWrapperHeight(settings.scrollableWrapper);\r\n }\r\n\r\n if (scrollType === 'CONTAINER' || scrollType === 'CHANGE_ON_BREAKPOINT') {\r\n $resultsListContainer.scrollTop(0);\r\n }\r\n\r\n if (res.IsLastPage) {\r\n resultsMaxPageReached = true;\r\n }\r\n else {\r\n resultsCurrentPage++;\r\n }\r\n })\r\n .always(onAfterLoadedActions)\r\n );\r\n }\r\n\r\n function onAfterLoadedActions() {\r\n resultsPageLoading = false;\r\n\r\n if (typeof (settings.onLoaded) === 'function') {\r\n settings.onLoaded();\r\n }\r\n\r\n if (initialising) {\r\n initialising = false;\r\n\r\n if (typeof (settings.onInitialised) === 'function') {\r\n settings.onInitialised();\r\n }\r\n }\r\n }\r\n\r\n function onResultsListContainerScroll() {\r\n if (!resultsPageLoading && !resultsMaxPageReached) {\r\n var distance = $resultsListElement.height() - ($resultsListContainer.scrollTop() + $resultsListContainer.height());\r\n\r\n if (distance <= 500) {\r\n loadResultsNextPage();\r\n }\r\n }\r\n }\r\n\r\n function onResultsListWindowScroll() {\r\n if (!resultsPageLoading && !resultsMaxPageReached) {\r\n var distance = $(document).height() - ($(window).scrollTop() + $(window).height());\r\n\r\n if (distance <= 500) {\r\n loadResultsNextPage();\r\n }\r\n }\r\n }\r\n\r\n function hookUpBreakpointEventListener() {\r\n if (settings.windowScrollBreakpoint.matches) {\r\n $(window).off('scroll', onResultsListWindowScroll);\r\n hookUpContainerEventListener();\r\n } else {\r\n $(window).on('scroll', onResultsListWindowScroll);\r\n }\r\n }\r\n\r\n function hookUpContainerEventListener() {\r\n $resultsListContainer.on('scroll', onResultsListContainerScroll);\r\n }\r\n function hookUpWindowEventListener() {\r\n $(window).on('scroll', onResultsListWindowScroll);\r\n }\r\n\r\n\r\n self.removeScrollEvents = function () {\r\n if (settings.windowScrollBreakpoint) {\r\n settings.windowScrollBreakpoint.removeListener(hookUpBreakpointEventListener);\r\n }\r\n $(window).off('scroll', onResultsListWindowScroll);\r\n };\r\n\r\n self.init = function () {\r\n $resultsListElement = $(resultsListElement);\r\n initialising = true;\r\n resultsPageLoading = false;\r\n resultsCurrentPage = 0;\r\n resultsMaxPageReached = false;\r\n\r\n if (scrollType === 'CONTAINER' || scrollType === 'CHANGE_ON_BREAKPOINT') {\r\n $resultsListContainer = $resultsListElement.closest('[data-infinite-list-container]');\r\n\r\n if (!$resultsListContainer.length) {\r\n $resultsListContainer = settings.listContainerID ? $resultsListElement.closest('#' + settings.listContainerID) : $resultsListElement.parent();\r\n }\r\n }\r\n\r\n initialising = true;\r\n\r\n if (typeof (settings.onInitialising) === 'function') {\r\n settings.onInitialising();\r\n }\r\n\r\n switch (scrollType) {\r\n case 'CONTAINER':\r\n hookUpContainerEventListener();\r\n break;\r\n case 'WINDOW':\r\n hookUpWindowEventListener();\r\n break;\r\n case 'CHANGE_ON_BREAKPOINT':\r\n settings.windowScrollBreakpoint.addListener(hookUpBreakpointEventListener);\r\n hookUpBreakpointEventListener();\r\n break;\r\n }\r\n\r\n reloadResults();\r\n };\r\n\r\n self.reloadResults = function () {\r\n resultsCurrentPage = 0;\r\n resultsMaxPageReached = false;\r\n\r\n reloadResults();\r\n };\r\n}","var AppCore = (function () {\r\n 'use strict';\r\n\r\n // Handle AJAX error reponses\r\n $(document).ajaxError(function (e, xhr) {\r\n if (xhr.status > 0) {\r\n switch (xhr.status) {\r\n case 401:\r\n var response = $.parseJSON(xhr.responseText);\r\n window.location = response.LogOnUrl;\r\n break;\r\n\r\n case 403:\r\n alert('Permission denied');\r\n break;\r\n\r\n //default:\r\n // alert('AJAX error: ' + xhr.status + '\\n\\n' + xhr.responseText);\r\n }\r\n }\r\n });\r\n\r\n // Set bootstrap modal defaults\r\n var modalDefaults = $.fn.modal.prototype.constructor.Constructor.Default;\r\n modalDefaults.backdrop = 'static';\r\n modalDefaults.keyboard = false;\r\n\r\n var areaEditorMap = null;\r\n\r\n // Handle clicking on selectable table rows\r\n $('.table-striped-selectable tr').click(function () {\r\n $('.table-striped-selectable tr').removeClass('active');\r\n $(this).toggleClass('active');\r\n });\r\n\r\n // Prevent dropdown menus from hiding when clicking checkboxes\r\n $(document).on('click', '.dropdown-menu.dropdown-menu-form, .dropdown[data-options-dropdown] .dropdown-menu', function (e) {\r\n e.stopPropagation();\r\n });\r\n\r\n // Disable submit forms when press enter \r\n $('form[data-prevent-enter-submit]').keypress(\r\n function (event) {\r\n if (event.which == '13') {\r\n var $target = $(event.target);\r\n if ($target.is('input')) {\r\n $target.blur();\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n $(document).on('click', '[data-set-form-redirect-type]', function() {\r\n $(this).parents('form').find('[data-form-redirect-type-input]').val($(this).data('value'));\r\n });\r\n\r\n // Disable submit button after submit form\r\n $('form').each(function () {\r\n $(this).submit(function () {\r\n $(this).find(':submit').prop('disabled', true);\r\n });\r\n });\r\n\r\n // Disable pointer events on attributed elements for a moment when scrolling the main window\r\n $(window).scroll(function () {\r\n const DELAY = 150;\r\n\r\n if (window.__scrollEventsTimeout) {\r\n clearTimeout(window.__scrollEventsTimeout);\r\n window.__scrollEventsTimeout = null;\r\n }\r\n\r\n var $elements = $('[data-disable-scroll-events]');\r\n\r\n if ($elements.length > 0) {\r\n $elements.each(function () {\r\n var $el = $(this);\r\n\r\n if (!$el.data('scrollEventsInitialValue')) {\r\n $el.data('scrollEventsInitialValue', $el.css('pointer-events'));\r\n $el.css('pointer-events', 'none');\r\n }\r\n });\r\n\r\n window.__scrollEventsTimeout = setTimeout(function () {\r\n $elements.each(function () {\r\n var $el = $(this);\r\n\r\n $el.css('pointer-events', $el.data('scrollEventsInitialValue'));\r\n $el.data('scrollEventsInitialValue', null);\r\n });\r\n\r\n window.__scrollEventsTimeout = null;\r\n }, DELAY);\r\n }\r\n });\r\n\r\n //scrollable popover with content: data-html-content-scrollable-popover\r\n function initializeScrollablePopovers() {\r\n var $scrollablePopovers = $('[data-html-content-scrollable-popover]');\r\n $scrollablePopovers.each(function () {\r\n if ($(this).hasClass('popover-initialized')) {\r\n return;\r\n }\r\n var popoverClass = $(this).attr('data-popover-class');\r\n var popoverBodyClass = $(this).attr('data-popover-body-class');\r\n var $popoverHandler = $(this).find('[data-popover-handler]');\r\n var $popoverContent = $(this).find('[data-popover-content]');\r\n var popoverPlacement = $(this).attr('data-popover-placement') || 'bottom';\r\n var hideOnContainerScroll = $(this).attr('data-hide-on-container-scroll');\r\n\r\n $popoverHandler.popover({\r\n html: true,\r\n trigger: 'manual',\r\n placement: popoverPlacement,\r\n content: function () {\r\n var htmlContent = $popoverContent.html();\r\n return htmlContent;\r\n },\r\n template: `

`\r\n })\r\n .on(\"mouseenter\", function () {\r\n var _this = this;\r\n $(this).popover(\"show\");\r\n $(\".popover\").on(\"mouseleave\", function () {\r\n $(_this).popover('hide');\r\n });\r\n }).on(\"mouseleave\", function () {\r\n var _this = this;\r\n setTimeout(function () {\r\n if (!$(\".popover:hover\").length) {\r\n $(_this).popover(\"hide\");\r\n }\r\n }, 150);\r\n })\r\n .on(\"click\", function (e) {\r\n e.stopPropagation();\r\n });\r\n\r\n $popoverHandler.on('shown.bs.popover', function () {\r\n var popupId = $(this).attr('aria-describedby');\r\n var $popupBody = $('#' + popupId + ' .popover-body');\r\n if ($popupBody) {\r\n if ($popupBody.hasClass('ps-active-y')) {\r\n $popupBody.perfectScrollbar('update');\r\n } else {\r\n $popupBody.perfectScrollbar();\r\n }\r\n }\r\n });\r\n\r\n $(window).on('scroll', function () {\r\n $popoverHandler.popover('hide');\r\n });\r\n\r\n if (hideOnContainerScroll) {\r\n $(hideOnContainerScroll).on('scroll', function () {\r\n $popoverHandler.popover('hide');\r\n });\r\n }\r\n \r\n\r\n $(this).addClass('popover-initialized');\r\n });\r\n }\r\n\r\n function initializeSidebarFilterToggle(largeDeviceMatchMedia) {\r\n var $viewWrapper = $('[data-filter-sidebar-and-content-wrapper]');\r\n\r\n $('.btn-filter-toggle, .filter-side-bar .collapsed-sidebar-label').on('click', filterSidebarToggle);\r\n\r\n showFilterSidebarOnLargeScreen();\r\n largeDeviceMatchMedia.addListener(showFilterSidebarOnLargeScreen);\r\n\r\n function showFilterSidebarOnLargeScreen() {\r\n var isLargeDevice = largeDeviceMatchMedia.matches;\r\n\r\n $viewWrapper.toggleClass('filter-sidebar-collapsed', !isLargeDevice);\r\n $viewWrapper.find('.dynamic-content-wrapper').removeClass('blur');\r\n $('html').removeClass('tablet-filter-sidebar-open');\r\n }\r\n\r\n function filterSidebarToggle() {\r\n $viewWrapper.toggleClass('filter-sidebar-collapsed');\r\n\r\n var isSidebarOpen = !$viewWrapper.hasClass('filter-sidebar-collapsed');\r\n if (!largeDeviceMatchMedia.matches) {\r\n $viewWrapper.find('.dynamic-content-wrapper').toggleClass('blur', isSidebarOpen);\r\n $('html').toggleClass('tablet-filter-sidebar-open', isSidebarOpen);\r\n }\r\n }\r\n }\r\n\r\n function initializeDistanceChart($distanceChart) {\r\n if (!$distanceChart) {\r\n return;\r\n }\r\n\r\n var value = $distanceChart.data('distance');\r\n var activeIndex = calculateActiveStepIndex(value);\r\n\r\n var $axis = $distanceChart.find('.axis');\r\n\r\n if (activeIndex < 3) {\r\n $axis.addClass('start-scale-label-hidden');\r\n }\r\n\r\n if (activeIndex > 17) {\r\n $axis.addClass('end-scale-label-hidden');\r\n }\r\n\r\n for (var i = 0; i < 20; i++) {\r\n var step = null;\r\n if (i === activeIndex) {\r\n step = '
  • ' + value + ' km
  • ';\r\n } else {\r\n step = '
  • ';\r\n }\r\n $axis.append($(step));\r\n }\r\n\r\n function calculateActiveStepIndex(val) {\r\n if (val >= 100) {\r\n return 19;\r\n }\r\n var rest = val % 10;\r\n var roundToFloor = val - rest;\r\n\r\n var position = roundToFloor / 5;\r\n if (rest > 5) {\r\n position++;\r\n }\r\n\r\n return position;\r\n }\r\n }\r\n\r\n return {\r\n initializeDataTables: function () {\r\n $.extend(true, $.fn.dataTable.defaults, {\r\n language: {\r\n emptyTable: 'Keine Ergebnisse',\r\n paginate: {\r\n previous: '',\r\n next: ''\r\n },\r\n info: 'Zeige Seite _PAGE_ von _PAGES_'\r\n },\r\n dom:\r\n \"<'row'<'col-sm-12'tr>>\" +\r\n \"<'mt-3'<'row'<'col'i><'col'<'float-right'p>>>>\",\r\n searching: true,\r\n ordering: true,\r\n info: false,\r\n lengthChange: false,\r\n processing: false,\r\n autoWidth: false\r\n });\r\n\r\n $.fn.dataTable.render.ordinalNumber = function () {\r\n return function (data, type, row, meta) {\r\n return (meta.row + meta.settings._iDisplayStart + 1) + '.';\r\n };\r\n };\r\n\r\n $(document).on('processing.dt', function (e, settings, processing) {\r\n var $table = $(e.target);\r\n var $wrapper = $table.closest('.dataTables_wrapper');\r\n var $loadableElements = $()\r\n .add($('[data-processing-disable=\"' + $table.attr('id') + '\"]'))\r\n .add($table.find('> *'))\r\n .add($wrapper.find('.dataTables_info'))\r\n .add($wrapper.find('.dataTables_paginate'));\r\n\r\n $loadableElements.toggleClass('loading', processing);\r\n });\r\n },\r\n\r\n initializeAutoNumeric: function () {\r\n\r\n var defaultOptions = { decimalPlaces: 2, /*allowDecimalPadding: false,*/ showWarnings: false, maximumValue: 25000000000000 };\r\n var intOptions = { decimalPlaces: 0, watchExternalChanges: true };\r\n var decimalOptions = {};\r\n var currencyOptions = {};\r\n var areaOptions = {};\r\n var coordsOptions = { decimalPlaces: 8, allowDecimalPadding: false, minimumValue: \"-180\", maximumValue: \"180\" };\r\n var numberStringOptions = { digitGroupSeparator: \"\", decimalCharacter: \",\", currencySymbol: \"\", allowDecimalPadding: false, maximumValue: 25000000000000 };\r\n var loadNumberOptions = {\r\n minimumValue: \"0\", decimalPlaces: 2, allowDecimalPadding: false, wheelOn: \"focus\",\r\n }\r\n var positiveDecimalOptions = { decimalPlaces: 2, minimumValue: \"0\" };\r\n var positiveIntOptions = { decimalPlaces: 0, minimumValue: \"0\" };\r\n\r\n defaultOptions = $.extend({}, AutoNumeric.getPredefinedOptions().commaDecimalCharDotSeparator, defaultOptions);\r\n\r\n intOptions = $.extend({}, defaultOptions, intOptions);\r\n decimalOptions = $.extend({}, defaultOptions, decimalOptions);\r\n currencyOptions = $.extend({}, defaultOptions, currencyOptions);\r\n areaOptions = $.extend({}, defaultOptions, areaOptions);\r\n coordsOptions = $.extend({}, defaultOptions, coordsOptions);\r\n loadNumberOptions = $.extend({}, defaultOptions, loadNumberOptions);\r\n positiveDecimalOptions = $.extend({}, defaultOptions, positiveDecimalOptions);\r\n positiveIntOptions = $.extend({}, defaultOptions, positiveIntOptions);\r\n\r\n AutoNumeric.defaultOptions = defaultOptions;\r\n\r\n AutoNumeric.toNumber = function (data) {\r\n if (data) {\r\n\r\n if (typeof (data) == 'string') {\r\n data = AutoNumeric.unformat(data, AutoNumeric.defaultOptions);\r\n }\r\n\r\n var number = Number(data);\r\n\r\n return number ? number : null;\r\n }\r\n return null;\r\n };\r\n\r\n AutoNumeric.toNumberString = function (data) {\r\n\r\n var number = AutoNumeric.toNumber(data);\r\n\r\n return number ? AutoNumeric.format(number, numberStringOptions) : null;\r\n }\r\n\r\n AutoNumeric.toAreaNumberString = function (data) {\r\n if (data) {\r\n\r\n return AutoNumeric.format(AutoNumeric.toNumber(data), areaOptions);\r\n }\r\n return null;\r\n }\r\n\r\n AutoNumeric.toCurrencyNumberString = function (data) {\r\n if (data) {\r\n\r\n return AutoNumeric.format(AutoNumeric.toNumber(data), currencyOptions);\r\n }\r\n return null;\r\n }\r\n\r\n AutoNumeric.toDecimalNumberString = function (data) {\r\n if (data) {\r\n\r\n return AutoNumeric.format(AutoNumeric.toNumber(data), decimalOptions);\r\n }\r\n return null;\r\n }\r\n\r\n AutoNumeric.toIntNumberString = function (data) {\r\n if (data) {\r\n return AutoNumeric.format(AutoNumeric.toNumber(data), intOptions);\r\n }\r\n return null;\r\n }\r\n\r\n AutoNumeric.toDecimalCoordsNumberString = function (data) {\r\n if (data) {\r\n\r\n return AutoNumeric.format(AutoNumeric.toNumber(data), coordsOptions);\r\n }\r\n return null;\r\n }\r\n\r\n AutoNumeric.toPositiveDecimalNumberString = function (data) {\r\n if (data) {\r\n\r\n return AutoNumeric.format(AutoNumeric.toNumber(data), positiveDecimalOptions);\r\n }\r\n return null;\r\n }\r\n\r\n AutoNumeric.toPositiveIntNumberString = function (data) {\r\n if (data) {\r\n\r\n return AutoNumeric.format(AutoNumeric.toNumber(data), positiveIntOptions);\r\n }\r\n return null;\r\n }\r\n\r\n function applyAutoNumeric(el, type, value) {\r\n var an = null;\r\n if (!AutoNumeric.test(el)) {\r\n type = type ? type : $(el).data('autonumeric');\r\n var options = $.extend({}, defaultOptions);\r\n\r\n switch (type) {\r\n case \"int\":\r\n options = $.extend({}, intOptions);\r\n break;\r\n case \"decimal\":\r\n options = $.extend({}, decimalOptions);\r\n break;\r\n case \"currency\":\r\n options = $.extend({}, currencyOptions);\r\n break;\r\n case \"area\":\r\n options = $.extend({}, areaOptions);\r\n break;\r\n case \"coords\":\r\n options = $.extend({}, coordsOptions);\r\n break;\r\n case \"loadNumber\":\r\n options = $.extend({}, loadNumberOptions);\r\n break;\r\n case \"positiveDecimal\":\r\n options = $.extend({}, positiveDecimalOptions);\r\n break;\r\n case \"positiveInt\":\r\n options = $.extend({}, positiveIntOptions);\r\n break;\r\n }\r\n\r\n if ($(el).data('maxValue')) {\r\n var maxValue = Number($(el).data('maxValue'));\r\n if (!isNaN(maxValue)) {\r\n options.maximumValue = $(el).data('maxValue');\r\n }\r\n }\r\n\r\n var an = new AutoNumeric(el, options);\r\n $(el).data('autonumeric', type);\r\n }\r\n else {\r\n an = AutoNumeric.getAutoNumericElement(el);\r\n }\r\n\r\n if (an && $.isNumeric(value)) {\r\n an.set(value);\r\n }\r\n }\r\n\r\n function initAutonumeric(el) {\r\n\r\n $(el).find('*[data-autonumeric]').each(function () {\r\n\r\n let type = $(this).attr('data-autonumeric');\r\n applyAutoNumeric(this, type);\r\n $(this).on('input', function (e) {\r\n var anElement = AutoNumeric.getAutoNumericElement(this);\r\n if (anElement && this.value.length > 0 && anElement.getNumericString().length === 0) {\r\n anElement.set(this.value);\r\n }\r\n });\r\n\r\n });\r\n }\r\n\r\n $.fn.autoNumericInit = function () {\r\n $(this).each(function () {\r\n initAutonumeric(this);\r\n });\r\n };\r\n\r\n $.fn.autoNumericToNumberString = function () {\r\n\r\n $(this).each(function () {\r\n\r\n $(this).find('*[data-autonumeric]').each(function () {\r\n\r\n if (AutoNumeric.test(this)) {\r\n var el = AutoNumeric.getAutoNumericElement(this);\r\n var number = el.getNumber();\r\n el.remove();\r\n var newValue = AutoNumeric.toNumberString(number);\r\n if(newValue == null && $(this).data('preventNullValue') != undefined) {\r\n newValue = number;\r\n }\r\n $(this).val(newValue)\r\n }\r\n });\r\n });\r\n }\r\n\r\n $.fn.autoNumeric = function (value, type) {\r\n $(this).each(function () {\r\n applyAutoNumeric(this, type, value);\r\n });\r\n };\r\n\r\n initAutonumeric(document);\r\n },\r\n\r\n initializeAreaEditorModal: function (el, field) {\r\n\r\n var initAreaEditor = function () {\r\n if (areaEditorMap == null) {\r\n areaEditorMap = new MapAreaEditor();\r\n }\r\n\r\n let lngField = $($(el).attr('data-initial-lng'));\r\n let latField = $($(el).attr('data-initial-lat'));\r\n let lat = Number($(latField).val().replace(',', '.'));\r\n let lng = Number($(lngField).val().replace(',', '.'));\r\n var zoom = $(el).attr('data-initial-zoom');\r\n\r\n areaEditorMap.initializeAreaEditor(field, lat, lng, parseInt(zoom));\r\n };\r\n\r\n var clean = function () {\r\n $(\"#areaEditModal\").off('shown.bs.modal', clean);\r\n $(\"#areaEditModal\").off(\"hidden.bs.modal\", initAreaEditor);\r\n if (areaEditorMap != null) {\r\n areaEditorMap.cleanEvents();\r\n }\r\n $('#areaEditModal').html(\"\");\r\n $(\"body\").addClass(\"modal-open\");\r\n };\r\n\r\n $(\"#areaEditModal\").one('shown.bs.modal', initAreaEditor);\r\n $(\"#areaEditModal\").one('hidden.bs.modal', clean);\r\n $.get(AppView.actionUrls.getAreaEditorModal, function (res) {\r\n $('#areaEditModal').html(res).modal();\r\n });\r\n },\r\n\r\n toggleFavorite: function (e, id) {\r\n e.stopPropagation();\r\n var $target = $(e.currentTarget);\r\n $target.addClass('disabled');\r\n\r\n var $icon = $target.find('.icon');\r\n var isMarkAsFavorite = $icon.hasClass('icon-star');\r\n var requestData = {\r\n id: id,\r\n favorite: !isMarkAsFavorite\r\n };\r\n\r\n $.post(AppView.actionUrls.setFavorite, requestData, function (res) {\r\n if (isMarkAsFavorite) {\r\n $icon.removeClass('icon-star').addClass('icon-star-outline');\r\n } else {\r\n $icon.removeClass('icon-star-outline').addClass('icon-star');\r\n }\r\n })\r\n .always(function () {\r\n $target.removeClass('disabled');\r\n });\r\n },\r\n\r\n stopPropagation: function (e) {\r\n (e || window.event).stopPropagation();\r\n },\r\n\r\n initializeScrollablePopovers: initializeScrollablePopovers,\r\n initializeDistanceChart: initializeDistanceChart,\r\n initializeSidebarFilterToggle: initializeSidebarFilterToggle,\r\n\r\n getPerfectScrollbarDefaultConfig: function () {\r\n return {\r\n minScrollbarLength: 6\r\n };\r\n },\r\n\r\n setUrlParamValue: function (name, value) {\r\n var searchParams = new URLSearchParams(location.search);\r\n searchParams.set(name, value);\r\n history.replaceState(history.state, document.title, '?' + searchParams.toString());\r\n },\r\n\r\n resetUrlParams: function () {\r\n history.replaceState(history.state, document.title, location.pathname);\r\n },\r\n\r\n historyBackOrGoToReffererUrl() {\r\n window.history.back();\r\n if (document.referrer) {\r\n console.log(document.referrer);\r\n window.location.href = document.referrer;\r\n }\r\n },\r\n\r\n parseRangeSliderValuesInFilterModel: function (filterModel) {\r\n for (var key of Object.keys(filterModel)) {\r\n var item = filterModel[key];\r\n\r\n if (typeof item === 'object' && item !== null) {\r\n parseValueInRangeObject(item, 'From');\r\n parseValueInRangeObject(item, 'To');\r\n }\r\n }\r\n\r\n function parseValueInRangeObject(item, key) {\r\n if (item.hasOwnProperty(key)) {\r\n let val = item[key]\r\n item[key] = parseInt(val.replace(/\\./g, \"\"));\r\n }\r\n }\r\n },\r\n\r\n formatChartToolitpWithLabelAndValue: function (tooltipItem, data) {\r\n var label = data.datasets[tooltipItem.datasetIndex].label.replace(/ *\\([0-9)]*\\) */g, \"\");\r\n var val = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index].y;\r\n var count = val ? AutoNumeric.toIntNumberString(val) : 0;\r\n return `${label}: ${count}`;\r\n },\r\n\r\n setAccountLogo: function (url) {\r\n $.get(url, function (data) {\r\n var thumbUrl = data;\r\n $('#sideLogo').css('background-image', 'url(' + thumbUrl + ')');\r\n $('#logo').css('background-image', 'url(' + thumbUrl + ')');\r\n });\r\n },\r\n\r\n parseBool: function (val) { return val === true || val === \"true\" || val === \"True\" },\r\n\r\n initializeNumberRangeFields: function() {\r\n setTimeout(function() {\r\n $('[data-number-range]:not([data-number-range-initialized]').numberRangeFields();\r\n });\r\n },\r\n initializeTextareaLengthCounter: function initializeTextareaLengthCounter() {\r\n $(document).find('textarea[maxlength]').each(function() {\r\n var $element = $(this);\r\n var $parent = $element.parent();\r\n $element.after(' / ')\r\n $parent.find('.textarea-counter > .max').text(parseInt($element.attr('maxlength')));\r\n \r\n $element.on('change keyup paste', function() {\r\n $(this).parent().find('.textarea-counter > .current').text($(this).val().length);\r\n });\r\n $element.trigger('change');\r\n });\r\n },\r\n\r\n initializeDatepicker: function() {\r\n $('[data-datepicker]').datepicker({\r\n format: \"dd.mm.yyyy\",\r\n orientation: \"top left\",\r\n autoclose: true,\r\n language: \"de\",\r\n });\r\n }\r\n };\r\n})();\r\n\r\n\r\n//(function () {\r\n //'use strict';\r\n\r\n // REGIONY ----------------------------------------------------------------------------------------------------------------\r\n\r\n //$('[data-toggle=\"popover\"]').popover();\r\n\r\n //function parseData(json) {\r\n // var maxValue = Math.max.apply(Math, json.map(function (o) { return o.value; }));\r\n // var minValue = Math.min.apply(Math, json.map(function (o) { return o.value; }));\r\n // var steps = maxValue - minValue;\r\n // for (var i = 0; i < json.length; i++) {\r\n // var region = '#' + json[i].id;\r\n // var zip = json[i].region;\r\n // var value = json[i].value;\r\n // var percent = (value / steps) * 40;\r\n // $(region).css({ fill: shadeColor('#5e99d3', -percent) });\r\n // $(region).attr('data-content', value + ' Benutzer in der Region ' + zip);\r\n // }\r\n //}\r\n\r\n //function shadeColor(color, percent) {\r\n // var num = parseInt(color.slice(1), 16), amt = Math.round(2.55 * percent), R = (num >> 16) + amt, G = (num >> 8 & 0x00FF) + amt, B = (num & 0x0000FF) + amt;\r\n // return \"#\" + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);\r\n //}\r\n\r\n //var regionData = [\r\n // {\r\n // id: \"r1\",\r\n // value: 7,\r\n // region: \"56-666\"\r\n // },\r\n // {\r\n // id: \"r2\",\r\n // value: 1,\r\n // region: \"42-643\"\r\n // },\r\n // {\r\n // id: \"r3\",\r\n // value: 12,\r\n // region: \"54-321\"\r\n // },\r\n // {\r\n // id: \"r4\",\r\n // value: 5,\r\n // region: \"42-434\"\r\n // },\r\n // {\r\n // id: \"r5\",\r\n // value: 2,\r\n // region: \"53-231\"\r\n // },\r\n // {\r\n // id: \"r6\",\r\n // value: 1,\r\n // region: \"53-543\"\r\n // },\r\n // {\r\n // id: \"r7\",\r\n // value: 0,\r\n // region: \"43-212\"\r\n // },\r\n // {\r\n // id: \"r8\",\r\n // value: 2,\r\n // region: \"64-432\"\r\n // },\r\n // {\r\n // id: \"r9\",\r\n // value: 6,\r\n // region: \"42-666\"\r\n // },\r\n // {\r\n // id: \"r10\",\r\n // value: 7,\r\n // region: \"43-532\"\r\n // },\r\n // {\r\n // id: \"r11\",\r\n // value: 11,\r\n // region: \"00-122\"\r\n // },\r\n // {\r\n // id: \"r12\",\r\n // value: 9,\r\n // region: \"23-123\"\r\n // },\r\n // {\r\n // id: \"r13\",\r\n // value: 4,\r\n // region: \"42-634\"\r\n // },\r\n // {\r\n // id: \"r14\",\r\n // value: 8,\r\n // region: \"42-534\"\r\n // },\r\n // {\r\n // id: \"r15\",\r\n // value: 8,\r\n // region: \"43-443\"\r\n // },\r\n // {\r\n // id: \"r16\",\r\n // value: 1,\r\n // region: \"34-644\"\r\n // }\r\n //];\r\n //parseData(regionData);\r\n//})();\r\n","var DialogModalManager = function (settings) {\r\n 'use strict';\r\n\r\n var $modal = $(settings.dialogModalSelector);\r\n\r\n var self = this;\r\n var onCloseHandlers = [];\r\n self.onDialogShow = settings.onDialogShow;\r\n self.dialogControllerUrl = settings.dialogControllerUrl;\r\n self.alertDialogUrl = settings.alertDialogUrl;\r\n self.confirmDialogUrl = settings.confirmDialogUrl;\r\n\r\n $modal.on('hidden.bs.modal', function () {\r\n $.each(onCloseHandlers, function () {\r\n if (typeof (this) === 'function') {\r\n this();\r\n }\r\n });\r\n onCloseHandlers = [];\r\n });\r\n\r\n function initDialog(options) {\r\n if (options.content) {\r\n var $content = $(options.content);\r\n var $form = $content.find('form');\r\n\r\n if ($form.length) {\r\n $form.submit(function (event) {\r\n event.preventDefault();\r\n\r\n if (options.autoClose === undefined || options.autoClose !== false) {\r\n $modal.modal('hide');\r\n }\r\n\r\n if (typeof (options.onSubmit) === 'function') {\r\n options.onSubmit(options);\r\n }\r\n });\r\n }\r\n\r\n if (typeof (options.onClose) === 'function') {\r\n onCloseHandlers.push(options.onClose);\r\n }\r\n\r\n $modal.empty();\r\n $content.appendTo($modal);\r\n $modal.modal();\r\n\r\n options.dialogContent = $content;\r\n options.dialogModal = $modal;\r\n\r\n if (typeof (self.onDialogShow) === 'function') {\r\n self.onDialogShow(options);\r\n }\r\n\r\n if (typeof (options.onShow) === 'function') {\r\n options.onShow(options);\r\n }\r\n }\r\n }\r\n\r\n function showDialog(options) {\r\n if (!options) throw 'Missing required options object.';\r\n\r\n if (options.url) {\r\n options.method = options.method ? options.method : 'POST';\r\n\r\n CancelableRequests.register('dialogManagerGetDialogView',\r\n $.ajax({\r\n url: options.url,\r\n method: options.method,\r\n data: options.model\r\n }).done(function (ajaxContent) {\r\n options.content = ajaxContent;\r\n initDialog(options);\r\n })\r\n );\r\n }\r\n else if (options.content) {\r\n initDialog(options);\r\n }\r\n }\r\n\r\n function getDialogUrlByType(dialogType) {\r\n if (self.dialogControllerUrl) {\r\n return [self.dialogControllerUrl, '/Get', dialogType, 'Dialog'].join('');\r\n }\r\n return null;\r\n }\r\n\r\n function initDialogs($container) {\r\n $.each($container.find('[data-dialog-type]'), function () {\r\n var $this = $(this);\r\n var type = $this.data('dialog-type');\r\n var url = getDialogUrlByType(type);\r\n if (url) {\r\n var action = $this.data('dialog-submit-action');\r\n var options = {\r\n url: url,\r\n model: {\r\n Title: $this.data('dialog-title'),\r\n Message: $this.data('dialog-message')\r\n },\r\n onSubmit: function () {\r\n if (action) {\r\n eval(action);\r\n }\r\n },\r\n autoClose: $this.data('dialog-autoclose') === 'false' ? false : true\r\n };\r\n $this.off('click');\r\n $this.click(function () {\r\n showDialog(options);\r\n });\r\n }\r\n });\r\n }\r\n\r\n self.showDialog = function (options) {\r\n showDialog(options);\r\n };\r\n\r\n self.showAlertDialog = function (message, title) {\r\n var url = self.alertDialogUrl ? self.alertDialogUrl : getDialogUrlByType('Alert');\r\n\r\n if (url) {\r\n showDialog({\r\n url: url,\r\n model: {\r\n Title: title,\r\n Message: message\r\n }\r\n });\r\n }\r\n };\r\n\r\n self.showConfirmDialog = function (title, message, onSubmit, onClose) {\r\n var options = {\r\n model: {\r\n Title: title,\r\n Message: message\r\n },\r\n onSubmit: onSubmit,\r\n onClose: onClose\r\n };\r\n\r\n options.url = self.confirmDialogUrl ? self.confirmDialogUrl : getDialogUrlByType('Confirm');\r\n showDialog(options);\r\n };\r\n\r\n self.showProgressDialog = function (title, message, ajaxUrl, ajaxData, onSuccess) {\r\n var url = getDialogUrlByType('Progress');\r\n if (url) {\r\n showDialog({\r\n url: url,\r\n model: {\r\n Title: title,\r\n Message: message\r\n },\r\n onShow: function (dialogContext) {\r\n CancelableRequests.register('showProgressDialog',\r\n $.post(ajaxUrl, ajaxData, onSuccess)\r\n .always(function () {\r\n $modal.modal('hide');\r\n }));\r\n }\r\n });\r\n }\r\n };\r\n\r\n self.initialize = function () {\r\n initDialogs($(document));\r\n };\r\n\r\n return self;\r\n};","var EstateFilterController = function (panelContextMgr, mapCtrl, settings) {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n var handDrawer = new MapHandDrawer(mapCtrl.getMapManager(), onHandDrawComplete, onHandDrawAbort);\r\n\r\n var reloadListeners = [];\r\n var filterUpdatedListeners = [];\r\n var lastEstateId = null;\r\n var filterUpdateRequested = false;\r\n var currentFilterModel = null;\r\n var canFilterByLocationDistance = false;\r\n var isAbortHandDrawButtonActiveOnPageLoaded = false;\r\n var areaFilterPolygon = null;\r\n\r\n mapCtrl.getMapManager().addOnReadyListener(addOnReadyListener);\r\n\r\n var resultsScrollSettings = {\r\n onNextPageLoading: function () {\r\n $('#resultsPanelContent #results').addClass('next-page-loading');\r\n },\r\n onFullReloadLoading: function () {\r\n $('#resultsPanelContent').addClass('loading');\r\n },\r\n onLoaded: function () {\r\n $('#resultsPanelContent').removeClass('loading');\r\n $('#resultsPanelContent #results').removeClass('next-page-loading');\r\n $('#resultsPanelContent').perfectScrollbar('update');\r\n },\r\n getResultsNextPageUrl: AppView.actionUrls.getResults,\r\n onInitialised: function () {\r\n $('#resultsPanelContent').perfectScrollbar();\r\n $('#resultsPanelContent').removeClass('loading');\r\n },\r\n onResultsAppend: function (res) {\r\n $('#resultsTotalCount').text(res.TotalCount);\r\n },\r\n onResultsListWindowScroll: null,\r\n windowScrollBreakpoint: AppView.largeDeviceMatchMedia,\r\n scrollableWrapper: \"#resultsPanelContent #results\"\r\n };\r\n\r\n var infiniteScrollList = new ConfigurableInfiniteScrollList('#resultsPanelContent #results', resultsScrollSettings, 'CHANGE_ON_BREAKPOINT');\r\n\r\n function getRangeSize(value, x, smallSize) {\r\n var equation = null;\r\n var a = null;\r\n var b = null;\r\n\r\n if (smallSize) {\r\n a = 0.1;\r\n b = 0.001;\r\n\r\n equation = a * (x * x) * (b * x) / 100;\r\n }\r\n else {\r\n a = 0.01;\r\n\r\n equation = (a * Math.pow(x, a * x)) * (a * (x * x)) / 100;\r\n }\r\n\r\n return parseInt(value * equation);\r\n }\r\n\r\n function getSliderRange(minValue, maxValue) {\r\n var isSmallRange = maxValue < 3000000;\r\n var array = [];\r\n\r\n array.push(['min', minValue]);\r\n for (var i = 5; i < 100; i += 5) {\r\n var value = getRangeSize(maxValue, i, isSmallRange);\r\n if (value > minValue && value < maxValue) {\r\n array.push([i + \"%\", value]);\r\n }\r\n }\r\n array.push(['max', maxValue]);\r\n\r\n return Object.fromEntries(array);\r\n }\r\n\r\n function refreshSliderDirtyStates($slider, $inputFrom, $inputTo) {\r\n var values = $slider.noUiSlider.get();\r\n var min = $slider.noUiSlider.options.range.min;\r\n var max = $slider.noUiSlider.options.range.max;\r\n\r\n if (values[0] === min) {\r\n $slider.removeAttribute('data-min-dirty');\r\n $inputFrom.removeClass('active');\r\n }\r\n else {\r\n $slider.setAttribute('data-min-dirty', true);\r\n $inputFrom.addClass('active');\r\n }\r\n\r\n if (values[1] === max) {\r\n $slider.removeAttribute('data-max-dirty');\r\n $inputTo.removeClass('active');\r\n }\r\n else {\r\n $slider.setAttribute('data-max-dirty', true);\r\n $inputTo.addClass('active');\r\n }\r\n }\r\n\r\n function setSliderDisabledState($slider, disabled) {\r\n var sliderControl = $slider.find('*[data-slider-control]:first')[0];\r\n\r\n $slider.toggleClass('disabled', disabled);\r\n\r\n if (disabled) {\r\n sliderControl.setAttribute('disabled', disabled);\r\n\r\n $slider.find('[data-slider-from]').attr('disabled', true);\r\n $slider.find('[data-slider-to]').attr('disabled', true);\r\n }\r\n else {\r\n sliderControl.removeAttribute('disabled');\r\n\r\n $slider.find('[data-slider-from]').attr('disabled', null);\r\n $slider.find('[data-slider-to]').attr('disabled', null);\r\n }\r\n }\r\n\r\n function replaceSeparatorAndParseInt(val) {\r\n if (typeof val === 'string' || val instanceof String) {\r\n var newVal = val.replace(',', '.');\r\n return Math.round(parseFloat(newVal));\r\n } else {\r\n return val;\r\n }\r\n }\r\n\r\n function setUpSliders() {\r\n $('#Filter *[data-range-slider]').each(function () {\r\n var $this = $(this);\r\n var slider = $this.find('*[data-slider-control]:first')[0];\r\n var $inputFrom = $this.find('input[data-slider-from]:first');\r\n var $inputTo = $this.find('input[data-slider-to]:first');\r\n var minValue = replaceSeparatorAndParseInt($this.attr('data-min'));\r\n var maxValue = replaceSeparatorAndParseInt($this.attr('data-max'));\r\n var isDisabledOnInit = minValue === 0 && maxValue === 0;\r\n\r\n var isZeroRange = minValue === maxValue;\r\n var sliderConfig = {\r\n connect: true,\r\n start: [\r\n replaceSeparatorAndParseInt($inputFrom.val()),\r\n replaceSeparatorAndParseInt($inputTo.val())\r\n ],\r\n format: {\r\n to: function (value) {\r\n return Math.round(parseFloat(value));\r\n },\r\n from: function (value) {\r\n return Math.round(parseFloat(value));\r\n }\r\n }\r\n };\r\n\r\n if (isDisabledOnInit) {\r\n sliderConfig.range = {\r\n 'min': 0,\r\n 'max': 1000000\r\n };\r\n isZeroRange = true;\r\n } else {\r\n sliderConfig.range = getSliderRange(minValue, maxValue);\r\n }\r\n\r\n noUiSlider.create(slider, sliderConfig);\r\n\r\n slider.noUiSlider.on('update', function (values, handle) {\r\n $inputFrom.numberVal(values[0]);\r\n $inputTo.numberVal(values[1]);\r\n });\r\n\r\n slider.noUiSlider.on('change', function (values, handle) {\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n postFilterUpdate();\r\n });\r\n\r\n $inputFrom.change(function () {\r\n var fromVal = $inputFrom.numberVal();\r\n var toVal = $inputTo.numberVal();\r\n\r\n if (isNaN(fromVal)) {\r\n fromVal = parseInt($this.attr('data-min'));\r\n $inputFrom.numberVal(fromVal);\r\n }\r\n\r\n if (fromVal > toVal) {\r\n toVal = fromVal;\r\n $inputTo.numberVal(fromVal);\r\n }\r\n\r\n slider.noUiSlider.setHandle(0, fromVal, true);\r\n\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n postFilterUpdate();\r\n });\r\n\r\n $inputTo.change(function () {\r\n var fromVal = $inputFrom.numberVal();\r\n var toVal = $inputTo.numberVal();\r\n\r\n if (isNaN(toVal)) {\r\n toVal = parseInt($this.attr('data-max'));\r\n $inputTo.numberVal(toVal);\r\n }\r\n\r\n if (toVal < fromVal) {\r\n fromVal = toVal;\r\n $inputFrom.numberVal(toVal);\r\n }\r\n\r\n slider.noUiSlider.setHandle(1, toVal, true);\r\n\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n postFilterUpdate();\r\n });\r\n\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n setSliderDisabledState($this, isZeroRange);\r\n });\r\n }\r\n\r\n function setUpFilter() {\r\n setUpKeywordSuggestion();\r\n setUpSliders();\r\n\r\n $('[data-observable]').change(function () {\r\n reload($(this).data('observable'));\r\n });\r\n\r\n refreshLocationDistanceAvailability({});\r\n }\r\n\r\n function setUpKeywordSuggestion() {\r\n $('#Filter #keywordSearch').inputSuggestions({\r\n dataSource: {\r\n url: AppView.actionUrls.getKeywordSuggestions,\r\n paramName: 'keyword'\r\n },\r\n inputDebounce: 250,\r\n selectCallback: function ($selectedItem) {\r\n const data = $selectedItem.data();\r\n self.setPropertyValue(data.propertyName, data.propertyValue);\r\n toggleKeywordSearchInputDirtyState(true);\r\n },\r\n clearCallback: function () {\r\n setFilterLocationProperties({});\r\n toggleKeywordSearchInputDirtyState(false);\r\n },\r\n updatePositionOnWrapperScrolled: '.filter-side-bar-estatemap .sidebar-inner > .scrollable'\r\n });\r\n }\r\n\r\n function toggleKeywordSearchInputDirtyState(state) {\r\n $('#keywordSearchIconSearch').toggle(!state);\r\n $('#keywordSearchIconClear').toggle(state);\r\n }\r\n\r\n function toggleCustomerKeywordSearchInputDirtyState(state) {\r\n $('#customerSearchIconSearch').toggle(!state);\r\n $('#customerSearchIconClear').toggle(state);\r\n }\r\n\r\n function addOnReadyListener() {\r\n setUpFilter();\r\n reload();\r\n }\r\n\r\n function reload(reloadType) {\r\n\r\n if (reloadType === 'geographic') {\r\n onReload();\r\n }\r\n else {\r\n onFilterUpdated();\r\n reloadResults();\r\n }\r\n }\r\n\r\n function postFilterUpdate() {\r\n if (filterUpdateRequested)\r\n return;\r\n\r\n filterUpdateRequested = true;\r\n\r\n setTimeout(function () {\r\n onFilterUpdated();\r\n reloadResults();\r\n filterUpdateRequested = false;\r\n });\r\n }\r\n\r\n function onReload() {\r\n reloadListeners.forEach(function (listenerFn) {\r\n listenerFn();\r\n });\r\n }\r\n\r\n function onFilterUpdated() {\r\n filterUpdatedListeners.forEach(function (listenerFn) {\r\n listenerFn();\r\n });\r\n }\r\n\r\n function reloadResults() {\r\n $('#resultsPanelContent').addClass('loading');\r\n if (lastEstateId) {\r\n mapCtrl.adjustMapViewportOnNextLoad();\r\n }\r\n lastEstateId = null;\r\n panelContextMgr.setRootContext(panelContextMgr.CONTEXT.results);\r\n var model = getFilterModel();\r\n\r\n $.post(AppView.actionUrls.getResultsPanel, model, function (response) {\r\n $('#resultsPanelContent').html(response.ResultsPanelHtml);\r\n\r\n $('#resultsPanelContent [data-perferct-scrollbar]').perfectScrollbar();\r\n\r\n $('#resultsPanelContent [data-observable]').change(function () {\r\n reload();\r\n });\r\n\r\n resultsScrollSettings.resultsPageData = function (data) {\r\n $.extend(data, model);\r\n }\r\n\r\n infiniteScrollList.init();\r\n\r\n canFilterByLocationDistance = response.CanFilterByLocationDistance;\r\n\r\n if (response.Filter) {\r\n updateCurrentFilterModel(response.Filter);\r\n }\r\n\r\n refreshLocationDistanceAvailability({});\r\n createAreaFilterPolygon(response.AreaPolygon);\r\n onReload();\r\n\r\n $('#resultsPanelContent').removeClass('loading');\r\n });\r\n }\r\n\r\n function updateCurrentFilterModel(newFilter) {\r\n for (var propName in newFilter) {\r\n if (newFilter[propName] === null) {\r\n delete newFilter[propName];\r\n }\r\n }\r\n\r\n if (currentFilterModel !== null) {\r\n updateFilterDynamicControls(newFilter);\r\n }\r\n\r\n currentFilterModel = newFilter;\r\n }\r\n\r\n function updateFilterDynamicControls(newFilter) {\r\n if (newFilter.PropertyAreaRange)\r\n refreshSliderMinMaxRange('propertyAreaRangeSlider', 'PropertyAreaRange', newFilter.PropertyAreaRange);\r\n\r\n if (newFilter.StorageAreaRange)\r\n refreshSliderMinMaxRange('storageAreaRangeSlider', 'StorageAreaRange', newFilter.StorageAreaRange);\r\n }\r\n\r\n function refreshSliderMinMaxRange(sliderName, propName, newState) {\r\n var $filter = $('#Filter');\r\n var $slider = $filter.find('#' + sliderName + ' *[data-range-slider]').first();\r\n var sliderControl = $slider.find('*[data-slider-control]:first')[0];\r\n var isZeroRange = newState.MaxTo - newState.MinFrom <= 0;\r\n\r\n if (!sliderControl)\r\n throw 'Slider element not found';\r\n\r\n setPropertyValue($filter, propName + '.MinFrom', newState.MinFrom);\r\n setPropertyValue($filter, propName + '.MaxTo', newState.MaxTo);\r\n\r\n $slider.attr('data-min', newState.MinFrom);\r\n $slider.attr('data-max', newState.MaxTo);\r\n\r\n if (!isZeroRange) {\r\n sliderControl.noUiSlider.updateOptions({\r\n range: getSliderRange(newState.MinFrom, newState.MaxTo)\r\n });\r\n }\r\n\r\n var values = sliderControl.noUiSlider.get();\r\n\r\n if (sliderControl.hasAttribute('data-min-dirty')) {\r\n if (!isZeroRange) {\r\n values[0] = newState.From;\r\n }\r\n }\r\n else {\r\n setPropertyValue($filter, propName + '.From', newState.MinFrom);\r\n values[0] = newState.MinFrom;\r\n }\r\n\r\n if (sliderControl.hasAttribute('data-max-dirty')) {\r\n if (!isZeroRange) {\r\n values[1] = newState.To;\r\n }\r\n }\r\n else {\r\n setPropertyValue($filter, propName + '.To', newState.MaxTo);\r\n values[1] = newState.MaxTo;\r\n }\r\n\r\n sliderControl.noUiSlider.set(values);\r\n setSliderDisabledState($slider, isZeroRange);\r\n }\r\n\r\n function getFilterModel() {\r\n var model = $('form#Filter').serializeToJSON().Filter;\r\n\r\n if ($('#resultsPanel').is(':visible')) {\r\n model.SortMethod = $('#resultsPanel #SortMethod').val();\r\n }\r\n\r\n return model;\r\n }\r\n\r\n function getFilterInputElement($filter, name) {\r\n var $input = $filter.find('input[name = \"Filter.' + name + '\"]');\r\n\r\n if (!$input.length) {\r\n throw 'Input element with name \"' + name + '\" not found';\r\n }\r\n\r\n return $input;\r\n }\r\n\r\n function setPropertyValue($filter, name, value) {\r\n var $input = getFilterInputElement($filter, name);\r\n $input.val(value !== null && value !== undefined ? value : '');\r\n }\r\n\r\n function onHandDrawComplete(points) {\r\n var vertices = convertPointsToVertices(points);\r\n self.setPropertyValue('CustomAreaVertices', vertices);\r\n }\r\n\r\n function onHandDrawAbort() {\r\n $('#handDrawingStartBtn').removeClass('d-none').addClass('d-flex');\r\n $('#handDrawingAbortBtn').removeClass('d-flex').addClass('d-none');\r\n $('#handDrawingStartSmallDevBtn').removeClass('d-none').addClass('d-block');\r\n $('#handDrawingAbortSmallDevBtn').removeClass('d-block').addClass('d-none');\r\n }\r\n\r\n function convertPointsToVertices(points) {\r\n var strings = [];\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n strings.push(points[i][0].toString().substring(0, 7));\r\n strings.push(points[i][1].toString().substring(0, 7));\r\n }\r\n\r\n return strings.join(',');\r\n }\r\n\r\n function setFilterLocationProperties(props) {\r\n var $filter = $('#Filter');\r\n\r\n setPropertyValue($filter, 'PostalCodeId', props.PostalCodeId);\r\n setPropertyValue($filter, 'AdministrativeAreaId', props.AdministrativeAreaId);\r\n setPropertyValue($filter, 'EstateId', props.EstateId);\r\n setPropertyValue($filter, 'CustomAreaVertices', props.CustomAreaVertices);\r\n\r\n mapCtrl.adjustMapViewportOnNextLoad();\r\n\r\n if (props.CustomAreaVertices) {\r\n $('#Filter #keywordSearch').val('');\r\n toggleKeywordSearchInputDirtyState(false);\r\n }\r\n else {\r\n self.abortHandDrawing();\r\n }\r\n\r\n refreshLocationDistanceAvailability(props);\r\n postFilterUpdate();\r\n }\r\n\r\n function isLocationDistanceAvailable(props) {\r\n return (canFilterByLocationDistance &&\r\n (props.PostalCodeId ||\r\n props.CommuneId ||\r\n props.CountyId ||\r\n props.StateId ||\r\n props.EstateId ||\r\n props.IndustrialAreaId ||\r\n props.LogisticRegionId)) ||\r\n (hasFilterAnyProperty() && Object.keys(props).length === 0 && props.constructor === Object);\r\n }\r\n\r\n function hasFilterAnyProperty() {\r\n var $filter = $('#Filter');\r\n\r\n return getFilterPropertyValue($filter, 'AdministrativeAreaId') ||\r\n getFilterPropertyValue($filter, 'PostalCodeId') ||\r\n getFilterPropertyValue($filter, 'EstateId');\r\n }\r\n\r\n function getFilterPropertyValue($filter, name) {\r\n var $input = getFilterInputElement($filter, name);\r\n return $input.val();\r\n }\r\n\r\n function refreshLocationDistanceAvailability(props) {\r\n var disableField = !isLocationDistanceAvailable(props);\r\n\r\n if (disableField) {\r\n $(\"#Filter #locationDistance\").val($(\"#Filter #locationDistance option:first\").val());\r\n }\r\n\r\n $('#Filter #locationDistance').prop('disabled', disableField);\r\n }\r\n\r\n function clearAreaFilterPolygon() {\r\n if (areaFilterPolygon !== null) {\r\n areaFilterPolygon.setMap(null);\r\n }\r\n }\r\n\r\n function createAreaFilterPolygon(points) {\r\n clearAreaFilterPolygon();\r\n\r\n if (!points)\r\n return;\r\n\r\n var opts = MapUtils.getAreaPolygonBaseOptions();\r\n opts.map = mapCtrl.getMapManager().getGoogleMap();\r\n opts.paths = MapUtils.createMultiPolygonPathsFromPoints(points);\r\n\r\n areaFilterPolygon = new google.maps.Polygon(opts);\r\n }\r\n\r\n self.setPropertyValue = function (property, value) {\r\n var props = {};\r\n props[property] = value;\r\n\r\n setFilterLocationProperties(props);\r\n };\r\n\r\n self.addReloadListener = function (fn) {\r\n reloadListeners.push(fn);\r\n };\r\n\r\n self.addFilterUpdatedListener = function (fn) {\r\n filterUpdatedListeners.push(fn);\r\n };\r\n\r\n self.getCurrentFilterModel = function () {\r\n return getFilterModel();\r\n };\r\n\r\n self.setEstateId = function (id) {\r\n $('#Filter #Filter_EstateId').val(id);\r\n infiniteScrollList.removeScrollEvents();\r\n\r\n reload();\r\n };\r\n\r\n self.clearSearchKeyword = function () {\r\n $('#Filter #keywordSearch').val('').trigger('blur');\r\n };\r\n\r\n self.startHandDrawing = function () {\r\n if (!handDrawer.isActive()) {\r\n handDrawer.startDrawing();\r\n }\r\n\r\n $('#handDrawingStartBtn').removeClass('d-flex').addClass('d-none');\r\n $('#handDrawingAbortBtn').removeClass('d-none').addClass('d-flex');\r\n $('#handDrawingStartSmallDevBtn').removeClass('d-block').addClass('d-none');\r\n $('#handDrawingAbortSmallDevBtn').removeClass('d-none').addClass('d-block');\r\n };\r\n\r\n self.abortHandDrawing = function () {\r\n if (handDrawer.isActive() || isAbortHandDrawButtonActiveOnPageLoaded) {\r\n handDrawer.abortDrawing();\r\n isAbortHandDrawButtonActiveOnPageLoaded = false;\r\n }\r\n\r\n clearAreaFilterPolygon();\r\n\r\n if (getFilterPropertyValue($('#Filter'), 'CustomAreaVertices')) {\r\n self.setPropertyValue('CustomAreaVertices', null);\r\n postFilterUpdate();\r\n }\r\n };\r\n};","var EstateMapController = function (mapManager, panelContextMgr, settings) {\r\n var self = this;\r\n\r\n var adjustMapViewportOnNextLoad = false;\r\n var lastMapObjectsReloadZoomLevel = -1;\r\n //prevent load map results twice: on first idle and next on filter loaded\r\n var isMapResultsReloadActive = false;\r\n var isFirstResultsLoading = true;\r\n\r\n mapManager.addOnReadyListener(onMapInitialized);\r\n\r\n var onIdleDebounce = null;\r\n function onIdleMap() {\r\n window.clearTimeout(onIdleDebounce);\r\n onIdleDebounce = window.setTimeout(reloadMapObjects, 60);\r\n }\r\n\r\n function onMapInitialized() {\r\n google.maps.event.addListenerOnce(mapManager.getGoogleMap(), 'idle', function () {\r\n google.maps.event.addListener(mapManager.getGoogleMap(), 'idle', function () {\r\n if (isMapResultsReloadActive) {\r\n onIdleMap();\r\n }\r\n });\r\n });\r\n\r\n mapManager.addMarkerClickEventListener(onMapMarkerClick);\r\n }\r\n\r\n function reloadMapObjects() {\r\n CancelableRequests.abort('mapObjects');\r\n\r\n //var boundingBox = mapManager.getCurrentBoundingBox(1.25);\r\n var boundingBox = mapManager.getCurrentBoundingBox();\r\n\r\n // In case the Google Maps did not completely load yet\r\n if (boundingBox === null) {\r\n google.maps.event.addListenerOnce(mapManager.getGoogleMap(), 'bounds_changed', reloadMapObjects);\r\n return;\r\n }\r\n\r\n var data = {\r\n BoundingBox: boundingBox,\r\n ZoomLevel: mapManager.getGoogleMap().getZoom(),\r\n CalculateEstateBoundingBox: adjustMapViewportOnNextLoad\r\n };\r\n\r\n if (settings.mapObjectsData) {\r\n settings.mapObjectsData(data);\r\n }\r\n\r\n CancelableRequests.add('mapObjects', $.post(AppView.actionUrls.getGeographicResults, data)\r\n .done(function (res) {\r\n if (res) {\r\n var zoomLevel = mapManager.getGoogleMap().getZoom();\r\n\r\n if (res.MaxZoomLevel) {\r\n mapManager.getGoogleMap().setOptions({ maxZoom: res.MaxZoomLevel });\r\n }\r\n\r\n if (zoomLevel !== lastMapObjectsReloadZoomLevel) {\r\n mapManager.clearObjects();\r\n }\r\n\r\n mapManager.addObjects(res.Objects);\r\n lastMapObjectsReloadZoomLevel = zoomLevel;\r\n\r\n if (adjustMapViewportOnNextLoad) {\r\n mapManager.adjustViewportToBoundingBox(res.EstateBoundingBox);\r\n adjustMapViewportOnNextLoad = false;\r\n }\r\n\r\n if (res.MapLegend) {\r\n mapManager.showMapLegend(res.MapLegend);\r\n }\r\n else {\r\n mapManager.hideMapLegend();\r\n }\r\n }\r\n\r\n if (isFirstResultsLoading) {\r\n isFirstResultsLoading = false;\r\n self.activateOnIdleResultsReload();\r\n }\r\n }));\r\n }\r\n\r\n function onMapMarkerClick(marker, data) {\r\n switch (data.Type) {\r\n case mapManager.MARKER_TYPE.poiCluster:\r\n case mapManager.MARKER_TYPE.estateCluster:\r\n mapManager.getGoogleMap().setZoom(mapManager.getGoogleMap().getZoom() + 2);\r\n break;\r\n case mapManager.MARKER_TYPE.estate:\r\n if (settings.onResultMarkerClickFn) {\r\n settings.onResultMarkerClickFn(data);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n self.getMapManager = function () {\r\n return mapManager;\r\n };\r\n\r\n self.reloadMapObjects = function () {\r\n reloadMapObjects();\r\n };\r\n\r\n self.adjustMapViewportOnNextLoad = function () {\r\n adjustMapViewportOnNextLoad = true;\r\n };\r\n\r\n self.activateOnIdleResultsReload = function () {\r\n isMapResultsReloadActive = true;\r\n };\r\n};","var EstatePanelContextManager = function () {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n var CONTEXT = {\r\n results: 0,\r\n selectiveResults: 1,\r\n topCustomers: 2\r\n };\r\n\r\n var contextStack = [];\r\n var rightSidebar = document.querySelector('.right-sidebar');\r\n\r\n self.CONTEXT = CONTEXT;\r\n\r\n function onChange() {\r\n var context = self.getCurrentContext();\r\n \r\n $('#resultsPanel').toggle(context === CONTEXT.results);\r\n $('#selectiveResultsPanel').toggle(context === CONTEXT.selectiveResults);\r\n $('#topCustomersPanel').toggle(context === CONTEXT.topCustomers);\r\n\r\n var event = new CustomEvent('estatePanelContextChanged', { 'detail': context });\r\n rightSidebar.dispatchEvent(event);\r\n }\r\n\r\n self.setRootContext = function (context) {\r\n contextStack = [context];\r\n onChange();\r\n };\r\n\r\n self.pushContext = function (context) {\r\n var currentContext = self.getCurrentContext();\r\n if (currentContext === null || currentContext !== context) {\r\n contextStack.push(context);\r\n onChange();\r\n }\r\n };\r\n\r\n self.popContext = function () {\r\n if (contextStack.length > 0) {\r\n contextStack.pop();\r\n onChange();\r\n }\r\n };\r\n\r\n self.getCurrentContext = function () {\r\n if (contextStack.length > 0) {\r\n return contextStack[contextStack.length - 1];\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n\r\n self.reset = function () {\r\n contextStack = [];\r\n };\r\n};","var FileUploadManager = function (uploadWrapperId, type) {\r\n\r\n 'use strict';\r\n\r\n var self = {\r\n uploadWrapperId: uploadWrapperId,\r\n filesWrapper: null,\r\n fileType: type\r\n };\r\n\r\n var $uploadModal = null;\r\n var $uploadProgressBar = null;\r\n\r\n self.onFileSelected = function onFileSelected($fileInput) {\r\n var $file = $fileInput[0].files[0];\r\n var isValid = self.validateFileExtension($file);\r\n\r\n if (isValid) {\r\n self.addValidFile($fileInput, $file);\r\n }\r\n else {\r\n alert('Einige Ihrer Dateien konnten nicht hochgeladen werden, weil deren Dateityp nicht vom Typ PDF, DOC, DOCX, PPT, PPTX ist: ' + $file.name);\r\n $fileInput.val(\"\");\r\n }\r\n\r\n return isValid;\r\n };\r\n\r\n self.addValidFile = function addValidFile($fileInput, $file) {\r\n var $fileItem = $fileInput.parent();\r\n var file = $fileItem.find('.fileInput').get(0);\r\n var fileReader = new FileReader();\r\n\r\n uploadProgressBegin();\r\n\r\n fileReader.onload = function () {\r\n $.ajax({\r\n url: '/Media/UploadEstateDocument',\r\n type: 'POST',\r\n data: {\r\n Data: fileReader.result,\r\n Title: $file.name,\r\n Ext: self.getFileExtensions($file.name)\r\n },\r\n xhr: function () {\r\n var xhr = $.ajaxSettings.xhr();\r\n xhr.upload.onprogress = function (e) {\r\n if (e.lengthComputable) {\r\n var progress = Math.round(e.loaded / e.total * 100);\r\n uploadProgressUpdate(progress);\r\n }\r\n };\r\n\r\n return xhr;\r\n }\r\n }).done(function (res) {\r\n $fileItem.find('.fileNameInput').val(res.FileName);\r\n $fileItem.find('.titleInput').val($file.name);\r\n $fileItem.find('.title').text($file.name);\r\n $fileItem.find('.btn-remove').removeClass('d-none');\r\n $fileItem.find('.btn-select-file').addClass('d-none');\r\n $fileItem.find('fieldset').prop(\"disabled\", false);\r\n $fileItem.removeClass('new-file-item').addClass('preview-item-filled');\r\n\r\n if (res.Url) {\r\n $fileItem.find('.preview').attr('href', res.Url);\r\n }\r\n\r\n self.addNewUploadIfNotExist();\r\n uploadProgressComplete();\r\n }).fail(function (e) {\r\n uploadProgressFail();\r\n });\r\n };\r\n\r\n fileReader.readAsDataURL(file.files[0]);\r\n };\r\n\r\n self.appendNewUploadItem = function addNewUploadItem() {\r\n $.get(AppView.actionUrls.getDocumentUploadItem, function (content) {\r\n var $content = $(content);\r\n self.filesWrapper.append($content);\r\n });\r\n };\r\n\r\n self.addNewUploadIfNotExist = function addNewUploadIfNotExist() {\r\n if (!self.filesWrapper.find('.file-item.new-file-item').length) {\r\n self.appendNewUploadItem();\r\n }\r\n };\r\n\r\n self.removeFile = function removeFile($fileItem) {\r\n $fileItem.remove();\r\n self.addNewUploadIfNotExist();\r\n };\r\n\r\n self.fileExtensions = {\r\n 'document': ['pdf', 'doc', 'docx', 'ppt', 'pptx'],\r\n 'photo': ['jpg', 'jpeg', 'png', 'gif'],\r\n };\r\n\r\n self.getFileExtensions = function getFileExtensions(fileName) {\r\n return fileName.slice((fileName.lastIndexOf(\".\") - 1 >>> 0) + 2);\r\n };\r\n\r\n self.validateFileExtension = function (file) {\r\n var ext = self.getFileExtensions(file.name).toLowerCase();\r\n return self.fileExtensions[self.fileType].indexOf(ext) > -1;\r\n };\r\n\r\n function initPreviewOfSavedFiles() {\r\n var $fileItems = self.filesWrapper.find('.file-item');\r\n\r\n $fileItems.each(function (i, obj) {\r\n var $fileItem = $(this);\r\n var title = $fileItem.find('.titleInput').val();\r\n if (title) {\r\n $fileItem.find('.title').text(title);\r\n $fileItem.removeClass('new-file-item').addClass('preview-item-filled');\r\n $fileItem.find('.btn-remove').removeClass('d-none');\r\n $fileItem.find('.btn-select-file').addClass('d-none');\r\n }\r\n });\r\n }\r\n\r\n function uploadProgressBegin() {\r\n $uploadProgressBar.html('0%').css('width', '0%');\r\n $uploadModal.modal();\r\n }\r\n\r\n function uploadProgressEnd() {\r\n $uploadModal.modal('hide');\r\n $uploadProgressBar.html('0%').css('width', '0%');\r\n }\r\n\r\n function uploadProgressUpdate(progress) {\r\n var percentVal = progress + '%';\r\n $uploadProgressBar.html(percentVal).css('width', percentVal);\r\n }\r\n\r\n function uploadProgressComplete() {\r\n uploadProgressEnd();\r\n }\r\n\r\n function uploadProgressFail() {\r\n alert('Upload fail');\r\n uploadProgressEnd();\r\n }\r\n\r\n self.initialize = function () {\r\n self.filesWrapper = $('#' + self.uploadWrapperId);\r\n initPreviewOfSavedFiles();\r\n self.addNewUploadIfNotExist();\r\n\r\n $uploadModal = $('#documentUploadModal');\r\n $uploadProgressBar = $uploadModal.find('.progress-bar');\r\n };\r\n\r\n return self;\r\n};","var ImagesDragDropUpload = function (uploadWrapperId, type, settings) {\r\n 'use strict';\r\n\r\n var self = new FileUploadManager(uploadWrapperId, type);\r\n \r\n var $cropModal = null;\r\n var $rcrop = null;\r\n var cropModalFileItem = null;\r\n var croppingFileContent = null;\r\n var $uploadInfo = null;\r\n var $uploadProgressBar = null;\r\n var $dragdropFilesArea = null;\r\n var $fileInput = null;\r\n var $documentsListWrapper = $('#multimediaPhotosWrapper');\r\n var getPhotoAction = '/Media/GetEstatePhoto';\r\n var getPhotoThumbAction = '/Media/GetEstatePhotoThumb';\r\n var uploadPhotoAction = '/Media/UploadEstatePhoto';\r\n\r\n var uploadAjaxRequest = null;\r\n\r\n var cropSettings = {\r\n minSize: [120, 90],\r\n preserveAspectRatio: true\r\n };\r\n\r\n var maxCroppedImageDimesions = {\r\n width: 1200,\r\n height: 900\r\n };\r\n\r\n var requiredImageDimesions = {\r\n min: {\r\n width: 150,\r\n height: 112\r\n },\r\n max: {\r\n width: 6000,\r\n height: 6000\r\n }\r\n };\r\n\r\n var INVALID_DIMENSION_TYPE = {\r\n TO_SMALL: -1,\r\n TO_LARGE: -2,\r\n };\r\n\r\n if (settings && settings.requiredImageDimesions) {\r\n requiredImageDimesions = settings.requiredImageDimesions;\r\n }\r\n \r\n if (settings && settings.cropSettings) {\r\n cropSettings = settings.cropSettings;\r\n }\r\n \r\n if (settings && settings.getPhotoAction) {\r\n getPhotoAction = settings.getPhotoAction;\r\n }\r\n \r\n if (settings && settings.uploadPhotoAction) {\r\n uploadPhotoAction = settings.uploadPhotoAction;\r\n }\r\n\r\n if (settings && settings.getPhotoThumbAction) {\r\n getPhotoThumbAction = settings.getPhotoThumbAction;\r\n }\r\n\r\n self.appendNewUploadItem = function addNewUploadItem() {\r\n $.get(AppView.actionUrls.getPhotoUploadItem, function (content) {\r\n var $content = $(content);\r\n if (self.filesWrapper.length > 0) {\r\n self.filesWrapper.append($content);\r\n }\r\n else {\r\n var $wrapper = $('#' + self.uploadWrapperId);\r\n if ($wrapper.find('.file-item').length == 0) {\r\n $('#' + self.uploadWrapperId).append(content);\r\n }\r\n }\r\n });\r\n };\r\n\r\n function initCropper() {\r\n $rcrop.rcrop(cropSettings);\r\n }\r\n\r\n function validateImgDimensions($file) {\r\n return new Promise(function (resolve, reject) {\r\n var img = new Image();\r\n\r\n img.onload = function () {\r\n var imgData = {\r\n isValid: true,\r\n name: $file.name,\r\n width: this.width,\r\n height: this.height\r\n };\r\n\r\n if (imgData.width < requiredImageDimesions.min.width || imgData.height < requiredImageDimesions.min.height) {\r\n imgData.isValid = INVALID_DIMENSION_TYPE.TO_SMALL;\r\n } else if (imgData.width > requiredImageDimesions.max.width || imgData.height > requiredImageDimesions.max.height) {\r\n imgData.isValid = INVALID_DIMENSION_TYPE.TO_LARGE;\r\n }\r\n\r\n resolve(imgData);\r\n };\r\n img.src = window.URL.createObjectURL($file);\r\n });\r\n }\r\n\r\n function showDimensionError(imgData) {\r\n let msg = \"Achtung Einige Ihrer Dateien konnten nicht hochgeladen werden, weil die Bildauflösung entweder zu klein \"\r\n + \"(min. \" + requiredImageDimesions.min.width + \" x \" + requiredImageDimesions.min.height + \"px) oder zu groß (max. \" + requiredImageDimesions.max.width + \" x \" + requiredImageDimesions.max.height +\"px) ist:\\n\\n\"\r\n + \" - \" + imgData.name + \": \";\r\n\r\n switch(imgData.isValid) {\r\n case INVALID_DIMENSION_TYPE.TO_SMALL:\r\n msg += \"ist zu klein\";\r\n break;\r\n case INVALID_DIMENSION_TYPE.TO_LARGE:\r\n msg += \"ist zu groß\";\r\n break;\r\n }\r\n\r\n msg += \" (\" + imgData.width + \"x\" + imgData.height + \"px)\";\r\n alert(msg);\r\n }\r\n\r\n function onFilesSelected(files) {\r\n var $file = files[0];\r\n var isExtValid = self.validateFileExtension($file);\r\n\r\n if (isExtValid) {\r\n validateImgDimensions($file).then(function (imgData) {\r\n if (imgData.isValid === true) {\r\n var $emptyFileItem = self.filesWrapper.find('.file-item.new-file-item')\r\n self.openCropModal($emptyFileItem, $file);\r\n } else {\r\n showDimensionError(imgData);\r\n $fileInput.val(\"\");\r\n }\r\n });\r\n }\r\n else {\r\n alert('Einige Ihrer Dateien konnten nicht hochgeladen werden, weil deren Dateityp nicht vom Typ JPG, JPEG, PNG, GIF ist: ' + $file.name);\r\n $fileInput.val(\"\");\r\n }\r\n };\r\n\r\n function setAllFileItemToNondefault() {\r\n var $fileItems = self.filesWrapper.find('.file-item');\r\n $fileItems.each(function (i, obj) {\r\n var $fileItem = $(this);\r\n setFileItemDefaultStatus($fileItem, false);\r\n });\r\n }\r\n\r\n function isAnyDefaultFileItem() {\r\n var $fileItems = self.filesWrapper.find('.file-item.default-file-item');\r\n return $fileItems.length > 0;\r\n }\r\n\r\n function setFileItemDefaultStatus($fileItem, status) {\r\n $fileItem.find('.isDefaultInput').val(status);\r\n $fileItem.removeClass('default-file-item');\r\n var $iconBtn = $fileItem.find('.icon');\r\n var className = status ? 'icon-star' : 'icon-star-outline';\r\n $iconBtn.removeClass('icon-star-outline icon-star').addClass(className);\r\n if (status) {\r\n $fileItem.addClass('default-file-item');\r\n }\r\n }\r\n\r\n function getPhotoUrl(fileName, cropped) {\r\n return `${getPhotoAction}?fileName=${fileName}`;\r\n }\r\n\r\n function getFullPhotoUrl(fileName) {\r\n return `${getPhotoAction}?fileName=${fileName}&cropped=false`;\r\n }\r\n\r\n function getThumbPhotoUrl(fileName) {\r\n return `${getPhotoThumbAction}?fileName=${fileName}`; \r\n }\r\n\r\n self.openCropModal = function openCropModal($fileItem, file) {\r\n var savedFileName = $fileItem.find('.fileNameInput').val();\r\n\r\n if (savedFileName) {\r\n $rcrop.attr('src', getFullPhotoUrl(savedFileName));\r\n }\r\n else {\r\n var fileReader = new FileReader();\r\n fileReader.onload = function (event) {\r\n var uri = event.target.result;\r\n $rcrop.attr('src', uri);\r\n };\r\n fileReader.readAsDataURL(file);\r\n }\r\n\r\n $uploadInfo = $('#uploadInfo');\r\n $cropModal.removeClass('uploading');\r\n $uploadProgressBar = $uploadInfo.find('.progress-bar');\r\n\r\n $rcrop.on('load', function () {\r\n cropModalFileItem = $fileItem;\r\n croppingFileContent = file;\r\n $cropModal.modal();\r\n });\r\n };\r\n \r\n function getCroppedThumbData() {\r\n var srcResized = $rcrop.rcrop('getDataURL', cropSettings.minSize[0], cropSettings.minSize[1]);\r\n var croppedBoundsValues = $rcrop.rcrop('getValues');\r\n\r\n return {\r\n file: srcResized,\r\n width: croppedBoundsValues.width,\r\n height: croppedBoundsValues.height,\r\n x: croppedBoundsValues.x < 0 ? 0 : croppedBoundsValues.x,\r\n y: croppedBoundsValues.y < 0 ? 0 : croppedBoundsValues.y,\r\n };\r\n }\r\n\r\n function setPreviewBg($fileItem, thumbUrl) {\r\n $fileItem.css('background-image', 'url(' + thumbUrl + ')');\r\n $fileItem.removeClass('new-file-item').addClass('preview-item-filled');\r\n }\r\n\r\n function initPreviewOfSavedFiles() {\r\n var $fileItems = self.filesWrapper.find('.file-item');\r\n\r\n $fileItems.each(function (i, obj) {\r\n var $fileItem = $(this);\r\n var fileName = $fileItem.find('.fileNameInput').val();\r\n var thumbUrl = getThumbPhotoUrl(fileName);\r\n\r\n setPreviewBg($fileItem, thumbUrl);\r\n\r\n $fileItem.find('.btn-set-default').removeClass('d-none');\r\n $fileItem.find('.btn-remove').removeClass('d-none');\r\n $fileItem.find('.btn-edit').removeClass('d-none');\r\n $fileItem.find('.btn-select-file').addClass('d-none');\r\n });\r\n }\r\n \r\n function initPreviewOfSavedFile(fileContainer) {\r\n var $fileItem = $('#' + fileContainer).find('.file-item');\r\n\r\n var fileName = $fileItem.find('.fileNameInput').val();\r\n if (!fileName)\r\n return;\r\n\r\n var thumbUrl = getThumbPhotoUrl(fileName);\r\n\r\n setPreviewBg($fileItem, thumbUrl);\r\n\r\n $fileItem.find('.btn-set-default').removeClass('d-none');\r\n $fileItem.find('.btn-remove').removeClass('d-none');\r\n $fileItem.find('.btn-edit').removeClass('d-none');\r\n $fileItem.find('.btn-select-file').addClass('d-none');\r\n }\r\n\r\n function uploadImages(file, cropData, editedFileName) {\r\n uploadAjaxRequest = $.ajax({\r\n url: uploadPhotoAction, \r\n type: 'POST',\r\n data: {\r\n Data: file,\r\n //ThumbnailData: thumbFile,\r\n CropData: cropData,\r\n EditedFileName: editedFileName || null,\r\n },\r\n xhr: function () {\r\n var xhr = $.ajaxSettings.xhr();\r\n xhr.upload.onprogress = function (e) {\r\n if (e.lengthComputable) {\r\n var progress = Math.round(e.loaded / e.total * 100);\r\n uploadProgressUpdate(progress);\r\n }\r\n };\r\n\r\n return xhr;\r\n }\r\n })\r\n .done(onImageUploadDone)\r\n .fail(function (e) {\r\n if (e.statusText != \"abort\")\r\n alert('Upload fail');\r\n });\r\n }\r\n\r\n function onImageUploadDone(res) {\r\n if (res.FileName) {\r\n cropModalFileItem.find('.fileNameInput').val(res.FileName);\r\n\r\n if (res.Url) {\r\n var $previewLink = cropModalFileItem.find('.preview-link');\r\n $previewLink.attr('href', res.Url);\r\n $previewLink.attr('data-lightbox', res.FileName);\r\n }\r\n }\r\n\r\n if (res.FileName) {\r\n cropModalFileItem.find('.thumbnailFileNameInput').val(res.FileName);\r\n }\r\n\r\n cropModalFileItem.find('fieldset').prop(\"disabled\", false);\r\n $cropModal.modal('hide');\r\n croppingFileContent = null;\r\n uploadProgressComplete();\r\n }\r\n\r\n function uploadProgressBegin() {\r\n $cropModal.addClass('uploading');\r\n $uploadProgressBar.html('0%').css('width', '0%');\r\n }\r\n\r\n function uploadProgressUpdate(progress) {\r\n var percentVal = progress + '%';\r\n $uploadProgressBar.html(percentVal).css('width', percentVal);\r\n }\r\n\r\n function uploadProgressComplete() {\r\n $cropModal.removeClass('uploading');\r\n $uploadProgressBar.html('0%').css('width', '0%');\r\n uploadAjaxRequest = null;\r\n }\r\n\r\n function initDragAndDropArea() {\r\n $dragdropFilesArea = $documentsListWrapper.find('[data-dragdrop-files-area]');\r\n $fileInput = $documentsListWrapper.find('[data-file-input]');\r\n\r\n $dragdropFilesArea.on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n })\r\n .on('dragover dragenter', function () {\r\n $dragdropFilesArea.addClass('is-dragover');\r\n })\r\n .on('dragleave dragend drop', function () {\r\n $dragdropFilesArea.removeClass('is-dragover');\r\n })\r\n .on('drop', function (e) {\r\n var droppedFiles = e.originalEvent.dataTransfer.files;\r\n onFilesSelected(droppedFiles);\r\n });\r\n\r\n $dragdropFilesArea.find('[data-choose-file-label]').on('click', function () {\r\n $fileInput.click();\r\n });\r\n\r\n $fileInput.on('change', function () {\r\n var evt = arguments[0];\r\n var files = $(this)[0].files;\r\n onFilesSelected(files);\r\n evt.target.value = '';\r\n });\r\n }\r\n\r\n function getEventElement(event) {\r\n event = event || window.event;\r\n event.preventDefault();\r\n var elem = event.target || event.srcElement;\r\n return $(elem);\r\n }\r\n\r\n self.closeCropModal = function () {\r\n if (uploadAjaxRequest) {\r\n uploadAjaxRequest.abort();\r\n if (cropModalFileItem) {\r\n cropModalFileItem.remove();\r\n }\r\n uploadProgressComplete();\r\n } else {\r\n if (cropModalFileItem.hasClass('new-file-item')) {\r\n cropModalFileItem.find('.fileInput').val('');\r\n }\r\n }\r\n cropModalFileItem = null;\r\n croppingFileContent = null;\r\n $cropModal.modal('hide');\r\n };\r\n\r\n self.initialize = function () {\r\n self.filesWrapper = $('#' + self.uploadWrapperId);\r\n initPreviewOfSavedFiles();\r\n self.addNewUploadIfNotExist();\r\n\r\n $cropModal = $('#imageCropModal');\r\n $rcrop = $('#imageCropModal').find('.rcrop');\r\n\r\n $cropModal.on('shown.bs.modal', function () {\r\n initCropper();\r\n });\r\n\r\n $cropModal.on('hidden.bs.modal', function () {\r\n $rcrop.rcrop('destroy');\r\n $rcrop.attr('src', '');\r\n $('#modal').css('overflow-y', 'auto');\r\n });\r\n\r\n $cropModal.find('button.btn-crop').on('click', function () {\r\n cropModalFileItem.find('.btn-set-default').removeClass('d-none');\r\n cropModalFileItem.find('.btn-remove').removeClass('d-none');\r\n cropModalFileItem.find('.btn-edit').removeClass('d-none');\r\n cropModalFileItem.find('.btn-select-file').addClass('d-none');\r\n\r\n var thumbData = getCroppedThumbData();\r\n var cropData = {\r\n width: thumbData.width,\r\n height: thumbData.height,\r\n x: thumbData.x,\r\n y: thumbData.y\r\n };\r\n\r\n setPreviewBg(cropModalFileItem, thumbData.file);\r\n\r\n self.addNewUploadIfNotExist();\r\n\r\n if (!isAnyDefaultFileItem()) {\r\n setFileItemDefaultStatus(cropModalFileItem, true);\r\n }\r\n\r\n uploadProgressBegin();\r\n\r\n //var photoData = croppingFileContent; //cropModalFileItem.find('.fileInput').get(0);\r\n if (croppingFileContent) {\r\n var fileReader = new FileReader();\r\n\r\n fileReader.onload = function () {\r\n uploadImages(fileReader.result, cropData);\r\n };\r\n\r\n fileReader.readAsDataURL(croppingFileContent);\r\n }\r\n else {\r\n var editedFileName = cropModalFileItem.find('.fileNameInput').val();\r\n uploadImages(null, cropData, editedFileName);\r\n }\r\n });\r\n\r\n initDragAndDropArea();\r\n };\r\n\r\n self.initPreviewOfSavedFile = initPreviewOfSavedFile;\r\n\r\n self.deleteFile = function(event) {\r\n var $clickedBtn = getEventElement(event);\r\n var $currentFileItem = $clickedBtn.closest('.file-item');\r\n\r\n $currentFileItem.remove();\r\n self.addNewUploadIfNotExist();\r\n\r\n if (!isAnyDefaultFileItem()) {\r\n var $firstFileItem = self.filesWrapper.find('.file-item').first();\r\n setFileItemDefaultStatus($firstFileItem, true);\r\n }\r\n };\r\n\r\n self.editImageFile = function (event) {\r\n var $clickedBtn = getEventElement(event);\r\n var $currentFileItem = $clickedBtn.parents('.file-item');\r\n self.openCropModal($currentFileItem);\r\n };\r\n\r\n self.setAsDefault = function (event) {\r\n var $clickedBtn = getEventElement(event);\r\n var $currentFileItem = $clickedBtn.closest('.file-item');\r\n setAllFileItemToNondefault();\r\n setFileItemDefaultStatus($currentFileItem, true);\r\n };\r\n\r\n return self;\r\n};","var ImagesUploadManager = function (uploadWrapperId, type, settings) {\r\n 'use strict';\r\n\r\n var self = new FileUploadManager(uploadWrapperId, type);\r\n \r\n var $cropModal = null;\r\n var $rcrop = null;\r\n var cropModalFileItem = null;\r\n var $uploadInfo = null;\r\n var $uploadProgressBar = null;\r\n var getPhotoAction = '/Media/GetEstatePhoto';\r\n var getPhotoThumbAction = '/Media/GetEstatePhotoThumb';\r\n var uploadPhotoAction = '/Media/UploadEstatePhoto';\r\n\r\n var uploadAjaxRequest = null;\r\n\r\n var cropSettings = {\r\n minSize: [400, 300],\r\n preserveAspectRatio: true\r\n };\r\n\r\n var maxCroppedImageDimesions = {\r\n width: 1200,\r\n height: 900\r\n };\r\n\r\n var requiredImageDimesions = {\r\n min: {\r\n width: 150,\r\n height: 112\r\n },\r\n max: {\r\n width: 6000,\r\n height: 6000\r\n }\r\n };\r\n\r\n var INVALID_DIMENSION_TYPE = {\r\n TO_SMALL: -1,\r\n TO_LARGE: -2,\r\n };\r\n\r\n if (settings && settings.requiredImageDimesions) {\r\n requiredImageDimesions = settings.requiredImageDimesions;\r\n }\r\n \r\n if (settings && settings.cropSettings) {\r\n cropSettings = settings.cropSettings;\r\n }\r\n \r\n if (settings && settings.getPhotoAction) {\r\n getPhotoAction = settings.getPhotoAction;\r\n }\r\n \r\n if (settings && settings.uploadPhotoAction) {\r\n uploadPhotoAction = settings.uploadPhotoAction;\r\n }\r\n\r\n if (settings && settings.getPhotoThumbAction) {\r\n getPhotoThumbAction = settings.getPhotoThumbAction;\r\n }\r\n\r\n self.addValidFile = function addValidFile($fileInput) {\r\n var $fileItem = $fileInput.parent();\r\n self.openCropModal($fileItem);\r\n };\r\n\r\n self.appendNewUploadItem = function addNewUploadItem() {\r\n $.get(AppView.actionUrls.getPhotoUploadItem, function (content) {\r\n var $content = $(content);\r\n if (self.filesWrapper.length > 0) {\r\n self.filesWrapper.append($content);\r\n }\r\n else {\r\n var $wrapper = $('#' + self.uploadWrapperId);\r\n if ($wrapper.find('.file-item').length == 0) {\r\n $('#' + self.uploadWrapperId).append(content);\r\n }\r\n }\r\n });\r\n };\r\n\r\n function initCropper() {\r\n $rcrop.rcrop(cropSettings);\r\n }\r\n\r\n function validateImgDimensions($file) {\r\n return new Promise(function (resolve, reject) {\r\n var img = new Image();\r\n\r\n img.onload = function () {\r\n var imgData = {\r\n isValid: true,\r\n name: $file.name,\r\n width: this.width,\r\n height: this.height\r\n };\r\n\r\n if (imgData.width < requiredImageDimesions.min.width || imgData.height < requiredImageDimesions.min.height) {\r\n imgData.isValid = INVALID_DIMENSION_TYPE.TO_SMALL;\r\n } else if (imgData.width > requiredImageDimesions.max.width || imgData.height > requiredImageDimesions.max.height) {\r\n imgData.isValid = INVALID_DIMENSION_TYPE.TO_LARGE;\r\n }\r\n\r\n resolve(imgData);\r\n };\r\n img.src = window.URL.createObjectURL($file);\r\n });\r\n }\r\n\r\n function showDimensionError(imgData) {\r\n let msg = \"Achtung Einige Ihrer Dateien konnten nicht hochgeladen werden, weil die Bildauflösung entweder zu klein \"\r\n + \"(min. \" + requiredImageDimesions.min.width + \" x \" + requiredImageDimesions.min.height + \"px) oder zu groß (max. \" + requiredImageDimesions.max.width + \" x \" + requiredImageDimesions.max.height + \"px) ist:\\n\\n\"\r\n + \" - \" + imgData.name + \": \";\r\n\r\n switch(imgData.isValid) {\r\n case INVALID_DIMENSION_TYPE.TO_SMALL:\r\n msg += \"ist zu klein\";\r\n break;\r\n case INVALID_DIMENSION_TYPE.TO_LARGE:\r\n msg += \"ist zu groß\";\r\n break;\r\n }\r\n\r\n msg += \" (\" + imgData.width + \"x\" + imgData.height + \"px)\";\r\n alert(msg);\r\n }\r\n\r\n self.onFileSelected = function onFileSelected($fileInput) {\r\n var $file = $fileInput[0].files[0];\r\n var isExtValid = self.validateFileExtension($file);\r\n\r\n if (isExtValid) {\r\n validateImgDimensions($file).then(function (imgData) {\r\n if (imgData.isValid === true) {\r\n self.addValidFile($fileInput, $file);\r\n } else {\r\n showDimensionError(imgData);\r\n $fileInput.val(\"\");\r\n }\r\n });\r\n }\r\n else {\r\n alert('Einige Ihrer Dateien konnten nicht hochgeladen werden, weil deren Dateityp nicht vom Typ JPG, JPEG, PNG, GIF ist: ' + $file.name);\r\n $fileInput.val(\"\");\r\n }\r\n };\r\n\r\n function setAllFileItemToNondefault() {\r\n var $fileItems = self.filesWrapper.find('.file-item');\r\n $fileItems.each(function (i, obj) {\r\n var $fileItem = $(this);\r\n setFileItemDefaultStatus($fileItem, false);\r\n });\r\n }\r\n\r\n function isAnyDefaultFileItem() {\r\n var $fileItems = self.filesWrapper.find('.file-item.default-file-item');\r\n return $fileItems.length > 0;\r\n }\r\n\r\n function setFileItemDefaultStatus($fileItem, status) {\r\n $fileItem.find('.isDefaultInput').val(status);\r\n $fileItem.removeClass('default-file-item');\r\n var $iconBtn = $fileItem.find('.icon');\r\n var className = status ? 'icon-star' : 'icon-star-outline';\r\n $iconBtn.removeClass('icon-star-outline icon-star').addClass(className);\r\n if (status) {\r\n $fileItem.addClass('default-file-item');\r\n }\r\n }\r\n\r\n function resizeRcropThumbIfParamsExist($thumbInput) {\r\n var xPos = $thumbInput.data('x');\r\n if (typeof xPos !== 'undefined' && xPos !== null) {\r\n $rcrop.one('rcrop-ready', function () {\r\n $rcrop.rcrop('resize', $thumbInput.data('width'), $thumbInput.data('height'), $thumbInput.data('x'), $thumbInput.data('y'));\r\n });\r\n }\r\n }\r\n\r\n function getPhotoUrl(fileName, cropped) {\r\n return `${getPhotoAction}?fileName=${fileName}`;\r\n }\r\n\r\n function getFullPhotoUrl(fileName) {\r\n return `${getPhotoAction}?fileName=${fileName}&cropped=false`;\r\n }\r\n\r\n function getThumbPhotoUrl(fileName) {\r\n return `${getPhotoThumbAction}?fileName=${fileName}`; \r\n }\r\n\r\n self.openCropModal = function openCropModal($fileItem) {\r\n var $thumbInput = $fileItem.find('.thumbnailInput');\r\n var file = $fileItem.find('.fileInput')[0].files[0];\r\n resizeRcropThumbIfParamsExist($thumbInput);\r\n\r\n var savedFileName = $fileItem.find('.fileNameInput').val();\r\n\r\n if (savedFileName) {\r\n $rcrop.attr('src', getFullPhotoUrl(savedFileName));\r\n }\r\n else {\r\n var fileReader = new FileReader();\r\n fileReader.onload = function (event) {\r\n var uri = event.target.result;\r\n $rcrop.attr('src', uri);\r\n };\r\n fileReader.readAsDataURL(file);\r\n }\r\n\r\n $uploadInfo = $('#uploadInfo');\r\n $cropModal.removeClass('uploading');\r\n $uploadProgressBar = $uploadInfo.find('.progress-bar');\r\n\r\n $rcrop.on('load', function () {\r\n cropModalFileItem = $fileItem;\r\n $cropModal.modal();\r\n });\r\n };\r\n\r\n self.setAsDefault = function setAsDefault($fileItem) {\r\n setAllFileItemToNondefault();\r\n setFileItemDefaultStatus($fileItem, true);\r\n };\r\n\r\n self.removeFile = function removeFile($fileItem, force) {\r\n $fileItem.remove();\r\n\r\n self.addNewUploadIfNotExist();\r\n\r\n if (!isAnyDefaultFileItem()) {\r\n var $firstFileItem = self.filesWrapper.find('.file-item').first();\r\n setFileItemDefaultStatus($firstFileItem, true);\r\n }\r\n };\r\n \r\n function getCroppedThumbData() {\r\n var srcResized = $rcrop.rcrop('getDataURL', cropSettings.minSize[0], cropSettings.minSize[1]);\r\n var croppedBoundsValues = $rcrop.rcrop('getValues');\r\n\r\n return {\r\n file: srcResized,\r\n width: croppedBoundsValues.width,\r\n height: croppedBoundsValues.height,\r\n x: croppedBoundsValues.x < 0 ? 0 : croppedBoundsValues.x,\r\n y: croppedBoundsValues.y < 0 ? 0 : croppedBoundsValues.y,\r\n };\r\n }\r\n\r\n function setPreviewBg($fileItem, thumbUrl) {\r\n $fileItem.find('.preview').css('background-image', 'url(' + thumbUrl + ')');\r\n $fileItem.removeClass('new-file-item').addClass('preview-item-filled');\r\n }\r\n\r\n function initPreviewOfSavedFiles() {\r\n var $fileItems = self.filesWrapper.find('.file-item');\r\n\r\n $fileItems.each(function (i, obj) {\r\n var $fileItem = $(this);\r\n var fileName = $fileItem.find('.fileNameInput').val();\r\n var thumbUrl = getThumbPhotoUrl(fileName);\r\n\r\n setPreviewBg($fileItem, thumbUrl);\r\n\r\n $fileItem.find('.btn-set-default').removeClass('d-none');\r\n $fileItem.find('.btn-remove').removeClass('d-none');\r\n $fileItem.find('.btn-edit').removeClass('d-none');\r\n $fileItem.find('.btn-select-file').addClass('d-none');\r\n });\r\n }\r\n \r\n function initPreviewOfSavedFile(fileContainer) {\r\n var $fileItem = $('#' + fileContainer).find('.file-item');\r\n\r\n var fileName = $fileItem.find('.fileNameInput').val();\r\n if (!fileName)\r\n return;\r\n\r\n var thumbUrl = getThumbPhotoUrl(fileName);\r\n\r\n setPreviewBg($fileItem, thumbUrl);\r\n\r\n $fileItem.find('.btn-set-default').removeClass('d-none');\r\n $fileItem.find('.btn-remove').removeClass('d-none');\r\n $fileItem.find('.btn-edit').removeClass('d-none');\r\n $fileItem.find('.btn-select-file').addClass('d-none');\r\n }\r\n\r\n function uploadImages(file, cropData, editedFileName) {\r\n uploadAjaxRequest = $.ajax({\r\n url: uploadPhotoAction, \r\n type: 'POST',\r\n data: {\r\n Data: file,\r\n //ThumbnailData: thumbFile,\r\n CropData: cropData,\r\n EditedFileName: editedFileName || null,\r\n },\r\n xhr: function () {\r\n var xhr = $.ajaxSettings.xhr();\r\n xhr.upload.onprogress = function (e) {\r\n if (e.lengthComputable) {\r\n var progress = Math.round(e.loaded / e.total * 100);\r\n uploadProgressUpdate(progress);\r\n }\r\n };\r\n\r\n return xhr;\r\n }\r\n })\r\n .done(onImageUploadDone)\r\n .fail(function (e) {\r\n if (e.statusText != \"abort\")\r\n alert('Upload fail');\r\n });\r\n }\r\n\r\n function onImageUploadDone(res) {\r\n if (res.FileName) {\r\n cropModalFileItem.find('.fileNameInput').val(res.FileName);\r\n\r\n /*if (res.Url) {\r\n var $preview = cropModalFileItem.find('.preview');\r\n $preview.attr('href', res.Url);\r\n $preview.attr('data-lightbox', res.FileName);\r\n }*/\r\n }\r\n\r\n if (res.FileName) {\r\n cropModalFileItem.find('.thumbnailFileNameInput').val(res.FileName);\r\n }\r\n\r\n cropModalFileItem.find('fieldset').prop(\"disabled\", false);\r\n $cropModal.modal('hide');\r\n uploadProgressComplete();\r\n }\r\n\r\n function uploadProgressBegin() {\r\n $cropModal.addClass('uploading');\r\n $uploadProgressBar.html('0%').css('width', '0%');\r\n }\r\n\r\n function uploadProgressUpdate(progress) {\r\n var percentVal = progress + '%';\r\n $uploadProgressBar.html(percentVal).css('width', percentVal);\r\n }\r\n\r\n function uploadProgressComplete() {\r\n $cropModal.removeClass('uploading');\r\n $uploadProgressBar.html('0%').css('width', '0%');\r\n uploadAjaxRequest = null;\r\n }\r\n\r\n\r\n self.closeCropModal = function () {\r\n if (uploadAjaxRequest) {\r\n uploadAjaxRequest.abort();\r\n if (cropModalFileItem) {\r\n cropModalFileItem.remove();\r\n }\r\n uploadProgressComplete();\r\n } else {\r\n if (cropModalFileItem.hasClass('new-file-item')) {\r\n cropModalFileItem.find('.fileInput').val('');\r\n }\r\n }\r\n cropModalFileItem = null;\r\n $cropModal.modal('hide');\r\n };\r\n\r\n self.initialize = function () {\r\n self.filesWrapper = $('#' + self.uploadWrapperId);\r\n initPreviewOfSavedFiles();\r\n self.addNewUploadIfNotExist();\r\n\r\n $cropModal = $('#imageCropModal');\r\n $rcrop = $('#imageCropModal').find('.rcrop');\r\n\r\n $cropModal.on('shown.bs.modal', function () {\r\n initCropper();\r\n });\r\n\r\n $cropModal.on('hidden.bs.modal', function () {\r\n $rcrop.rcrop('destroy');\r\n $rcrop.attr('src', '');\r\n $('#modal').css('overflow-y', 'auto');\r\n });\r\n\r\n $cropModal.find('button.btn-crop').on('click', function () {\r\n cropModalFileItem.find('.btn-set-default').removeClass('d-none');\r\n cropModalFileItem.find('.btn-remove').removeClass('d-none');\r\n cropModalFileItem.find('.btn-edit').removeClass('d-none');\r\n cropModalFileItem.find('.btn-select-file').addClass('d-none');\r\n\r\n var thumbData = getCroppedThumbData();\r\n var cropData = {\r\n width: thumbData.width,\r\n height: thumbData.height,\r\n x: thumbData.x,\r\n y: thumbData.y\r\n };\r\n\r\n setPreviewBg(cropModalFileItem, thumbData.file);\r\n\r\n self.addNewUploadIfNotExist();\r\n\r\n if (!isAnyDefaultFileItem()) {\r\n setFileItemDefaultStatus(cropModalFileItem, true);\r\n }\r\n\r\n uploadProgressBegin();\r\n\r\n var photoData = cropModalFileItem.find('.fileInput').get(0);\r\n if (photoData.files.length) {\r\n var fileReader = new FileReader();\r\n\r\n fileReader.onload = function () {\r\n uploadImages(fileReader.result, cropData);\r\n };\r\n\r\n fileReader.readAsDataURL(photoData.files[0]);\r\n }\r\n else {\r\n var editedFileName = cropModalFileItem.find('.fileNameInput').val();\r\n uploadImages(null, cropData, editedFileName);\r\n }\r\n });\r\n\r\n };\r\n\r\n self.initPreviewOfSavedFile = initPreviewOfSavedFile;\r\n\r\n return self;\r\n};","$.fn.inputSuggestions = function (settings) {\r\n var BOX_TEMPLATE = '
    ';\r\n var OFFSET_FROM_INPUT = 4;\r\n\r\n validateSettingsRequiredProperties();\r\n\r\n if (settings.inputDebounce === undefined) {\r\n settings.inputDebounce = 250;\r\n }\r\n\r\n if (settings.onlySuggestions === undefined) {\r\n settings.onlySuggestions = true;\r\n }\r\n\r\n var $input = $(this);\r\n var $window = $(window);\r\n var $body = $(document.body);\r\n var $box = null;\r\n var $selectedItem = null;\r\n var currentInputValue = $(this).val();\r\n\r\n var enabled = false;\r\n var currentRequest = null;\r\n var requestTimeout = null;\r\n var isDirty = false;\r\n var forceSuggestionInput = false;\r\n\r\n hookUpEventListeners();\r\n\r\n function validateSettingsRequiredProperties() {\r\n if (settings === undefined) throw 'Missing required settings object.';\r\n if (settings.dataSource === undefined) throw 'Missing required dataSource settings.';\r\n if (settings.dataSource.url === undefined) throw 'Missing required dataSource.url setting.';\r\n }\r\n\r\n function hookUpEventListeners() {\r\n $window.on('resize', positionBox);\r\n\r\n $input.on('focusin', enable);\r\n $input.on('blur', onInputBlurred);\r\n $input.on('input', onInputChange);\r\n $input.on('keydown', onInputKeyDown);\r\n }\r\n\r\n function onInputBlurred() {\r\n if (!$input.val() && currentInputValue !== \"\") {\r\n raiseSettingCallback('clearCallback');\r\n }\r\n else {\r\n\r\n if (settings.onlySuggestions) {\r\n $input.val(currentInputValue);\r\n }\r\n else {\r\n if (forceSuggestionInput && currentInputValue) {\r\n $input.val(currentInputValue);\r\n forceSuggestionInput = false;\r\n }\r\n else {\r\n currentInputValue = $input.val();\r\n }\r\n\r\n if (isDirty) {\r\n if (currentInputValue) {\r\n raiseSettingCallback('selectCallback');\r\n } else {\r\n raiseSettingCallback('clearCallback');\r\n }\r\n\r\n isDirty = false;\r\n }\r\n }\r\n }\r\n\r\n disable();\r\n }\r\n\r\n function onInputChange() {\r\n isDirty = true;\r\n requestSuggestions();\r\n }\r\n\r\n function requestSuggestions() {\r\n var input = $input.val();\r\n\r\n clearTimeout(requestTimeout);\r\n\r\n if (input.length || settings.requestEmptyString) {\r\n requestTimeout = setTimeout(function () {\r\n makeRequestForKey(input);\r\n }, settings.inputDebounce);\r\n }\r\n }\r\n\r\n function makeRequestForKey(key) {\r\n abortCurrentRequest();\r\n\r\n var options = {\r\n url: settings.dataSource.url,\r\n data: prepareRequestData(key)\r\n };\r\n\r\n currentRequest = $.ajax(options).done(onRequestComplete);\r\n }\r\n\r\n function prepareRequestData(key) {\r\n var data = settings.dataSource.data != undefined ? settings.dataSource.data : {};\r\n\r\n if (typeof (data) == 'function') {\r\n data = data(key);\r\n }\r\n\r\n if (settings.dataSource.paramName != undefined) {\r\n data[settings.dataSource.paramName] = key;\r\n }\r\n return data;\r\n }\r\n\r\n function abortCurrentRequest() {\r\n if (currentRequest !== null) {\r\n currentRequest.abort();\r\n currentRequest = null;\r\n }\r\n }\r\n\r\n function onInputKeyDown(e) {\r\n if (!enabled || currentRequest !== null) {\r\n return;\r\n }\r\n\r\n switch (e.which) {\r\n case 13: // Enter\r\n if ($selectedItem !== null) {\r\n applySelectedItem();\r\n }\r\n break;\r\n\r\n case 27: // Esc\r\n disable();\r\n break;\r\n\r\n case 38: // Up arrow\r\n selectPreviousItem();\r\n break;\r\n\r\n case 40: // Down Arrow\r\n selectNextItem();\r\n break;\r\n\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n function onRequestComplete(data) {\r\n if (data !== null && enabled) {\r\n loadSuggestions(data);\r\n }\r\n\r\n currentRequest = null;\r\n }\r\n\r\n function loadSuggestions(data) {\r\n if ($box === null) {\r\n createBox();\r\n }\r\n\r\n $box.html(data);\r\n\r\n var $items = $box.find('*[data-suggestion-item]');\r\n $items.on('mouseover', onItemMouseOver);\r\n $items.on('click', onItemClick);\r\n }\r\n\r\n function onItemMouseOver() {\r\n if(settings.onlySuggestions) {\r\n selectItem($(this));\r\n } else {\r\n var $items = $box.find('*[data-suggestion-item]');\r\n $items.removeClass('active');\r\n $(this).addClass('active');\r\n }\r\n }\r\n\r\n function onItemClick() {\r\n $selectedItem = $(this);\r\n applySelectedItem();\r\n }\r\n\r\n function enable() {\r\n enabled = true;\r\n currentInputValue = $input.val();\r\n\r\n requestSuggestions();\r\n }\r\n\r\n function disable() {\r\n if ($box !== null) {\r\n destroyBox();\r\n }\r\n\r\n enabled = false;\r\n }\r\n\r\n function applySelectedItem() {\r\n var preActionValue = $selectedItem.attr('data-pre-action');\r\n var preAction = eval(preActionValue);\r\n var actionValue = $selectedItem.attr('data-action');\r\n var action = eval(actionValue);\r\n\r\n if (typeof action === 'function') {\r\n action();\r\n }\r\n \r\n if (typeof preAction === 'function') {\r\n preAction();\r\n }\r\n\r\n if (settings.forceInputReplace)\r\n forceSuggestionInput = true;\r\n\r\n currentInputValue = $selectedItem.attr('data-suggestion-item');\r\n raiseSettingCallback('selectCallback', $selectedItem.data());\r\n\r\n $selectedItem = null;\r\n isDirty = false;\r\n\r\n $input.blur();\r\n }\r\n\r\n function selectNextItem() {\r\n var $nextItem;\r\n\r\n if ($selectedItem === null) {\r\n $nextItem = $box.find('*[data-suggestion-item]:first');\r\n }\r\n else {\r\n $nextItem = $selectedItem.next();\r\n\r\n if (!$nextItem.length) {\r\n $nextItem = $box.find('*[data-suggestion-item]:first');\r\n }\r\n }\r\n\r\n selectItem($nextItem);\r\n }\r\n\r\n function selectPreviousItem() {\r\n var $prevItem;\r\n\r\n if ($selectedItem === null) {\r\n $prevItem = $box.find('*[data-suggestion-item]:last');\r\n }\r\n else {\r\n $prevItem = $selectedItem.prev();\r\n\r\n if (!$prevItem.length) {\r\n $prevItem = $box.find('*[data-suggestion-item]:last');\r\n }\r\n }\r\n\r\n selectItem($prevItem);\r\n }\r\n\r\n function selectItem($item) {\r\n var $items = $box.find('*[data-suggestion-item]');\r\n\r\n $items.removeClass('active');\r\n $item.addClass('active');\r\n\r\n $selectedItem = $item;\r\n }\r\n\r\n function refreshBoxPositionOnScroll() {\r\n debounceEventFn(positionBox, 10);\r\n }\r\n\r\n function debounceEventFn(method, delay) {\r\n clearTimeout(method._timeoutId);\r\n method._timeoutId = setTimeout(function () {\r\n method();\r\n }, delay);\r\n }\r\n\r\n function onWrapperScrolled() {\r\n $input.trigger('blur');\r\n }\r\n\r\n function createBox() {\r\n $box = $(BOX_TEMPLATE);\r\n positionBox();\r\n\r\n $body.append($box);\r\n $box.find('.content-wrapper').perfectScrollbar();\r\n\r\n $box.on('mousedown', function (event) {\r\n event.preventDefault();\r\n });\r\n\r\n if (settings.hideOnWrapperScrolled) {\r\n $(settings.hideOnWrapperScrolled).on('scroll', onWrapperScrolled);\r\n $(window).on('scroll', onWrapperScrolled);\r\n }\r\n\r\n if (settings.updatePositionOnWrapperScrolled) {\r\n $(settings.updatePositionOnWrapperScrolled).on('scroll', refreshBoxPositionOnScroll);\r\n $(window).on('scroll', onWrapperScrolled);\r\n }\r\n }\r\n\r\n function destroyBox() {\r\n if ($box !== null) {\r\n $box.remove();\r\n $box = null;\r\n\r\n if (settings.hideOnWrapperScrolled) {\r\n $(settings.hideOnWrapperScrolled).off('scroll', onWrapperScrolled);\r\n $(window).off('scroll', onWrapperScrolled);\r\n }\r\n\r\n if (settings.updatePositionOnWrapperScrolled) {\r\n $(settings.updatePositionOnWrapperScrolled).off('scroll', refreshBoxPositionOnScroll);\r\n $(window).off('scroll', onWrapperScrolled);\r\n }\r\n }\r\n }\r\n\r\n function positionBox() {\r\n if ($box == null)\r\n return;\r\n\r\n var inputBounds = $input[0].getBoundingClientRect();\r\n var topOffset = window.pageYOffset + (inputBounds.top + inputBounds.height) + OFFSET_FROM_INPUT;\r\n var leftOffset = window.pageXOffset + inputBounds.left;\r\n\r\n $box.css({\r\n top: topOffset,\r\n left: leftOffset,\r\n minWidth: inputBounds.width,\r\n maxWidth: window.innerWidth - leftOffset - 15\r\n });\r\n }\r\n\r\n function raiseSettingCallback(callbackName) {\r\n var callback = settings[callbackName];\r\n\r\n if (callback !== undefined) {\r\n if (typeof callback !== 'function') {\r\n throw 'Expected ' + callbackName + ' setting to be a function';\r\n }\r\n\r\n callback($selectedItem);\r\n }\r\n }\r\n};","(function () {\r\n $.fn.numberVal = function (newVal) {\r\n var $input = $(this);\r\n\r\n if (newVal !== undefined) {\r\n $input.val(newVal);\r\n //formatNumericInput($input);\r\n }\r\n else {\r\n var val = $input.val();\r\n\r\n if (val === null || val === undefined || !val.length) {\r\n return null;\r\n }\r\n\r\n return parseFloat(val.replace(/\\./g, \"\"));\r\n }\r\n };\r\n\r\n $.fn.optionsDropDown = function (onCloseDropDownFn) {\r\n $(this).each(function () {\r\n var $this = $(this);\r\n var $checkboxes = $this.find('input[type=checkbox]:not([data-toggle])');\r\n var $toggleAllCheckbox = $this.find('input[type=checkbox][data-toggle-all]');\r\n var $selectBtn = $this.find('button[data-select-button]:first > span');\r\n var $dropdownList = $this.find('.dropdown-menu');\r\n var name = $this.attr('data-name') || $this.attr('data-empty-text');\r\n var textFormattingDisabled = $this.attr('data-disable-text-formatting') !== undefined;\r\n\r\n function refresh() {\r\n var everyChecked = $checkboxes.not(':disabled').length === $checkboxes.not(':disabled').filter(':checked').length && $checkboxes.not(':disabled').length;\r\n $toggleAllCheckbox.prop('checked', everyChecked);\r\n\r\n if (!textFormattingDisabled) {\r\n var options = [];\r\n\r\n $checkboxes.not(':disabled').filter(':checked').each(function () {\r\n options.push($(this).attr('data-label'));\r\n });\r\n\r\n if (options.length) {\r\n if (name) {\r\n var value = '' + name + ': ';\r\n\r\n if (everyChecked) {\r\n value += 'Alle';\r\n } else {\r\n if (options.length === 1) {\r\n value += options[0];\r\n } else {\r\n value += options.length;\r\n }\r\n }\r\n } else {\r\n value = options.join(', ');\r\n }\r\n\r\n $selectBtn.html(value);\r\n } else {\r\n $selectBtn.html(name ? name : '-');\r\n }\r\n }\r\n }\r\n\r\n initOptionsListFields(refresh, $this);\r\n initFilterCheckboxesList($this);\r\n\r\n $dropdownList.add($this.find('*[data-keep-open-on-click]')).click(function (e) {\r\n e.stopPropagation();\r\n });\r\n\r\n $this.on('shown.bs.dropdown',\r\n function () {\r\n $dropdownList.perfectScrollbar('update');\r\n });\r\n\r\n // if (onCloseDropDownFn) {\r\n // $this.on('hidden.bs.dropdown', onCloseDropDownFn);\r\n // }\r\n\r\n refresh();\r\n });\r\n };\r\n\r\n function setCheckboxStateByControllingField(controllingField) {\r\n var $checkboxes = controllingField.find('input[type=checkbox]:not([data-toggle])');\r\n if($checkboxes.length) {\r\n $('[data-observe-controlling-field=\"' + controllingField.data('name') + '\"]').each(function(controlledFieldIndex, controlledField) {\r\n $checkboxes.each(function(checkboxIndex, checkbox) {\r\n if($(controlledField).find('input[type=checkbox][data-label=\"' + $(checkbox).data('label') + '\"]:not([data-toggle])').length) {\r\n $(controlledField).find('input[type=checkbox][data-label=\"' + $(checkbox).data('label') + '\"]:not([data-toggle])').each(function(controlledCheckboxIndex, controlledCheckbox) {\r\n $(controlledCheckbox).prop('checked', $(checkbox).prop('checked'));\r\n });\r\n }\r\n if($(controlledField).find('.checkbox.group-top-node-checkbox[data-label=\"' + $(checkbox).data('label') + '\"]').length) {\r\n $(controlledField).find('.checkbox.group-top-node-checkbox[data-label=\"' + $(checkbox).data('label') + '\"]').each(function(controlledGroupIndex, controlledGroup) {\r\n var groupCheckboxes = $(controlledGroup).next('[data-sub-options]').find('input[type=checkbox]:not([data-toggle])');\r\n var groupToggle = $(controlledField).find('.checkbox.group-top-node-checkbox[data-label=\"' + $(checkbox).data('label') + '\"]').find('input[type=checkbox][data-toggle-tree-node]');\r\n \r\n var checkboxIsChecked = $(checkbox).prop('checked');\r\n\r\n groupCheckboxes.prop('checked', checkboxIsChecked).prop('disabled', !checkboxIsChecked);\r\n groupToggle.prop('disabled', !checkboxIsChecked).prop('checked', checkboxIsChecked).trigger('change');\r\n });\r\n }\r\n \r\n $(controlledField)\r\n .find('input[type=checkbox][data-toggle-all]')\r\n .prop('disabled', !($(controlledField).find('input[type=checkbox]:not([data-toggle]):not(:disabled)').length))\r\n ;\r\n });\r\n });\r\n }\r\n }\r\n\r\n function initOptionsListFields(fn, view) {\r\n 'use strict';\r\n\r\n var $checkboxes = view.find('input[type=checkbox]:not([data-toggle])');\r\n var $toggleNodeCheckboxes = view.find('input[type=checkbox][data-toggle-tree-node]');\r\n var $toggleNodeExpandArrows = view.find(\"img.tree-expand-arrow\");\r\n var $toggleAllCheckbox = view.find('input[type=checkbox][data-toggle-all]');\r\n\r\n setCheckboxGroupStateOnInitialize(view);\r\n\r\n $checkboxes.change(function () {\r\n var $checkbox = $(this);\r\n var $list = $checkbox.closest('ul');\r\n if($('[data-observe-controlling-field=\"' + view.data('name') + '\"]').length) {\r\n setCheckboxStateByControllingField(view);\r\n }\r\n\r\n if ($list.is('[data-sub-options]')) {\r\n var anyNodeWithCategoryChecked = $list.closest('ul').find('input[type=checkbox]:checked').length > 0;\r\n var anyNodeWithoutCategoryChecked = $list.parents('li[data-group-top-node]').find('ul[data-sub-options]').last().find('input[type=checkbox]:checked').length > 0;\r\n\r\n var $toggleNodeCheckbox = $list.parents('li[data-group-top-node]').find('input[type=checkbox][data-toggle-tree-node]:first');\r\n var $toggleLocalNodeCheckbox = $list.parent('li[data-group-top-node]').find('input[type=checkbox][data-toggle-tree-node]:first');\r\n\r\n $toggleNodeCheckbox.prop('checked', (anyNodeWithCategoryChecked || anyNodeWithoutCategoryChecked));\r\n\r\n var anyWithinLocalNodeChecked = $list.parent('li[data-group-top-node]').find('input[type=checkbox]:checked').length > 1;\r\n $toggleLocalNodeCheckbox.prop('checked', anyWithinLocalNodeChecked);\r\n }\r\n\r\n fn();\r\n });\r\n\r\n $toggleAllCheckbox.change(function () {\r\n var selectAll = $toggleAllCheckbox.is(':checked');\r\n\r\n $checkboxes.not(':disabled').prop('checked', selectAll);\r\n $toggleNodeCheckboxes.not(':disabled').prop('checked', selectAll);\r\n \r\n setCheckboxStateByControllingField($(this).parents('[data-options-dropdown]'));\r\n fn();\r\n });\r\n\r\n $toggleNodeCheckboxes.change(function () {\r\n var $checkbox = $(this);\r\n var $toggleNodeCheckbox = $checkbox.parents('li[data-group-top-node]').find('input[type=checkbox][data-toggle-tree-node]:first');\r\n var $nodeCheckboxes = $checkbox.closest('li').find('input[type=checkbox]:not(:disabled)');\r\n var anyNodeWithoutCategoryChecked = $checkbox.closest('ul').parents('li[data-group-top-node]').find('ul[data-sub-options]').last().find('input[type=checkbox]:checked').length > 0;\r\n\r\n var check = $checkbox.is(':checked');\r\n\r\n $toggleNodeCheckbox.prop('checked', check || anyNodeWithoutCategoryChecked);\r\n $nodeCheckboxes.prop('checked', check);\r\n\r\n var $parentGroup = $checkbox.parents('ul[data-sub-options]');\r\n if ($parentGroup.length) {\r\n toggleParentCheckboxGroup($parentGroup);\r\n }\r\n\r\n fn();\r\n });\r\n\r\n $toggleNodeExpandArrows.click(function () {\r\n var $icon = $(this);\r\n var $nodeCheckboxes = $icon.closest('li').find('ul');\r\n\r\n $nodeCheckboxes.toggle();\r\n $icon.toggleClass(\"fold\");\r\n });\r\n }\r\n\r\n function setCheckboxGroupStateOnInitialize(view) {\r\n var $lastLevelCheckboxesGroup = view.find('ul[data-sub-options]:not([data-group])');\r\n $lastLevelCheckboxesGroup.each(function () {\r\n let $lastLevelGroup = $(this);\r\n toggleParentCheckboxGroup($lastLevelGroup);\r\n });\r\n }\r\n\r\n function toggleParentCheckboxGroup($group) {\r\n var $notCheckedInGroup = $group.find('>li .checkbox input[type=\"checkbox\"]:not(:checked)');\r\n var $topNodeGroupCheckbox = $group.prev('.checkbox');\r\n if ($topNodeGroupCheckbox.length) {\r\n var isAllChecked = $notCheckedInGroup.length === 0;\r\n $topNodeGroupCheckbox.children('input[type=\"checkbox\"]').prop('checked', isAllChecked);\r\n }\r\n var $parentGroup = $group.parents('ul[data-sub-options]');\r\n if ($parentGroup.length) {\r\n toggleParentCheckboxGroup($parentGroup);\r\n }\r\n }\r\n\r\n function initFilterCheckboxesList(view) {\r\n var $checkboxes = view.find('li[data-group]');\r\n var $lastLevelCheckboxesGroup = view.find('ul[data-sub-options]:not([data-group])');\r\n var $allTopNodesGroup = view.find('li[data-group-top-node]');\r\n var $filterInput = view.find('[data-filter-input]');\r\n var $dropdownList = view.find('.dropdown-menu');\r\n var $selectAllItem = view.find('.select-all-item');\r\n\r\n setCheckboxStateByControllingField(view);\r\n\r\n if ($filterInput.length) {\r\n $filterInput.on(\"input\", function () {\r\n var term = $(this).val();\r\n $allTopNodesGroup.removeClass('hidden-group-top-node-checkbox');\r\n $checkboxes.show().unmark();\r\n $selectAllItem.show();\r\n if (term) {\r\n $checkboxes.mark(term, {\r\n separateWordSearch: false,\r\n diacritics: false,\r\n done: function () {\r\n $checkboxes.not(\":has(mark)\").hide();\r\n $selectAllItem.hide();\r\n hideEmptyTopNodes();\r\n }\r\n });\r\n }\r\n $dropdownList.perfectScrollbar('update');\r\n });\r\n\r\n view.on('hidden.bs.dropdown',\r\n function () {\r\n $checkboxes.show().unmark();\r\n $filterInput.val('');\r\n $selectAllItem.show();\r\n $allTopNodesGroup.removeClass('hidden-group-top-node-checkbox');\r\n });\r\n }\r\n\r\n function hideEmptyTopNodes() {\r\n $lastLevelCheckboxesGroup.each(function () {\r\n let $lastLevelGroup = $(this);\r\n let $downListVisibleCheckboxes = $lastLevelGroup.find('li[data-group]:visible');\r\n let $allParentsTopNode = $lastLevelGroup.parents('li[data-group-top-node]');\r\n if ($downListVisibleCheckboxes.length) {\r\n $allParentsTopNode.removeClass('hidden-group-top-node-checkbox');\r\n } else {\r\n $allParentsTopNode.addClass('hidden-group-top-node-checkbox');\r\n }\r\n });\r\n }\r\n }\r\n\r\n $.fn.postalCodeInput = function () {\r\n function filterChars($input) {\r\n $input.val($input.val().replace(/[^\\d].+/, ''));\r\n }\r\n\r\n function format($input) {\r\n var value = $input.val();\r\n\r\n for (var i = value.length; i < 5; i++) {\r\n value = '0' + value;\r\n }\r\n\r\n $input.val(value);\r\n }\r\n\r\n $(this).each(function () {\r\n var $this = $(this);\r\n\r\n $this.on('keypress keyup blur', function (e) {\r\n filterChars($this);\r\n\r\n if (e.which < 48 || e.which > 57) {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n $this.on('blur', function (e) {\r\n format($this);\r\n });\r\n\r\n filterChars($this);\r\n format($this);\r\n });\r\n };\r\n\r\n $.fn.numberRangeFields = function() {\r\n $(this).each(function() {\r\n var $this = $(this);\r\n $this.attr('data-number-range-initialized', '');\r\n\r\n var inputFrom = $this.find('[data-input-from]');\r\n var inputTo = $this.find('[data-input-to]');\r\n\r\n inputFrom.on('change', function() {\r\n var currentValue = AutoNumeric.getAutoNumericElement($(this).get(0)).getNumber();\r\n var rangeBox = $(this).parents('[data-number-range]');\r\n var inputTo = rangeBox.find('[data-input-to]');\r\n var currentMaxValue = AutoNumeric.getAutoNumericElement(inputTo.get(0)).getNumber();\r\n if(inputTo.val() == '' || currentMaxValue == 0) {\r\n currentMaxValue = parseFloat(rangeBox.data('max'));\r\n }\r\n if(currentValue > currentMaxValue) {\r\n AutoNumeric.getAutoNumericElement($(this).get(0)).set(currentMaxValue);\r\n }\r\n });\r\n\r\n inputTo.on('change', function() {\r\n var currentValue = AutoNumeric.getAutoNumericElement($(this).get(0)).getNumber();\r\n var rangeBox = $(this).parents('[data-number-range]');\r\n var inputFrom = rangeBox.find('[data-input-from]');\r\n var currentMinValue = AutoNumeric.getAutoNumericElement(inputFrom.get(0)).getNumber();\r\n if(inputFrom.val() == '' || currentMinValue == 0) {\r\n currentMinValue = parseFloat(rangeBox.data('min'));\r\n }\r\n if(currentValue < currentMinValue) {\r\n AutoNumeric.getAutoNumericElement($(this).get(0)).set(currentMinValue);\r\n }\r\n\r\n });\r\n });\r\n }\r\n setTimeout(function() {\r\n $('[data-number-range]:not([data-number-range-initialized]').numberRangeFields();\r\n });\r\n\r\n})();\r\n\r\n//$.fn.enableNumeric = function () {\r\n// var $input = $(this);\r\n\r\n// if (!$input.is('input, textarea')) {\r\n// throw 'Trying to enable numeric formatter on element being not input nor textarea.';\r\n// }\r\n\r\n// formatNumericInput($input);\r\n\r\n// $input.on('change paste keyup', function () {\r\n// formatNumericInput($input);\r\n// });\r\n//};\r\n\r\n//function formatNumericInput($input) {\r\n// $input.val(format.call($input.val().split('.').join(''), '.', ','));\r\n//}\r\n\r\n//function format(comma, period) {\r\n// comma = comma || ',';\r\n// period = period || '.';\r\n// var split = this.toString().split('.');\r\n// var numeric = split[0];\r\n// var decimal = split.length > 1 ? period + split[1] : '';\r\n// var reg = /(\\d+)(\\d{3})/;\r\n// while (reg.test(numeric)) {\r\n// numeric = numeric.replace(reg, '$1' + comma + '$2');\r\n// }\r\n// return numeric + decimal;\r\n//}","var MapAreaEditor = function () {\r\n var self = this;\r\n\r\n var poly = null;\r\n var map = null;\r\n var markers = [];\r\n var marker = '';\r\n var mapManager = null;\r\n var selectedArea = null;\r\n var selectedLat = null;\r\n var selectedLng = null;\r\n var selectedZoom = null;\r\n var selectedField = '';\r\n var areaEditPolygon = null;\r\n var points = [];\r\n\r\n var icon = {\r\n path: \"M-10,0a10,10 0 1,0 20,0a10,10 0 1,0 -20,0\",\r\n fillColor: '#ffffff',\r\n fillOpacity: 1,\r\n stroke: '#ffff00',\r\n anchor: new google.maps.Point(0, 0),\r\n scale: 0.4\r\n }\r\n\r\n var onSubmit = function () {\r\n $('#areaEditModal').modal('hide');\r\n if (selectedField != '') {\r\n AutoNumeric.getAutoNumericElement(selectedField).set(selectedArea);\r\n }\r\n };\r\n\r\n var onClean = function () {\r\n self.cleanPoints();\r\n };\r\n\r\n /* Map utilities */\r\n\r\n function calculateArea() {\r\n var localPoints = [];\r\n\r\n var polygonPath = poly.getPath();\r\n\r\n for (var i = 0; i < polygonPath.getLength(); i++) {\r\n var point = polygonPath.getAt(i);\r\n\r\n localPoints.push([\r\n point.lat(),\r\n point.lng()\r\n ]);\r\n }\r\n\r\n var ratio = mapManager.getCurrentPixelRatio();\r\n var toleranceExp = localPoints.length <= 200 ? 1.7 : 1.4;\r\n var tolerance = Math.pow(Math.max(ratio.width, ratio.height), toleranceExp);\r\n\r\n points = MapUtils.simplifyPoints(localPoints, tolerance);\r\n pointSetupComplete();\r\n };\r\n\r\n function onPolylineChanged() {\r\n calculateArea();\r\n }\r\n\r\n function addLatLng(event) {\r\n poly.getPath().push(event.latLng);\r\n\r\n google.maps.event.addListener(poly, \"dragend\", onPolylineChanged);\r\n google.maps.event.addListener(poly.getPath(), 'insert_at', onPolylineChanged);\r\n google.maps.event.addListener(poly.getPath(), 'remove_at', onPolylineChanged);\r\n google.maps.event.addListener(poly.getPath(), 'set_at', onPolylineChanged);\r\n\r\n calculateArea();\r\n }\r\n\r\n function calculatePolygonArea() {\r\n return google.maps.geometry.spherical.computeArea(poly.getPath());\r\n }\r\n\r\n function pointSetupComplete() {\r\n var area = calculatePolygonArea();\r\n area = Math.round(area);\r\n\r\n if (area != 0) {\r\n console.log(area, 'area');\r\n $('#calculatedArea').text(AutoNumeric.toPositiveIntNumberString(area) + \" m²\");\r\n onPointingComplete(area);\r\n }\r\n }\r\n\r\n function clearMarkers() {\r\n for (var i = 0; i < markers.length; i++) {\r\n markers[i].setMap(null);\r\n }\r\n markers.length = 0;\r\n }\r\n\r\n function clearEditPolygon() {\r\n if (areaEditPolygon !== null) {\r\n areaEditPolygon.setMap(null);\r\n }\r\n }\r\n\r\n function initModalMap() {\r\n selectedArea = 0;\r\n\r\n mapManager = new MapManager('map-modal', true,\r\n function (opts) {\r\n opts.disableDefaultUI = true;\r\n opts.mapTypeId = 'hybrid';\r\n opts.clickableIcons = false;\r\n opts.gestureHandling = 'greedy';\r\n opts.tilt = 0;\r\n });\r\n\r\n mapManager.addOnReadyListener(function () {\r\n setModalMapFromCoordinates({ lat: selectedLat, lng: selectedLng }, selectedZoom);\r\n\r\n self.startPoiting();\r\n });\r\n mapManager.initialize();\r\n }\r\n\r\n function setModalMapFromCoordinates(pos, zoom) {\r\n var map = mapManager.getGoogleMap();\r\n\r\n map.setCenter(pos);\r\n map.setZoom(zoom);\r\n\r\n //if (marker === '') {\r\n marker = new google.maps.Marker({\r\n position: pos,\r\n map: map,\r\n draggable: false,\r\n icon: {\r\n url: '/Media/GetEstateMarkerIcon',\r\n anchor: new google.maps.Point(25, 68)\r\n }\r\n });\r\n //} else {\r\n // marker.setPosition(pos);\r\n //}\r\n }\r\n\r\n function onPointingComplete(area) {\r\n selectedArea = area;\r\n\r\n clearEditPolygon();\r\n\r\n var opts = MapUtils.getAreaPolygonBaseOptions();\r\n opts.map = mapManager.getGoogleMap();\r\n opts.paths = MapUtils.createFlatMultiPolygonPathsFromPoints(points);\r\n areaEditPolygon = new google.maps.Polygon(opts);\r\n //$('#areaEditModal #map-modal').removeClass(\"polygon-drawing\");\r\n }\r\n\r\n self.cleanEvents = function () {\r\n $(\"#areaEditModal\").off(\"click\", onSubmit);\r\n $(\"#areaEditModal\").off(\"click\", onClean);\r\n marker = '';\r\n },\r\n\r\n self.cleanPoints = function () {\r\n map = mapManager.getGoogleMap();\r\n clearMarkers();\r\n clearEditPolygon();\r\n\r\n poly.setMap(null);\r\n selectedArea = null;\r\n\r\n poly = new google.maps.Polyline({\r\n strokeColor: '#1f58a6',\r\n editable: true,\r\n draggable: true,\r\n strokeOpacity: 1.0,\r\n strokeWeight: 3,\r\n zIndex: 10000\r\n });\r\n poly.setMap(map);\r\n $('#calculatedArea').text(\"- m²\");\r\n },\r\n\r\n self.startPoiting = function () {\r\n map = mapManager.getGoogleMap();\r\n poly = new google.maps.Polyline({\r\n strokeColor: '#1f58a6',\r\n editable: true,\r\n draggable: true,\r\n strokeOpacity: 1.0,\r\n strokeWeight: 3,\r\n zIndex: 10000\r\n });\r\n poly.setMap(map);\r\n\r\n map.addListener('click', addLatLng);\r\n $('#areaEditModal #map-modal').addClass(\"polygon-drawing\");\r\n },\r\n\r\n self.initializeAreaEditor = function (field, lat, lng, zoom) {\r\n selectedField = field;\r\n selectedLat = lat;\r\n selectedLng = lng;\r\n selectedZoom = zoom;\r\n\r\n initModalMap();\r\n $(\"#areaEditModal\").on('click', '[data-submit-btn]', onSubmit);\r\n //$(\"#areaEditModal\").on('click', '[data-cancel-btn]', onClean);\r\n }\r\n};","var MapCogScoreBoxExtension = {\r\n load: function () {\r\n MapCogScoreBox.prototype = new google.maps.OverlayView;\r\n\r\n function MapCogScoreBox(model) {\r\n\r\n this.data_ = model;\r\n this.div_ = null;\r\n this.map_ = model.map;\r\n this.visibleOnAdd = model.visibleOnAdd;\r\n this.cssClass = model.cssClass || 'map-cog-score-box';\r\n\r\n this.setMap(model.map);\r\n }\r\n\r\n window['MapCogScoreBox'] = MapCogScoreBox;\r\n\r\n MapCogScoreBox.prototype.onAdd = function () {\r\n var $div = $(document.createElement('div'));\r\n\r\n $div.addClass(this.cssClass);\r\n\r\n var html = [\r\n '
    ',\r\n '',\r\n this.data_.timeScore,\r\n '
    ',\r\n '
    ',\r\n '',\r\n this.data_.distanceScore,\r\n '
    '].join('');\r\n if (this.data_.tollScore) {\r\n html += ['
    ',\r\n '',\r\n this.data_.tollScore,\r\n '
    '].join('');\r\n }\r\n\r\n $div.html(html);\r\n\r\n if (!this.visibleOnAdd) {\r\n $div.css(\"visibility\", \"hidden\");\r\n }\r\n\r\n this.div_ = $div[0];\r\n\r\n var panes = this.getPanes();\r\n panes.overlayLayer.appendChild(this.div_);\r\n };\r\n MapCogScoreBox.prototype['onAdd'] = MapCogScoreBox.prototype.onAdd;\r\n\r\n MapCogScoreBox.prototype.draw = function () {\r\n var overlayProjection = this.getProjection();\r\n var xy = overlayProjection.fromLatLngToDivPixel(this.data_.position);\r\n var div = this.div_;\r\n\r\n div.style.left = xy.x + 'px';\r\n div.style.top = xy.y + 'px';\r\n\r\n //div.style['visibility'] = this.getVisible_();\r\n };\r\n MapCogScoreBox.prototype['draw'] = MapCogScoreBox.prototype.draw;\r\n\r\n MapCogScoreBox.prototype.getVisible_ = function () {\r\n var minZoom = (this.data_.minZoom);\r\n var maxZoom = (this.data_.maxZoom);\r\n\r\n if (minZoom === undefined && maxZoom === undefined) {\r\n return '';\r\n }\r\n\r\n var map = this.getMap();\r\n if (!map) {\r\n return '';\r\n }\r\n\r\n var mapZoom = map.getZoom();\r\n if (mapZoom < minZoom || mapZoom > maxZoom) {\r\n return 'hidden';\r\n }\r\n return '';\r\n };\r\n\r\n\r\n MapCogScoreBox.prototype.onRemove = function () {\r\n this.div_.parentNode.removeChild(this.div_);\r\n this.div_ = null;\r\n };\r\n MapCogScoreBox.prototype['onRemove'] = MapCogScoreBox.prototype.onRemove;\r\n\r\n MapCogScoreBox.prototype.setVisible = function (isVisible) {\r\n var div = this.div_;\r\n if (div) {\r\n div.style['visibility'] = isVisible ? \"visible\" : \"hidden\";\r\n }\r\n };\r\n MapCogScoreBox.prototype['setVisible'] = MapCogScoreBox.prototype.setVisible;\r\n }\r\n};","var MapHandDrawer = function (mapManager, onHandDrawComplete, onHandDrawAbort) {\r\n var self = this;\r\n\r\n var isActive = false;\r\n var drawingMouseDownEvent = null;\r\n var drawingMouseMoveEvent = null;\r\n var drawingMouseUpEvent = null;\r\n var drawingTouchStartEvent = null;\r\n var mapPolygon = null;\r\n\r\n function handDrawingMouseDown() {\r\n clearHandDrawingPolygon();\r\n\r\n mapPolygon = new google.maps.Polyline({\r\n map: mapManager.getGoogleMap(),\r\n clickable: false,\r\n strokeColor: '#1f58a6',\r\n zIndex: 10000\r\n });\r\n\r\n drawingMouseMoveEvent = google.maps.event.addListener(mapManager.getGoogleMap(), 'mousemove', handDrawingMouseMove);\r\n drawingMouseUpEvent = google.maps.event.addListenerOnce(mapManager.getGoogleMap(), 'mouseup', handDrawingMouseUp);\r\n }\r\n\r\n function handDrawingMouseMove(e) {\r\n mapPolygon.getPath().push(e.latLng);\r\n }\r\n\r\n function handDrawingMouseUp() {\r\n toggleMapHandDrawState(false);\r\n\r\n var polygonPath = mapPolygon.getPath();\r\n var points = [];\r\n\r\n for (var i = 0; i < polygonPath.getLength(); i++) {\r\n var point = polygonPath.getAt(i);\r\n\r\n points.push([\r\n point.lat(),\r\n point.lng()\r\n ]);\r\n }\r\n\r\n var ratio = mapManager.getCurrentPixelRatio();\r\n var toleranceExp = points.length <= 200 ? 1.7 : 1.4;\r\n var tolerance = Math.pow(Math.max(ratio.width, ratio.height), toleranceExp);\r\n\r\n points = MapUtils.simplifyPoints(points, tolerance);\r\n\r\n if (points.length < 3) {\r\n alert('Bitte zeichnen Sie ein Gebiet ein, welches nicht aus einem einzelnen Punkt oder einer geraden Linie besteht.');\r\n self.abortDrawing();\r\n return;\r\n }\r\n\r\n if (MapUtils.checkPolygonIsSelfIntersecting(points)) {\r\n alert('Bitte zeichnen Sie ein Gebiet ein, welches sich nicht \\u00FCberschneidet.');\r\n self.abortDrawing();\r\n return;\r\n }\r\n\r\n onHandDrawComplete(points);\r\n }\r\n\r\n function preventTouchmove(e) {\r\n e.preventDefault();\r\n }\r\n\r\n function toggleMapHandDrawState(state) {\r\n var mapDiv = mapManager.getGoogleMap().getDiv();\r\n\r\n if (state) {\r\n mapManager.disable();\r\n drawingTouchStartEvent = google.maps.event.addDomListener(mapDiv, 'touchstart', handDrawingMouseDown);\r\n drawingMouseDownEvent = google.maps.event.addDomListener(mapDiv, 'mousedown', handDrawingMouseDown);\r\n\r\n $(mapDiv).addClass('hand-draw');\r\n\r\n document.addEventListener('touchmove', preventTouchmove, {\r\n passive: false\r\n });\r\n }\r\n else {\r\n mapManager.enable();\r\n\r\n google.maps.event.removeListener(drawingMouseDownEvent);\r\n google.maps.event.removeListener(drawingMouseMoveEvent);\r\n google.maps.event.removeListener(drawingTouchStartEvent);\r\n clearHandDrawingPolygon();\r\n\r\n $(mapDiv).removeClass('hand-draw');\r\n document.removeEventListener('touchmove', preventTouchmove);\r\n }\r\n }\r\n\r\n function clearHandDrawingPolygon() {\r\n if (mapPolygon !== null) {\r\n mapPolygon.setMap(null);\r\n }\r\n }\r\n\r\n self.startDrawing = function () {\r\n toggleMapHandDrawState(true);\r\n isActive = true;\r\n };\r\n\r\n self.abortDrawing = function () {\r\n toggleMapHandDrawState(false);\r\n isActive = false;\r\n if (typeof (onHandDrawAbort) === 'function') {\r\n onHandDrawAbort();\r\n }\r\n };\r\n\r\n self.isActive = function () {\r\n return isActive;\r\n };\r\n};","/**\r\n * @license\r\n *\r\n * Copyright 2011 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Map Label.\r\n *\r\n * @author Luke Mahe (lukem@google.com),\r\n * Chris Broadfoot (cbro@google.com)\r\n */\r\n\r\n/**\r\n * Creates a new Map Label\r\n * @constructor\r\n * @extends google.maps.OverlayView\r\n * @param {Object.=} opt_options Optional properties to set.\r\n */\r\n\r\nvar MapLabelExtension = {\r\n load: function () {\r\n var CANVAS_WIDTH = 300;\r\n var CANVAS_HEIGHT = 300;\r\n\r\n function MapLabel(opt_options) {\r\n this.set('fontFamily', 'sans-serif');\r\n this.set('fontSize', 12);\r\n this.set('fontColor', '#000000');\r\n this.set('strokeWeight', 4);\r\n this.set('strokeColor', '#ffffff');\r\n this.set('zIndex', 1e3);\r\n\r\n this.setValues(opt_options);\r\n }\r\n MapLabel.prototype = new google.maps.OverlayView;\r\n\r\n window['MapLabel'] = MapLabel;\r\n\r\n\r\n /** @inheritDoc */\r\n MapLabel.prototype.changed = function (prop) {\r\n switch (prop) {\r\n case 'fontFamily':\r\n case 'fontSize':\r\n case 'fontColor':\r\n case 'strokeWeight':\r\n case 'strokeColor':\r\n case 'text':\r\n return this.drawCanvas_();\r\n case 'maxZoom':\r\n case 'minZoom':\r\n case 'position':\r\n return this.draw();\r\n }\r\n };\r\n\r\n /**\r\n * Draws the label to the canvas 2d context.\r\n * @private\r\n */\r\n MapLabel.prototype.drawCanvas_ = function () {\r\n var canvas = this.canvas_;\r\n if (!canvas) return;\r\n\r\n var style = canvas.style;\r\n style.zIndex = /** @type number */(this.get('zIndex'));\r\n\r\n var ctx = canvas.getContext('2d');\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n ctx.strokeStyle = this.get('strokeColor');\r\n ctx.fillStyle = this.get('fontColor');\r\n ctx.font = this.get('fontSize') + 'px ' + this.get('fontFamily');\r\n\r\n var strokeWeight = Number(this.get('strokeWeight'));\r\n var text = this.get('text');\r\n\r\n if (text) {\r\n text = text.trim();\r\n\r\n if (strokeWeight) {\r\n ctx.lineWidth = strokeWeight;\r\n }\r\n\r\n var fontSize = this.get('fontSize') + strokeWeight;\r\n var lineHeight = fontSize * 1.7;\r\n var lineIdx = 0;\r\n var textWidth = 0;\r\n var textHeight = 0;\r\n var nextLineText = text;\r\n\r\n while (nextLineText.length > 0) {\r\n var xPos;\r\n var yPos = lineHeight * lineIdx++;\r\n var nextLineText = '';\r\n\r\n while (true) {\r\n var textMeasure = ctx.measureText(text);\r\n textWidth = textMeasure.width + (strokeWeight * 2);\r\n\r\n if (textWidth > CANVAS_WIDTH) {\r\n var lastSpaceIdx = text.lastIndexOf(' ');\r\n\r\n nextLineText = text.substring(lastSpaceIdx, text.length) + nextLineText;\r\n text = text.substring(0, lastSpaceIdx);\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n\r\n textHeight += (lineIdx === 1) ? fontSize : lineHeight;\r\n\r\n xPos = (CANVAS_WIDTH - textWidth) / 2;\r\n yPos = (CANVAS_HEIGHT + textHeight) / 2;\r\n\r\n if (strokeWeight) {\r\n ctx.strokeText(text, xPos, yPos);\r\n }\r\n\r\n ctx.fillText(text, xPos, yPos);\r\n\r\n text = nextLineText.trim();\r\n }\r\n\r\n style.marginTop = -(textHeight / 2) + 'px';\r\n }\r\n };\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n MapLabel.prototype.onAdd = function () {\r\n var canvas = this.canvas_ = document.createElement('canvas');\r\n canvas.width = CANVAS_WIDTH;\r\n canvas.height = CANVAS_HEIGHT;\r\n\r\n var style = canvas.style;\r\n style.position = 'absolute';\r\n\r\n var ctx = canvas.getContext('2d');\r\n ctx.lineJoin = 'round';\r\n ctx.textBaseline = 'top';\r\n\r\n this.drawCanvas_();\r\n\r\n var panes = this.getPanes();\r\n if (panes) {\r\n panes.mapPane.appendChild(canvas);\r\n }\r\n\r\n if (canvas.parentNode != null) {\r\n canvas.parentNode.style.zIndex = style.zIndex;\r\n }\r\n };\r\n MapLabel.prototype['onAdd'] = MapLabel.prototype.onAdd;\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n MapLabel.prototype.draw = function () {\r\n var projection = this.getProjection();\r\n\r\n if (!projection) {\r\n // The map projection is not ready yet so do nothing\r\n return;\r\n }\r\n\r\n if (!this.canvas_) {\r\n // onAdd has not been called yet.\r\n return;\r\n }\r\n\r\n var latLng = /** @type {google.maps.LatLng} */ (this.get('position'));\r\n if (!latLng) {\r\n return;\r\n }\r\n var pos = projection.fromLatLngToDivPixel(latLng);\r\n\r\n var style = this.canvas_.style;\r\n\r\n style['top'] = (pos.y - (CANVAS_HEIGHT / 2)) + 'px';\r\n style['left'] = (pos.x - (CANVAS_WIDTH / 2)) + 'px';\r\n\r\n style['visibility'] = this.getVisible_();\r\n };\r\n MapLabel.prototype['draw'] = MapLabel.prototype.draw;\r\n\r\n /**\r\n * Get the visibility of the label.\r\n * @private\r\n * @return {string} blank string if visible, 'hidden' if invisible.\r\n */\r\n MapLabel.prototype.getVisible_ = function () {\r\n var minZoom = /** @type number */(this.get('minZoom'));\r\n var maxZoom = /** @type number */(this.get('maxZoom'));\r\n\r\n if (minZoom === undefined && maxZoom === undefined) {\r\n return '';\r\n }\r\n\r\n var map = this.getMap();\r\n if (!map) {\r\n return '';\r\n }\r\n\r\n var mapZoom = map.getZoom();\r\n if (mapZoom < minZoom || mapZoom > maxZoom) {\r\n return 'hidden';\r\n }\r\n return '';\r\n };\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n MapLabel.prototype.onRemove = function () {\r\n var canvas = this.canvas_;\r\n if (canvas && canvas.parentNode) {\r\n canvas.parentNode.removeChild(canvas);\r\n }\r\n };\r\n MapLabel.prototype['onRemove'] = MapLabel.prototype.onRemove;\r\n }\r\n}","var MapManager_GoogleReadyCallback = null;\r\n\r\nvar MapManager_Initialized = false;\r\nvar MapManager_Initializing = false;\r\n\r\nvar MapManager = function (mapContainerId, disDefUI, mapOptionsFn) {\r\n 'use strict';\r\n\r\n var DEFAULT_LAT_LNG = { lat: 51.1, lng: 9.5 };\r\n var DEFAULT_ZOOM = 6;\r\n var MIN_MAP_ZOOM = 5;\r\n var DISABLE_DEFAULT_UI = (typeof disDefUI !== 'undefined') ? disDefUI : false;\r\n\r\n var MARKER_TYPE = {\r\n estateCluster: 0,\r\n aggregatedEstate: 1,\r\n estate: 2,\r\n poiCluster: 3,\r\n aggregatedPoi: 4,\r\n poi: 5,\r\n tenderObject: 6,\r\n tenderObjectCluster: 7,\r\n };\r\n\r\n var OBJECT_SHAPE_TYPE = {\r\n marker: 0,\r\n polygon: 1,\r\n heatmap: 2\r\n };\r\n\r\n var ESTATE_TYPE = {\r\n hall: 0,\r\n landPlot: 1,\r\n };\r\n\r\n var self = this;\r\n var map = null;\r\n var $mapLegend = null;\r\n var mapOverlay = null;\r\n var currentActiveMarker = null;\r\n var currentSelectedObject = null;\r\n var onReadyListeners = [];\r\n var markerClickEventListeners = [];\r\n var mapObjects = [];\r\n var isReady = false;\r\n var viewportBoundingBoxPadding = 50;\r\n\r\n self.MARKER_TYPE = MARKER_TYPE;\r\n self.ESTATE_TYPE = ESTATE_TYPE;\r\n\r\n self.initialize = function () {\r\n if (MapManager_Initialized) {\r\n self.googleMapReadyCallback();\r\n }\r\n else {\r\n MapManager_GoogleReadyCallback = self.googleMapReadyCallback;\r\n if (!MapManager_Initializing) {\r\n MapManager_Initializing = true;\r\n $.getScript('https://maps.googleapis.com/maps/api/js?key=AIzaSyAFyrz_Yo2R9OTjJiSbmUNwzXv99hrsXHs&libraries=visualization,geometry&language=de&callback=MapManager_GoogleReadyCallback');\r\n\r\n }\r\n }\r\n };\r\n\r\n self.addOnReadyListener = function (fn) {\r\n onReadyListeners.push(fn);\r\n };\r\n\r\n self.googleMapReadyCallback = function () {\r\n MapLabelExtension.load();\r\n MapValueRangeBoxExtension.load();\r\n MapTooltipExtension.load();\r\n MapCogScoreBoxExtension.load();\r\n MapShadowCircleExtension.load();\r\n\r\n var opts = {\r\n zoom: DEFAULT_ZOOM,\r\n center: DEFAULT_LAT_LNG,\r\n disableDefaultUI: DISABLE_DEFAULT_UI\r\n };\r\n\r\n if (typeof mapOptionsFn !== 'undefined') {\r\n mapOptionsFn(opts);\r\n }\r\n\r\n map = new google.maps.Map(document.getElementById(mapContainerId), opts);\r\n $mapLegend = $('#mapLegend');\r\n if ($mapLegend && $mapLegend.length) {\r\n map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push($mapLegend[0]);\r\n }\r\n\r\n mapOverlay = new google.maps.OverlayView();\r\n mapOverlay.setMap(map);\r\n\r\n MapManager_Initialized = true;\r\n MapManager_Initializing = false;\r\n isReady = true;\r\n\r\n onReadyListeners.forEach(function (fn) {\r\n fn();\r\n });\r\n };\r\n\r\n self.getGoogleMap = function () {\r\n return map;\r\n };\r\n\r\n self.disable = function () {\r\n map.setOptions({\r\n //disableDefaultUI: true,\r\n draggable: false,\r\n scrollwheel: false,\r\n disableDoubleClickZoom: true,\r\n gestureHandling: 'none'\r\n });\r\n\r\n for (var i = 0; i < mapObjects.length; i++) {\r\n mapObjects[i].setInteractive(false);\r\n }\r\n\r\n //document.addEventListener('touchmove', preventTouchmove, {\r\n // passive: false\r\n //});\r\n };\r\n\r\n self.enable = function () {\r\n map.setOptions({\r\n //disableDefaultUI: false,\r\n draggable: true,\r\n scrollwheel: true,\r\n disableDoubleClickZoom: false,\r\n gestureHandling: 'cooperative'\r\n });\r\n\r\n for (var i = 0; i < mapObjects.length; i++) {\r\n mapObjects[i].setInteractive(true);\r\n }\r\n\r\n //document.removeEventListener('touchmove', preventTouchmove);\r\n };\r\n\r\n self.getMapObjects = function () {\r\n return mapObjects;\r\n };\r\n\r\n self.getCurrentActiveMarker = function () {\r\n return currentActiveMarker;\r\n };\r\n\r\n self.activateMarker = function (marker) {\r\n self.deactivateMarker();\r\n\r\n marker.setOptions({ 'opacity': 0.80 });\r\n currentActiveMarker = marker;\r\n };\r\n\r\n self.deactivateMarker = function () {\r\n if (currentActiveMarker === null)\r\n return;\r\n\r\n currentActiveMarker.setOptions({ 'opacity': 1 });\r\n currentActiveMarker = null;\r\n };\r\n\r\n self.selectObject = function (object) {\r\n self.unselectObject();\r\n\r\n object.select();\r\n currentSelectedObject = object;\r\n }\r\n\r\n self.unselectObject = function () {\r\n if (currentSelectedObject === null)\r\n return;\r\n\r\n currentSelectedObject.unselect();\r\n currentSelectedObject = null;\r\n }\r\n\r\n self.addMarkerClickEventListener = function (func) {\r\n markerClickEventListeners.push(func);\r\n };\r\n\r\n self.removeMarkerClickEventListener = function (func) {\r\n var index = markerClickEventListeners.indexOf(func);\r\n if (index >= 0) {\r\n markerClickEventListeners.splice(index, 1);\r\n }\r\n };\r\n\r\n self.addObjects = function (objects) {\r\n var newObjects = [];\r\n var existingUids = [];\r\n\r\n for (var i = 0; i < objects.length; i++) {\r\n var objModel = objects[i];\r\n\r\n var existingObjects = findObjectsByUid(objModel.UID);\r\n if (existingObjects.length > 0) {\r\n for (var y = 0; y < existingObjects.length; y++) {\r\n newObjects.push(existingObjects[y]);\r\n existingUids.push(objModel.UID);\r\n }\r\n\r\n continue;\r\n }\r\n\r\n var object;\r\n\r\n switch (objModel.ShapeType) {\r\n case OBJECT_SHAPE_TYPE.marker:\r\n object = new MarkerObject(objModel);\r\n break;\r\n\r\n case OBJECT_SHAPE_TYPE.polygon:\r\n object = new PolygonObject(objModel);\r\n break;\r\n\r\n case OBJECT_SHAPE_TYPE.heatmap:\r\n object = new HeatmapObject(objModel);\r\n break;\r\n\r\n default:\r\n throw 'Unsupported object shape type: ' + objModel.ShapeType;\r\n }\r\n\r\n newObjects.push(object);\r\n }\r\n\r\n for (var i = 0; i < mapObjects.length; i++) {\r\n if (existingUids.indexOf(mapObjects[i].getData().UID) === -1) {\r\n mapObjects[i].destroy();\r\n mapObjects.splice(i--, 1);\r\n }\r\n }\r\n\r\n mapObjects = newObjects;\r\n };\r\n\r\n self.clearObjects = function () {\r\n for (var i = 0; i < mapObjects.length; i++) {\r\n mapObjects[i].destroy();\r\n }\r\n\r\n mapObjects = [];\r\n };\r\n\r\n self.resetMap = function () {\r\n map.setCenter(DEFAULT_LAT_LNG);\r\n map.setZoom(DEFAULT_ZOOM);\r\n self.clearObjects();\r\n };\r\n\r\n self.getCurrentBoundingBox = function (padding) {\r\n if (!map)\r\n return null;\r\n\r\n var bounds = map.getBounds();\r\n if (!bounds)\r\n return null;\r\n\r\n var northEast = bounds.getNorthEast();\r\n var neLat = northEast.lat();\r\n var neLng = northEast.lng();\r\n\r\n var southWest = bounds.getSouthWest();\r\n var swLat = southWest.lat();\r\n var swLng = southWest.lng();\r\n\r\n if (padding !== undefined) {\r\n var latDiff = Math.abs(neLat - swLat);\r\n var lngDiff = Math.abs(neLng - swLng);\r\n\r\n var latPadding = (latDiff * padding) - latDiff;\r\n var lngPadding = (lngDiff * padding) - lngDiff;\r\n\r\n neLat = Math.min(neLat + latPadding, 90);\r\n neLng = Math.min(neLng + lngPadding, 180);\r\n swLat = Math.max(swLat - latPadding, -90);\r\n swLng = Math.max(swLng - lngPadding, -180);\r\n }\r\n\r\n return {\r\n NorthEast: {\r\n Lat: neLat.toString().replace('.', ','),\r\n Lng: neLng.toString().replace('.', ',')\r\n },\r\n SouthWest: {\r\n Lat: swLat.toString().replace('.', ','),\r\n Lng: swLng.toString().replace('.', ',')\r\n }\r\n };\r\n };\r\n\r\n self.getCurrentPixelRatio = function () {\r\n var projection = mapOverlay.getProjection();\r\n var height = projection.fromDivPixelToLatLng({ x: 1, y: 1 }).lat() - projection.fromDivPixelToLatLng({ x: 0, y: 0 }).lat();\r\n var width = projection.fromDivPixelToLatLng({ x: 1, y: 1 }).lng() - projection.fromDivPixelToLatLng({ x: 0, y: 0 }).lng();\r\n\r\n return {\r\n width: Math.abs(width),\r\n height: Math.abs(height)\r\n };\r\n };\r\n\r\n self.adjustViewportToBoundingBox = function (box) {\r\n if (box === null) {\r\n map.setCenter(DEFAULT_LAT_LNG);\r\n map.setZoom(DEFAULT_ZOOM);\r\n return;\r\n }\r\n\r\n var sw = box.SouthWest;\r\n var ne = box.NorthEast;\r\n\r\n var bounds = new google.maps.LatLngBounds(\r\n new google.maps.LatLng(sw.Lat, sw.Lng),\r\n new google.maps.LatLng(ne.Lat, ne.Lng)\r\n );\r\n\r\n var padding = {\r\n left: viewportBoundingBoxPadding,\r\n top: viewportBoundingBoxPadding,\r\n right: viewportBoundingBoxPadding,\r\n bottom: viewportBoundingBoxPadding\r\n };\r\n\r\n map.fitBounds(bounds, padding);\r\n\r\n if (map.getZoom() > 17) {\r\n map.setZoom(17);\r\n }\r\n };\r\n\r\n self.isReady = function () {\r\n return isReady;\r\n };\r\n\r\n self.setViewportBoundingBoxPadding = function (padding) {\r\n viewportBoundingBoxPadding = padding;\r\n };\r\n\r\n self.activateMarkerByEstateId = function (id) {\r\n var obj = findObjectByEstateId(id);\r\n if (obj) {\r\n var marker = obj.getMarker();\r\n if (marker) {\r\n self.activateMarker(marker);\r\n }\r\n }\r\n };\r\n\r\n self.selectObjectByEstateId = function (id) {\r\n var obj = findObjectByEstateId(id);\r\n if (obj) {\r\n self.selectObject(obj);\r\n }\r\n };\r\n\r\n self.showMapLegend = function (legend) {\r\n if ($mapLegend && $mapLegend.length) {\r\n $mapLegend.html(legend);\r\n $mapLegend.show();\r\n }\r\n };\r\n\r\n self.hideMapLegend = function () {\r\n if ($mapLegend && $mapLegend.length) {\r\n $mapLegend.hide();\r\n }\r\n }\r\n\r\n self.zoomIn = function () {\r\n map.setZoom(map.zoom + 1);\r\n };\r\n\r\n self.zoomOut = function () {\r\n if (map.getZoom() > MIN_MAP_ZOOM) {\r\n map.setZoom(map.zoom - 1);\r\n }\r\n };\r\n\r\n self.getMapType = function () {\r\n if (map === null) {\r\n return null;\r\n }\r\n\r\n return map.mapTypeId;\r\n };\r\n\r\n self.switchToRoadmapView = function () {\r\n setMapType(google.maps.MapTypeId.ROADMAP);\r\n };\r\n\r\n self.switchToSatelliteView = function () {\r\n setMapType(google.maps.MapTypeId.HYBRID);\r\n };\r\n\r\n self.setCenter = function (lat, lng) {\r\n map.setCenter({ lat: lat, lng: lng });\r\n }\r\n\r\n self.setStyle = function (type) {\r\n map.setOptions({ styles: MAP_STYLES[type] });\r\n }\r\n\r\n function setMapType(mapTypeId) {\r\n if (map !== null) {\r\n map.setMapTypeId(mapTypeId);\r\n }\r\n }\r\n\r\n function findObjectsByUid(uid) {\r\n var objects = [];\r\n\r\n for (var i = 0; i < mapObjects.length; i++) {\r\n if (mapObjects[i].getData().UID === uid) {\r\n objects.push(mapObjects[i]);\r\n }\r\n }\r\n\r\n return objects;\r\n }\r\n\r\n function findObjectByEstateId(estateId) {\r\n for (var i = 0; i < mapObjects.length; i++) {\r\n var data = mapObjects[i].getData();\r\n if (data.EstateId !== undefined) {\r\n if (data.EstateId === estateId) {\r\n return mapObjects[i];\r\n }\r\n\r\n } else if (data.Ids !== undefined) {\r\n if (data.Ids.includes(estateId)) {\r\n return mapObjects[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n function PolygonObject(model) {\r\n var hlOpacity = Math.min(model.Opacity * 1.3, 1);\r\n\r\n var self = this;\r\n\r\n self.data = model;\r\n self.eventListeners = [];\r\n self.label = null;\r\n self.valueRangeBox = null;\r\n self.interactive = true;\r\n\r\n var polygonPath = MapUtils.createMultiPolygonPathsFromPoints(model.PolygonRings);\r\n\r\n self.polygon = new google.maps.Polygon({\r\n map: map,\r\n paths: polygonPath,\r\n strokeColor: model.Color,\r\n strokeOpacity: 1,\r\n strokeWeight: model.StrokeWeight,\r\n fillColor: model.Color,\r\n fillOpacity: model.Opacity,\r\n clickable: true,\r\n zIndex: model.Index\r\n });\r\n\r\n if (model.ValueFrom && model.ValueTo && model.LabelZoomLevel > 0) {\r\n self.valueRangeBox = new MapValueRangeBox({\r\n map: map,\r\n valueFrom: model.ValueFrom,\r\n valueTo: model.ValueTo,\r\n position: new google.maps.LatLng(model.CentroidPoint.Lat, model.CentroidPoint.Lng),\r\n minZoom: model.LabelZoomLevel\r\n });\r\n }\r\n\r\n if (model.Name && model.LabelZoomLevel > 0) {\r\n self.label = new MapLabel({\r\n map: map,\r\n text: model.Name,\r\n position: new google.maps.LatLng(model.CentroidPoint.Lat, model.CentroidPoint.Lng),\r\n fontSize: 15,\r\n fontColor: model.LabelColor,\r\n strokeColor: '#f5f5f5',\r\n strokeWeight: 3,\r\n minZoom: model.LabelZoomLevel,\r\n align: 'center',\r\n zIndex: 103\r\n });\r\n }\r\n\r\n registerEvents();\r\n\r\n function onPolygonMouseOver() {\r\n self.polygon.setOptions({ fillOpacity: model.hlOpacity, strokeWeight: 2 });\r\n\r\n if (self.label !== null) {\r\n self.label.set('strokeColor', '#ffffff');\r\n }\r\n }\r\n\r\n function onPolygonMouseOut() {\r\n self.polygon.setOptions({ fillOpacity: model.Opacity, strokeWeight: 1 });\r\n\r\n if (self.label !== null) {\r\n self.label.set('strokeColor', '#f5f5f5');\r\n }\r\n }\r\n\r\n function onPolygonClick() {\r\n var bounds = new google.maps.LatLngBounds();\r\n\r\n for (var i = 0; i < polygonPath.length; i++) {\r\n for (var j = 0; j < polygonPath[i].length; j++) {\r\n bounds.extend(polygonPath[i][j]);\r\n }\r\n }\r\n\r\n map.fitBounds(bounds);\r\n }\r\n\r\n function registerEvents() {\r\n google.maps.event.addListener(self.polygon, 'mouseover', onPolygonMouseOver);\r\n google.maps.event.addListener(self.polygon, 'mouseout', onPolygonMouseOut);\r\n google.maps.event.addListener(self.polygon, 'click', onPolygonClick);\r\n }\r\n\r\n function unregisterEvents() {\r\n google.maps.event.clearListeners(self.polygon, 'mouseover');\r\n google.maps.event.clearListeners(self.polygon, 'mouseout');\r\n google.maps.event.clearListeners(self.polygon, 'click');\r\n }\r\n\r\n return {\r\n getData: function () { return self.data; },\r\n getMarker: function () { return null; },\r\n select: function () { },\r\n unselect: function () { },\r\n setInteractive: function (interactive) {\r\n if (interactive !== self.interactive) {\r\n self.interactive = interactive;\r\n\r\n if (interactive) {\r\n registerEvents();\r\n self.polygon.setOptions({ clickable: true });\r\n }\r\n else {\r\n unregisterEvents();\r\n self.polygon.setOptions({ clickable: false });\r\n }\r\n }\r\n },\r\n destroy: function () {\r\n unregisterEvents();\r\n self.polygon.setMap(null);\r\n\r\n if (self.label !== null) {\r\n self.label.setMap(null);\r\n }\r\n\r\n if (self.valueRangeBox !== null) {\r\n self.valueRangeBox.setMap(null);\r\n }\r\n }\r\n };\r\n }\r\n\r\n function MarkerObject(model) {\r\n var self = this;\r\n\r\n self.data = model;\r\n\r\n self.selected = false;\r\n\r\n self.marker = new google.maps.Marker({\r\n map: map,\r\n position: { lat: model.Lat, lng: model.Lng },\r\n icon: getIcon(model),\r\n _data: model,\r\n zIndex: 100,\r\n });\r\n\r\n self.marker.addListener('click', function () {\r\n map.setCenter(self.marker.getPosition());\r\n\r\n for (var i = 0; i < markerClickEventListeners.length; i++) {\r\n markerClickEventListeners[i](self.marker, self.data);\r\n }\r\n });\r\n\r\n function getIcon() {\r\n switch (model.Type) {\r\n case MARKER_TYPE.estate:\r\n return {\r\n url: getEstateIconUrl(model),\r\n anchor: new google.maps.Point(25, 68)\r\n };\r\n\r\n case MARKER_TYPE.aggregatedEstate:\r\n return {\r\n url: getAggregatedEstateIconUrl(model),\r\n anchor: new google.maps.Point(25, 68)\r\n };\r\n\r\n case MARKER_TYPE.estateCluster:\r\n return {\r\n url: getEstateClusterIconUrl(model),\r\n anchor: new google.maps.Point(31, 31)\r\n };\r\n case MARKER_TYPE.poi:\r\n return {\r\n url: getPoiIconUrl(model),\r\n anchor: new google.maps.Point(25, 68)\r\n };\r\n case MARKER_TYPE.aggregatedPoi:\r\n return {\r\n url: getPoiAggregatedIconUrl(model),\r\n anchor: new google.maps.Point(25, 68)\r\n };\r\n case MARKER_TYPE.poiCluster:\r\n return {\r\n url: getPoiClusterIconUrl(model),\r\n anchor: new google.maps.Point(31, 31)\r\n };\r\n\r\n case MARKER_TYPE.tenderObject:\r\n return {\r\n url: getTenderMarkerIconUrl(model),\r\n anchor: new google.maps.Point(25, 68)\r\n };\r\n\r\n case MARKER_TYPE.tenderObjectCluster:\r\n return {\r\n url: getTenderClusterIconUrl(model),\r\n anchor: new google.maps.Point(31, 31)\r\n };\r\n\r\n default:\r\n throw 'Unsupported map marker type: ' + data.Type;\r\n }\r\n }\r\n\r\n function getEstateClusterIconUrl(model) {\r\n var params = [];\r\n params.push('clusterSize=' + model.ClusterSize);\r\n if (model.EstateTypes) {\r\n for (var i = 0; i < model.EstateTypes.length; i++) {\r\n params.push('estateTypes=' + model.EstateTypes[i]);\r\n }\r\n }\r\n\r\n if (self.selected) {\r\n params.push('selected=true');\r\n }\r\n\r\n return AppCoreView.actionUrls.getEstateClusterMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n function getAggregatedEstateIconUrl(model) {\r\n var params = [];\r\n params.push('count=' + model.Count);\r\n\r\n if (model.EstateTypes) {\r\n for (var i = 0; i < model.EstateTypes.length; i++) {\r\n params.push('estateTypes=' + model.EstateTypes[i]);\r\n }\r\n }\r\n\r\n if (self.selected) {\r\n params.push('selected=true');\r\n }\r\n\r\n if (model.Badge) {\r\n params.push('Badge=' + encodeURIComponent(model.Badge));\r\n }\r\n\r\n return AppCoreView.actionUrls.getAggregatedEstateMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n function getEstateIconUrl(model) {\r\n var params = [\r\n 'estateType=' + model.EstateType\r\n ];\r\n\r\n if (self.selected) {\r\n params.push('selected=true');\r\n }\r\n\r\n if (model.Badge) {\r\n params.push('Badge=' + encodeURIComponent(model.Badge));\r\n }\r\n\r\n return AppCoreView.actionUrls.getEstateMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n function getTenderClusterIconUrl(model) {\r\n var params = [];\r\n params.push('clusterSize=' + model.ClusterSize);\r\n\r\n for (var i = 0; i < model.PresentationTypes.length; i++) {\r\n params.push('presentationTypes=' + model.PresentationTypes[i]);\r\n }\r\n\r\n if (self.selected) {\r\n params.push('selected=true');\r\n }\r\n\r\n return AppCoreView.actionUrls.getTenderClusterMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n function getTenderMarkerIconUrl(model) {\r\n var params = [\r\n 'presentationType=' + model.PresentationTypes,\r\n 'estateType=' + model.EstateType\r\n ];\r\n\r\n return AppCoreView.actionUrls.getTenderMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n function getPoiIconUrl(model) {\r\n var params = [\r\n 'typeId=' + model.PoiTypeId\r\n ];\r\n\r\n return AppCoreView.actionUrls.getPoiMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n function getPoiClusterIconUrl(model) {\r\n var params = [];\r\n params.push('clusterSize=' + model.ClusterSize);\r\n\r\n for (var i = 0; i < model.PoiTypesIds.length; i++) {\r\n params.push('typesIds=' + model.PoiTypesIds[i]);\r\n }\r\n\r\n return AppCoreView.actionUrls.getPoiClusterMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n function getPoiAggregatedIconUrl(model) {\r\n var params = [];\r\n params.push('count=' + model.Count);\r\n\r\n for (var i = 0; i < model.PoiTypesIds.length; i++) {\r\n params.push('typesIds=' + model.PoiTypesIds[i]);\r\n }\r\n\r\n return AppCoreView.actionUrls.getPoiAggregatedMarkerIcon + '?' + params.join('&');\r\n }\r\n\r\n return {\r\n getData: function () { return self.data; },\r\n getMarker: function () { return self.marker; },\r\n setInteractive: function (interactive) {\r\n self.marker.setClickable(interactive);\r\n },\r\n select: function () {\r\n self.selected = true;\r\n self.marker.setIcon(getIcon());\r\n },\r\n unselect: function () {\r\n self.selected = false;\r\n self.marker.setIcon(getIcon());\r\n },\r\n destroy: function () {\r\n self.marker.setMap(null);\r\n }\r\n };\r\n }\r\n\r\n function HeatmapObject(model) {\r\n var self = this;\r\n\r\n self.data = model;\r\n\r\n if (model.HeatmapData) {\r\n\r\n self.heatmapData = [];\r\n\r\n $.each(model.HeatmapData, function () {\r\n self.heatmapData.push(new google.maps.LatLng(this.Lat, this.Lng));\r\n });\r\n\r\n var options = {\r\n data: self.heatmapData\r\n };\r\n\r\n if (model.DisplayOptions) {\r\n var extOptions = JSON.parse(model.DisplayOptions);\r\n if (extOptions) {\r\n $.extend(options, extOptions);\r\n }\r\n }\r\n\r\n self.heatmap = new google.maps.visualization.HeatmapLayer(options);\r\n\r\n self.heatmap.setMap(map);\r\n }\r\n\r\n return {\r\n getData: function () {\r\n return self.data;\r\n },\r\n\r\n destroy: function () {\r\n if (self.heatmap) {\r\n self.heatmap.setMap(null);\r\n }\r\n },\r\n\r\n setInteractive: function () {\r\n return null;\r\n }\r\n };\r\n }\r\n\r\n const MAP_STYLES = {\r\n standard: [],\r\n gray: [\r\n {\r\n \"featureType\": \"landscape\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"labels.icon\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"stylers\": [\r\n {\r\n \"hue\": \"#00aaff\"\r\n },\r\n {\r\n \"saturation\": -100\r\n },\r\n {\r\n \"gamma\": 2.15\r\n },\r\n {\r\n \"lightness\": 12\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"on\"\r\n },\r\n {\r\n \"lightness\": 24\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": 57\r\n }\r\n ]\r\n }\r\n ],\r\n dark: [\r\n {\r\n \"featureType\": \"all\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#242f3e\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"all\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#746855\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"all\",\r\n \"elementType\": \"labels.text.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#242f3e\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative.locality\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#d59563\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#d59563\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.attraction\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.business\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.government\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.medical\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#263c3f\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#6b9a76\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"labels.icon\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.place_of_worship\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.school\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.sports_complex\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#38414e\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#212a37\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#9ca5b3\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#746855\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#1f2835\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#f3d19c\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#2f3948\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit.station\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit.station\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#d59563\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#17263c\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#515c6d\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels.text.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#17263c\"\r\n }\r\n ]\r\n }\r\n ],\r\n standardNoLabel: [\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"on\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"0\"\r\n },\r\n {\r\n \"lightness\": \"0\"\r\n },\r\n {\r\n \"gamma\": \"1.00\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"on\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"on\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n },\r\n {\r\n \"weight\": \"1.43\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n }\r\n ],\r\n silver: [\r\n {\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#f5f5f5\" }],\r\n },\r\n {\r\n elementType: \"labels.icon\",\r\n stylers: [{ visibility: \"off\" }],\r\n },\r\n {\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#616161\" }],\r\n },\r\n {\r\n elementType: \"labels.text.stroke\",\r\n stylers: [{ color: \"#f5f5f5\" }],\r\n },\r\n {\r\n featureType: \"administrative.land_parcel\",\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#bdbdbd\" }],\r\n },\r\n {\r\n featureType: \"poi\",\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#eeeeee\" }],\r\n },\r\n {\r\n featureType: \"poi\",\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#757575\" }],\r\n },\r\n {\r\n featureType: \"poi.park\",\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#e5e5e5\" }],\r\n },\r\n {\r\n featureType: \"poi.park\",\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#9e9e9e\" }],\r\n },\r\n {\r\n featureType: \"road\",\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#ffffff\" }],\r\n },\r\n {\r\n featureType: \"road.arterial\",\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#757575\" }],\r\n },\r\n {\r\n featureType: \"road.highway\",\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#dadada\" }],\r\n },\r\n {\r\n featureType: \"road.highway\",\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#616161\" }],\r\n },\r\n {\r\n featureType: \"road.local\",\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#9e9e9e\" }],\r\n },\r\n {\r\n featureType: \"transit.line\",\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#e5e5e5\" }],\r\n },\r\n {\r\n featureType: \"transit.station\",\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#eeeeee\" }],\r\n },\r\n {\r\n featureType: \"water\",\r\n elementType: \"geometry\",\r\n stylers: [{ color: \"#c9c9c9\" }],\r\n },\r\n {\r\n featureType: \"water\",\r\n elementType: \"labels.text.fill\",\r\n stylers: [{ color: \"#9e9e9e\" }],\r\n },\r\n ],\r\n };\r\n};","var MapShadowCircleExtension = {\r\n load: function () {\r\n MapShadowCircle.prototype = new google.maps.OverlayView;\r\n\r\n function MapShadowCircle(model) {\r\n this.bounds_ = new google.maps.Circle({\r\n center: model.center,\r\n radius: model.radius\r\n }).getBounds();\r\n\r\n this.data_ = model;\r\n this.div_ = null;\r\n this.map_ = model.map;\r\n this.visibleOnAdd = model.visibleOnAdd;\r\n this.cssClass = 'map-shadow-circle';\r\n if (model.cssClass) {\r\n this.cssClass += ' ' + model.cssClass;\r\n }\r\n\r\n this.setMap(model.map);\r\n }\r\n\r\n window['MapShadowCircle'] = MapShadowCircle;\r\n\r\n MapShadowCircle.prototype.onAdd = function () {\r\n var $div = $(document.createElement('div'));\r\n $div.css(\"position\", \"absolute\");\r\n\r\n if (!this.visibleOnAdd) {\r\n $div.css(\"visibility\", \"hidden\");\r\n }\r\n\r\n var circle = document.createElement('div');\r\n circle.className = this.cssClass;\r\n $div[0].appendChild(circle);\r\n\r\n this.div_ = $div[0];\r\n\r\n var panes = this.getPanes();\r\n panes.overlayLayer.appendChild(this.div_);\r\n };\r\n MapShadowCircle.prototype['onAdd'] = MapShadowCircle.prototype.onAdd;\r\n\r\n MapShadowCircle.prototype.draw = function () {\r\n var overlayProjection = this.getProjection();\r\n var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());\r\n var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());\r\n var div = this.div_;\r\n div.style.left = sw.x + 'px';\r\n div.style.top = ne.y + 'px';\r\n div.style.width = (ne.x - sw.x) + 'px';\r\n div.style.height = (sw.y - ne.y) + 'px';\r\n\r\n //div.style['visibility'] = this.getVisible_();\r\n };\r\n MapShadowCircle.prototype['draw'] = MapShadowCircle.prototype.draw;\r\n\r\n MapShadowCircle.prototype.getVisible_ = function () {\r\n var minZoom = (this.data_.minZoom);\r\n var maxZoom = (this.data_.maxZoom);\r\n\r\n if (minZoom === undefined && maxZoom === undefined) {\r\n return '';\r\n }\r\n\r\n var map = this.getMap();\r\n if (!map) {\r\n return '';\r\n }\r\n\r\n var mapZoom = map.getZoom();\r\n if (mapZoom < minZoom || mapZoom > maxZoom) {\r\n return 'hidden';\r\n }\r\n return '';\r\n };\r\n\r\n\r\n MapShadowCircle.prototype.onRemove = function () {\r\n this.div_.parentNode.removeChild(this.div_);\r\n this.div_ = null;\r\n };\r\n MapShadowCircle.prototype['onRemove'] = MapShadowCircle.prototype.onRemove;\r\n\r\n MapShadowCircle.prototype.setVisible = function (isVisible) {\r\n var div = this.div_;\r\n if (div) {\r\n div.style['visibility'] = isVisible ? \"visible\" : \"hidden\";\r\n }\r\n };\r\n MapShadowCircle.prototype['setVisible'] = MapShadowCircle.prototype.setVisible;\r\n }\r\n};","var MapTooltipExtension = {\r\n load: function () {\r\n MapTooltip.prototype = new google.maps.OverlayView;\r\n\r\n function MapTooltip(model) {\r\n this.poly_ = model.polyline;\r\n this.content_ = model.content;\r\n this.cssClass_ = model.cssClass || null;\r\n\r\n this.div_ = null;\r\n this.setMap(model.map);\r\n var that = this;\r\n \r\n google.maps.event.addListener(that.poly_, 'mouseover', function (e) {\r\n that.position = e.latLng;\r\n that.draw();\r\n that.show(e);\r\n });\r\n\r\n google.maps.event.addListener(that.poly_, 'mouseout', function () {\r\n that.hide();\r\n });\r\n }\r\n\r\n window['MapTooltip'] = MapTooltip;\r\n\r\n MapTooltip.prototype.onAdd = function () {\r\n var div = document.createElement('DIV');\r\n div.style.position = \"absolute\";\r\n div.style.visibility = \"hidden\";\r\n if (this.cssClass_)\r\n div.className += \" \" + this.cssClass_;\r\n div.innerHTML = this.content_;\r\n this.div_ = div;\r\n var panes = this.getPanes();\r\n panes.floatPane.appendChild(this.div_);\r\n }\r\n\r\n MapTooltip.prototype.draw = function () {\r\n var overlayProjection = this.getProjection();\r\n if (this.position)\r\n var ne = overlayProjection.fromLatLngToDivPixel(this.position);\r\n else if (this.poly_.getPath && this.poly_.getPath().getAt && this.poly_.getPath().getAt(0))\r\n var ne = overlayProjection.fromLatLngToDivPixel(this.poly_.getPath().getAt(0));\r\n // Position the DIV.\r\n var div = this.div_;\r\n div.style.left = ne.x + 10 + 'px';\r\n div.style.top = ne.y + 10 + 'px';\r\n }\r\n\r\n MapTooltip.prototype.onRemove = function () {\r\n this.div_.parentNode.removeChild(this.div_);\r\n }\r\n\r\n MapTooltip.prototype.hide = function () {\r\n if (this.div_) {\r\n this.div_.style.visibility = \"hidden\";\r\n }\r\n }\r\n MapTooltip.prototype.show = function (e) {\r\n if (this.div_) {\r\n this.div_.style.visibility = \"visible\";\r\n }\r\n }\r\n MapTooltip.prototype.setContent = function (content) {\r\n this.content_ = content;\r\n this.div_.innerHTML = this.content_;\r\n }\r\n }\r\n};","var MapUtils = {\r\n createMultiPolygonPathsFromPoints: function (points) {\r\n var paths = [];\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n var subPath = [];\r\n\r\n for (var j = 0; j < points[i].length; j++) {\r\n var p = points[i][j];\r\n subPath.push({ lat: p.Lat, lng: p.Lng });\r\n }\r\n\r\n paths.push(subPath);\r\n }\r\n\r\n return paths;\r\n },\r\n\r\n createMultiPolygonPathsFromArrayOfPoints: function (points) {\r\n var paths = [];\r\n\r\n if (points !== null) {\r\n for (var i = 0; i < points.length; i++) {\r\n var subPath = [];\r\n\r\n for (var j = 0; j < points[i].length; j++) {\r\n var p = points[i][j];\r\n subPath.push({ lat: p[0], lng: p[1] });\r\n }\r\n\r\n paths.push(subPath);\r\n }\r\n }\r\n\r\n return paths;\r\n },\r\n\r\n createFlatMultiPolygonPathsFromPoints: function (points) {\r\n var paths = [];\r\n var subPath = [];\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n var latLng = [];\r\n\r\n for (var j = 0; j < points[i].length; j++) {\r\n latLng.push(points[i][j]);\r\n }\r\n if (latLng.length >= 2)\r\n subPath.push({ lat: latLng[0], lng: latLng[1] });\r\n\r\n }\r\n\r\n paths.push(subPath);\r\n return paths;\r\n },\r\n\r\n createSimpleMultiPolygonPathsFromPoints: function (points) {\r\n var paths = [];\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n var p = points[i];\r\n paths.push({ lat: p.Lat, lng: p.Lng });\r\n }\r\n\r\n return paths;\r\n },\r\n\r\n // Douglas Peucker's algorithm\r\n simplifyPoints: function (points, sqTolerance) {\r\n function getSqSegDist(p, p1, p2) {\r\n var x = p1[0],\r\n y = p1[1],\r\n dx = p2[0] - x,\r\n dy = p2[1] - y;\r\n\r\n if (dx !== 0 || dy !== 0) {\r\n var t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);\r\n\r\n if (t > 1) {\r\n x = p2[0];\r\n y = p2[1];\r\n }\r\n else if (t > 0) {\r\n x += dx * t;\r\n y += dy * t;\r\n }\r\n }\r\n\r\n dx = p[0] - x;\r\n dy = p[1] - y;\r\n\r\n return dx * dx + dy * dy;\r\n }\r\n\r\n function simplifyDPStep(points, first, last, sqTolerance, simplified) {\r\n var maxSqDist = sqTolerance;\r\n var index;\r\n\r\n for (var i = first + 1; i < last; i++) {\r\n var sqDist = getSqSegDist(points[i], points[first], points[last]);\r\n\r\n if (sqDist > maxSqDist) {\r\n index = i;\r\n maxSqDist = sqDist;\r\n }\r\n }\r\n\r\n if (maxSqDist > sqTolerance) {\r\n if (index - first > 1)\r\n simplifyDPStep(points, first, index, sqTolerance, simplified);\r\n\r\n simplified.push(points[index]);\r\n\r\n if (last - index > 1)\r\n simplifyDPStep(points, index, last, sqTolerance, simplified);\r\n }\r\n }\r\n\r\n var last = points.length - 1;\r\n var simplified = [points[0]];\r\n\r\n simplifyDPStep(points, 0, last, sqTolerance, simplified);\r\n simplified.push(points[last]);\r\n\r\n return simplified;\r\n },\r\n\r\n checkPolygonIsSelfIntersecting: function (points) {\r\n function checkIntersection(x1, y1, x2, y2, x3, y3, x4, y4) {\r\n var denom = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));\r\n var numeA = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));\r\n var numeB = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3));\r\n\r\n if (denom == 0) {\r\n return false;\r\n }\r\n\r\n const uA = numeA / denom;\r\n const uB = numeB / denom;\r\n\r\n if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) {\r\n return {\r\n x: x1 + (uA * (x2 - x1)),\r\n y: y1 + (uA * (y2 - y1))\r\n };\r\n }\r\n\r\n return false;\r\n }\r\n\r\n var equalPoint = function (point1, point2) {\r\n return (point1[0] === point2[0] && point1[1] === point2[1]);\r\n };\r\n\r\n var line1p1, line1p2, line2p1, line2p2, result, found = false;\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n line1p1 = points[i];\r\n\r\n if ((i + 1) < points.length) {\r\n line1p2 = points[i + 1];\r\n }\r\n else {\r\n line1p2 = points[0];\r\n\r\n if (equalPoint(line1p1, line1p2)) {\r\n continue;\r\n }\r\n }\r\n\r\n for (var j = i + 1; j < points.length; j++) {\r\n line2p1 = points[j];\r\n\r\n if ((j + 1) < points.length) {\r\n line2p2 = points[j + 1];\r\n }\r\n else {\r\n line2p2 = points[0];\r\n\r\n if (equalPoint(line2p1, line2p2)) {\r\n continue;\r\n }\r\n }\r\n\r\n result = checkIntersection(\r\n line1p1[0], line1p1[1], line1p2[0], line1p2[1],\r\n line2p1[0], line2p1[1], line2p2[0], line2p2[1]\r\n );\r\n\r\n if (result) {\r\n if (equalPoint(line1p2, line2p1) && equalPoint(line1p2, [result.x, result.y]) || equalPoint(line1p1, line2p2)) {\r\n continue;\r\n }\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n getAreaPolygonBaseOptions: function () {\r\n return {\r\n strokeWeight: 2,\r\n strokeColor: '#58a7e2',\r\n strokeOpacity: 1,\r\n fillColor: '#58a7e2',\r\n fillOpacity: 0.25,\r\n clickable: false\r\n };\r\n },\r\n\r\n getUserRegionsPolygonBaseOptions: function () {\r\n return {\r\n strokeWeight: 2,\r\n strokeColor: '#b71c1c',\r\n strokeOpacity: 1,\r\n fillColor: '#b71c1c',\r\n fillOpacity: 0.25,\r\n clickable: false\r\n };\r\n },\r\n\r\n openMarkerObjectDetailsInNewTab: function (mapManager, data) {\r\n if (data.IsExposed && data.EstateType === mapManager.ESTATE_TYPE.hall)\r\n window.open(AppView.actionUrls.getExposedEstateDetailsPage + '/' + data.EstateId, '_blank');\r\n else if (data.IsExposed && data.EstateType === mapManager.ESTATE_TYPE.landPlot)\r\n window.open(AppView.actionUrls.getExposedLandPlotDetailsPage + '/' + data.EstateId, '_blank');\r\n else if (!data.IsExposed && data.EstateType === mapManager.ESTATE_TYPE.hall)\r\n window.open(AppView.actionUrls.getEstateDetailsPage + '/' + data.EstateId, '_blank');\r\n else if (!data.IsExposed && data.EstateType === mapManager.ESTATE_TYPE.landPlot)\r\n window.open(AppView.actionUrls.getLandPlotDetailsPage + '/' + data.EstateId, '_blank');\r\n },\r\n};","\r\nvar MapValueRangeBoxExtension = {\r\n load: function () {\r\n MapValueRangeBox.prototype = new google.maps.OverlayView;\r\n\r\n function MapValueRangeBox(model) {\r\n\r\n this.data_ = model;\r\n this.div_ = null;\r\n this.map_ = model.map;\r\n\r\n this.setMap(model.map);\r\n }\r\n\r\n window['MapValueRangeBox'] = MapValueRangeBox;\r\n\r\n MapValueRangeBox.prototype.onAdd = function () {\r\n var $div = $(document.createElement('div'));\r\n\r\n $div.addClass('map-value-range-box');\r\n\r\n var html = [\r\n '
    ',\r\n '', this.data_.valueFrom, '',\r\n '
    ',\r\n '
    ',\r\n '', this.data_.valueTo, '',\r\n '
    '\r\n ].join('');\r\n\r\n $div.html(html);\r\n\r\n this.div_ = $div[0];\r\n\r\n var panes = this.getPanes();\r\n panes.overlayLayer.appendChild(this.div_);\r\n };\r\n MapValueRangeBox.prototype['onAdd'] = MapValueRangeBox.prototype.onAdd;\r\n\r\n MapValueRangeBox.prototype.draw = function () {\r\n var overlayProjection = this.getProjection();\r\n var xy = overlayProjection.fromLatLngToDivPixel(this.data_.position);\r\n var div = this.div_;\r\n\r\n div.style.left = xy.x + 'px';\r\n div.style.top = xy.y + 'px';\r\n\r\n div.style['visibility'] = this.getVisible_();\r\n };\r\n MapValueRangeBox.prototype['draw'] = MapValueRangeBox.prototype.draw;\r\n\r\n MapValueRangeBox.prototype.getVisible_ = function () {\r\n var minZoom = (this.data_.minZoom);\r\n var maxZoom = (this.data_.maxZoom);\r\n\r\n if (minZoom === undefined && maxZoom === undefined) {\r\n return '';\r\n }\r\n\r\n var map = this.getMap();\r\n if (!map) {\r\n return '';\r\n }\r\n\r\n var mapZoom = map.getZoom();\r\n if (mapZoom < minZoom || mapZoom > maxZoom) {\r\n return 'hidden';\r\n }\r\n return '';\r\n };\r\n\r\n\r\n MapValueRangeBox.prototype.onRemove = function () {\r\n this.div_.parentNode.removeChild(this.div_);\r\n this.div_ = null;\r\n };\r\n MapValueRangeBox.prototype['onRemove'] = MapValueRangeBox.prototype.onRemove;\r\n }\r\n};","var PriceAnalysisMapController = function (mapManager, settings) {\r\n var self = this;\r\n\r\n var adjustMapViewportOnNextLoad = false;\r\n var lastMapObjectsReloadZoomLevel = -1;\r\n var mapObjects = [];\r\n\r\n mapManager.addOnReadyListener(onMapInitialized);\r\n\r\n function onMapInitialized() {\r\n mapManager.setStyle('gray');\r\n google.maps.event.addListenerOnce(mapManager.getGoogleMap(), 'idle', function () {\r\n reloadMapObjects();\r\n });\r\n }\r\n\r\n function reloadMapObjects() {\r\n CancelableRequests.abort('mapObjects');\r\n\r\n var boundingBox = mapManager.getCurrentBoundingBox(1.25);\r\n\r\n // In case the Google Maps did not completely load yet\r\n if (boundingBox === null) {\r\n google.maps.event.addListenerOnce(mapManager.getGoogleMap(), 'bounds_changed', reloadMapObjects);\r\n return;\r\n }\r\n\r\n var data = {\r\n BoundingBox: boundingBox,\r\n ZoomLevel: mapManager.getGoogleMap().getZoom(),\r\n CalculateEstateBoundingBox: adjustMapViewportOnNextLoad\r\n };\r\n\r\n if (settings.mapObjectsData) {\r\n settings.mapObjectsData(data);\r\n }\r\n\r\n CancelableRequests.add('mapObjects',\r\n $.post(AppView.actionUrls.PriceDistributionMapResults, data).done(function (res) {\r\n if (res) {\r\n var zoomLevel = mapManager.getGoogleMap().getZoom();\r\n if (zoomLevel !== lastMapObjectsReloadZoomLevel) {\r\n mapManager.clearObjects();\r\n }\r\n\r\n mapManager.addObjects(res.Objects);\r\n mapObjects = res.Objects;\r\n lastMapObjectsReloadZoomLevel = zoomLevel;\r\n\r\n if (adjustMapViewportOnNextLoad) {\r\n mapManager.adjustViewportToBoundingBox(res.EstateBoundingBox);\r\n adjustMapViewportOnNextLoad = false;\r\n }\r\n\r\n if (res.HasFailed) {\r\n $('#serviceFailureAlert').show();\r\n } else {\r\n $('#serviceFailureAlert').hide();\r\n }\r\n }\r\n }));\r\n\r\n }\r\n\r\n self.getMapManager = function () {\r\n return mapManager;\r\n };\r\n\r\n self.reloadMapObjects = function () {\r\n reloadMapObjects();\r\n };\r\n\r\n self.adjustMapViewportOnNextLoad = function () {\r\n adjustMapViewportOnNextLoad = true;\r\n };\r\n\r\n self.mapInitialize = function () {\r\n mapManager.initialize();\r\n };\r\n};","var RangeSliderManager = function (onSliderChangedFn) {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n function getRangeSize(value, x, smallSize) {\r\n var equation = null;\r\n var a = null;\r\n var b = null;\r\n\r\n if (smallSize) {\r\n a = 0.1;\r\n b = 0.001;\r\n\r\n equation = a * (x * x) * (b * x) / 100;\r\n }\r\n else {\r\n a = 0.01;\r\n\r\n equation = (a * Math.pow(x, a * x)) * (a * (x * x)) / 100;\r\n }\r\n\r\n return parseInt(value * equation);\r\n }\r\n\r\n function refreshSliderDirtyStates($slider, $inputFrom, $inputTo) {\r\n var values = $slider.noUiSlider.get();\r\n var min = $slider.noUiSlider.options.range.min;\r\n var max = $slider.noUiSlider.options.range.max;\r\n\r\n if (values[0] === min) {\r\n $slider.removeAttribute('data-min-dirty');\r\n $inputFrom.removeClass('active');\r\n }\r\n else {\r\n $slider.setAttribute('data-min-dirty', true);\r\n $inputFrom.addClass('active');\r\n }\r\n\r\n if (values[1] === max) {\r\n $slider.removeAttribute('data-max-dirty');\r\n $inputTo.removeClass('active');\r\n }\r\n else {\r\n $slider.setAttribute('data-max-dirty', true);\r\n $inputTo.addClass('active');\r\n }\r\n }\r\n\r\n self.getSliderRange = function (minValue, maxValue) {\r\n var isSmallRange = maxValue < 3000000;\r\n var array = [];\r\n\r\n array.push(['min', minValue]);\r\n for (var i = 5; i < 100; i += 5) {\r\n var value = getRangeSize(maxValue, i, isSmallRange);\r\n if (value > minValue && value < maxValue) {\r\n array.push([i + \"%\", value]);\r\n }\r\n }\r\n array.push(['max', maxValue]);\r\n\r\n return Object.fromEntries(array);\r\n };\r\n\r\n self.setSliderDisabledState = function ($slider, disabled) {\r\n var sliderControl = $slider.find('*[data-slider-control]:first')[0];\r\n\r\n $slider.toggleClass('disabled', disabled);\r\n\r\n if (disabled) {\r\n sliderControl.setAttribute('disabled', disabled);\r\n\r\n $slider.find('[data-slider-from]').attr('disabled', true);\r\n $slider.find('[data-slider-to]').attr('disabled', true);\r\n }\r\n else {\r\n sliderControl.removeAttribute('disabled');\r\n\r\n $slider.find('[data-slider-from]').attr('disabled', null);\r\n $slider.find('[data-slider-to]').attr('disabled', null);\r\n }\r\n }\r\n\r\n self.init = function (sliderSelector) {\r\n var $this = $(sliderSelector);\r\n var slider = $this.find('*[data-slider-control]:first')[0];\r\n var $inputFrom = $this.find('input[data-slider-from]:first');\r\n var $inputTo = $this.find('input[data-slider-to]:first');\r\n var minValue = parseInt($this.attr('data-min'));\r\n var maxValue = parseInt($this.attr('data-max'));\r\n var isDisabledOnInit = minValue === 0 && maxValue === 0;\r\n var isZeroRange = minValue === maxValue;\r\n var isIntegerRangeSlider = typeof $this.data('integerRangeSlider') !== 'undefined';\r\n\r\n var sliderConfig = {\r\n connect: true,\r\n start: [\r\n $inputFrom.numberVal(),\r\n $inputTo.numberVal()\r\n ]\r\n };\r\n\r\n if (isIntegerRangeSlider) {\r\n sliderConfig.format = {\r\n to: function (value) {\r\n return Math.round(parseFloat(value));\r\n },\r\n from: function (value) {\r\n return Math.round(parseFloat(value));\r\n }\r\n };\r\n } else {\r\n sliderConfig.format = {\r\n from: Number,\r\n to: Number\r\n };\r\n }\r\n\r\n if (isDisabledOnInit) {\r\n sliderConfig.range = {\r\n 'min': 0,\r\n 'max': 1000000\r\n };\r\n isZeroRange = true;\r\n } else {\r\n sliderConfig.range = self.getSliderRange(minValue, maxValue);\r\n }\r\n\r\n noUiSlider.create(slider, sliderConfig);\r\n\r\n slider.noUiSlider.on('update', function (values, handle) {\r\n $inputFrom.numberVal(values[0]);\r\n $inputTo.numberVal(values[1]);\r\n });\r\n\r\n slider.noUiSlider.on('change', function (values, handle) {\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n if (onSliderChangedFn) {\r\n onSliderChangedFn();\r\n }\r\n });\r\n\r\n $inputFrom.change(function () {\r\n var fromVal = $inputFrom.numberVal();\r\n var toVal = $inputTo.numberVal();\r\n\r\n if (isNaN(fromVal)) {\r\n fromVal = parseInt($this.attr('data-min'));\r\n $inputFrom.numberVal(fromVal);\r\n }\r\n\r\n if (fromVal > toVal) {\r\n toVal = fromVal;\r\n $inputTo.numberVal(fromVal);\r\n }\r\n\r\n slider.noUiSlider.setHandle(0, fromVal, true);\r\n\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n if (onSliderChangedFn) {\r\n onSliderChangedFn();\r\n }\r\n });\r\n\r\n $inputTo.change(function () {\r\n var fromVal = $inputFrom.numberVal();\r\n var toVal = $inputTo.numberVal();\r\n\r\n if (isNaN(toVal)) {\r\n toVal = parseInt($this.attr('data-max'));\r\n $inputTo.numberVal(toVal);\r\n }\r\n\r\n if (toVal < fromVal) {\r\n fromVal = toVal;\r\n $inputFrom.numberVal(toVal);\r\n }\r\n\r\n slider.noUiSlider.setHandle(1, toVal, true);\r\n\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n if (onSliderChangedFn) {\r\n onSliderChangedFn();\r\n }\r\n });\r\n\r\n refreshSliderDirtyStates(slider, $inputFrom, $inputTo);\r\n self.setSliderDisabledState($this, isZeroRange);\r\n };\r\n}","/**\r\n * \r\n * settings = {\r\n * tableSelector: '.responsive-prices-table',\r\n * sortDirInputSelector: \"#pricesSortDirection\",\r\n * sortTypeInputSelector: \"#pricesSortMethod\",\r\n * reloadFn: function() {}\r\n * }\r\n *\r\n */\r\n\r\nvar SortTableHead = function (settings) {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n var SORT_DIRECTION = {\r\n asc: 'Asc',\r\n desc: 'Desc'\r\n };\r\n var $sortableTable = $(settings.tableSelector);\r\n var defaultSort = $(settings.sortTypeInputSelector).val();\r\n\r\n function onSortHeaderClick() {\r\n var $sortTh = $(this);\r\n var sortDir = $(settings.sortDirInputSelector).val() === SORT_DIRECTION.desc\r\n ? SORT_DIRECTION.asc : SORT_DIRECTION.desc;\r\n var sortProp = null;\r\n\r\n $sortableTable.find('.cell--sortable').removeClass('sorted-Asc sorted-Desc');\r\n if (sortDir === SORT_DIRECTION.desc) {\r\n $sortTh.addClass('sorted-Desc');\r\n sortProp = $sortTh.attr('data-sort-desc-prop');\r\n } else {\r\n $sortTh.addClass('sorted-Asc');\r\n sortProp = $sortTh.attr('data-sort-asc-prop');\r\n }\r\n\r\n $(settings.sortDirInputSelector).val(sortDir);\r\n $(settings.sortTypeInputSelector).val(sortProp);\r\n\r\n if (settings.reloadFn) {\r\n settings.reloadFn();\r\n }\r\n };\r\n\r\n function initSortHeader() {\r\n var $descSortTh = $sortableTable.find('[data-sort-desc-prop=\"' + defaultSort + '\"]');\r\n var $ascSortTh = $sortableTable.find('[data-sort-asc-prop=\"' + defaultSort + '\"]');\r\n if ($descSortTh.length) {\r\n $(settings.sortDirInputSelector).val(SORT_DIRECTION.desc);\r\n $descSortTh.addClass('sorted-Desc');\r\n } else if ($ascSortTh.length) {\r\n $(settings.sortDirInputSelector).val(SORT_DIRECTION.asc);\r\n $ascSortTh.addClass('sorted-Asc');\r\n }\r\n }\r\n\r\n self.init = function () {\r\n $sortableTable.find('.cell--sortable').on('click', onSortHeaderClick);\r\n initSortHeader();\r\n };\r\n\r\n self.resetSortToDefault = function () {\r\n $sortableTable.find('.cell--sortable').removeClass('sorted-Asc sorted-Desc');\r\n $(settings.sortDirInputSelector).val(\"\");\r\n $(settings.sortTypeInputSelector).val(defaultSort);\r\n initSortHeader();\r\n };\r\n}","var SortTypeSelectPositionManager = function (largeDeviceBreakpoint) {\r\n 'use strict';\r\n\r\n var self = this;\r\n var $sortTypeSelect = null;\r\n\r\n function moveSortTypeSelect() {\r\n if (largeDeviceBreakpoint.matches) {\r\n $sortTypeSelect = $sortTypeSelect.appendTo($('#sortMenuWrapperDesktopAbove'));\r\n } else {\r\n $sortTypeSelect = $sortTypeSelect.appendTo($('#sortMenuWrapperDesktopBelow'));\r\n }\r\n }\r\n\r\n self.init = function () {\r\n $sortTypeSelect = $('#sortTypeSelect');\r\n\r\n largeDeviceBreakpoint.addListener(moveSortTypeSelect);\r\n if (!largeDeviceBreakpoint.matches) {\r\n moveSortTypeSelect();\r\n }\r\n }\r\n}","var TableManager = function (settings) {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n var tables = [];\r\n var dialogModalManager = settings.dialogModalManager;\r\n\r\n function getTableName(element) {\r\n var top = $(element).closest('[data-table-name]');\r\n if (top) {\r\n return $(top).data('table-name');\r\n }\r\n return null;\r\n }\r\n\r\n function doTableAction(arg, action) {\r\n if (arg && typeof (action) === 'function') {\r\n var tableName = $.type(arg) === 'string' ? arg : getTableName(arg);\r\n if (tableName) {\r\n var table = tables[tableName];\r\n if (table) {\r\n return action(table);\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function onEditDialogShow(dialogContext) {\r\n if (typeof (dialogContext.table.onEditDialogShow) === 'function') {\r\n dialogContext.table.onEditDialogShow(dialogContext);\r\n }\r\n }\r\n\r\n function onEditDialogSubmit(dialogContext) {\r\n\r\n if (typeof (dialogContext.table.onEditDialogSubmit) === 'function') {\r\n dialogContext.table.onEditDialogSubmit(dialogContext);\r\n }\r\n\r\n if (dialogContext.table.data.reloadAllRowsOnEdit) {\r\n reloadAllTableRows(dialogContext);\r\n }\r\n else {\r\n reloadTableRow(dialogContext);\r\n }\r\n }\r\n\r\n function reloadTableRow(dialogContext) {\r\n const $form = $(dialogContext.dialogContent).find('form');\r\n\r\n const getRowUrl = dialogContext.table.getRowUrl();\r\n\r\n if (getRowUrl) {\r\n //let data = $form.serializeToJSON();\r\n let data = $form.serializeArray();\r\n data.fieldPrefix = dialogContext.table.fieldPrefix;\r\n data = dialogContext.table.onBeforeGetRow(data);\r\n\r\n $.post({\r\n url: getRowUrl,\r\n data: data,\r\n }).done(function (content) {\r\n $(dialogContext.dialogModal).modal('hide');\r\n\r\n if (dialogContext.row) {\r\n dialogContext.table.replaceRow(dialogContext.row, $(content));\r\n }\r\n else {\r\n dialogContext.table.addRow($(content));\r\n }\r\n }).fail(function (xhr, status) {\r\n dialogContext.method = 'POST';\r\n dialogContext.onClose = null;\r\n dialogContext.model = $form.serialize();\r\n dialogModalManager.showDialog(dialogContext);\r\n });\r\n } else {\r\n $(dialogContext.dialogModal).modal('hide');\r\n }\r\n }\r\n\r\n function reloadAllTableRows(dialogContext) {\r\n const $form = $(dialogContext.dialogContent).find('form');\r\n const getRowsUrl = dialogContext.table.getRowsUrl();\r\n\r\n if (getRowsUrl) {\r\n let data = $form.serializeToJSON();\r\n data.fieldPrefix = dialogContext.table.fieldPrefix;\r\n data = dialogContext.table.onBeforeGetRows(data);\r\n\r\n $.post({\r\n url: getRowsUrl,\r\n data: data\r\n }).done(function (content) {\r\n $(dialogContext.dialogModal).modal('hide');\r\n dialogContext.table.clear();\r\n dialogContext.table.addRows(content);\r\n }).fail(function (xhr, status) {\r\n dialogContext.method = 'POST';\r\n dialogContext.onClose = null;\r\n dialogContext.model = $form.serialize();\r\n dialogModalManager.showDialog(dialogContext);\r\n });\r\n }\r\n else {\r\n $(dialogContext.dialogModal).modal('hide');\r\n }\r\n }\r\n\r\n self.addTable = function (tableSettings) {\r\n var table = new TableObject(self, tableSettings);\r\n if (table.tableName) {\r\n tables[table.tableName] = table;\r\n }\r\n };\r\n\r\n self.getTable = function (tableName) {\r\n return tables[tableName];\r\n };\r\n\r\n self.addNewRow = function (tableName, el) {\r\n doTableAction(tableName, function (table) {\r\n table.disableButtons();\r\n var model = table.getEmptyModel();\r\n var dialogUrl = $(el).data().modalUrl || table.getEditDialogUrl();\r\n\r\n if (dialogUrl) {\r\n dialogModalManager.showDialog({\r\n method: 'GET',\r\n url: dialogUrl,\r\n model: model,\r\n table: table,\r\n autoClose: false,\r\n onShow: onEditDialogShow,\r\n onSubmit: onEditDialogSubmit,\r\n onClose: function () {\r\n table.enableButtons();\r\n }\r\n });\r\n }\r\n else if (table.getRowUrl()) {\r\n CancelableRequests.register('tableManagerGetNewRow',\r\n $.post(table.getRowUrl(), table.onBeforeGetRow(model), function (content) {\r\n if (content) {\r\n table.addRow($(content));\r\n }\r\n }).always(function () {\r\n table.enableButtons();\r\n }));\r\n }\r\n });\r\n };\r\n\r\n self.deleteRow = function (el) {\r\n doTableAction(el, function (table) {\r\n table.disableButtons();\r\n\r\n if (table.confirmDeleteRow) {\r\n dialogModalManager.showConfirmDialog(table.confirmDeleteRowDialogTitle, table.confirmDeleteRowDialogMessage,\r\n function () {\r\n table.deleteRow($(el).closest('[data-table-row]'));\r\n },\r\n function () {\r\n table.enableButtons();\r\n }\r\n );\r\n }\r\n else {\r\n table.deleteRow($(el).closest('[data-table-row]'));\r\n table.enableButtons();\r\n }\r\n });\r\n };\r\n\r\n self.togglePreviewRow = function (el) {\r\n doTableAction(el, function (table) {\r\n var row = $(el).closest('[data-table-row]');\r\n var previewRow = row.find('[data-preview-row]');\r\n previewRow.toggle();\r\n });\r\n };\r\n\r\n self.clear = function (tableName) {\r\n doTableAction(tableName, function (table) {\r\n table.clear();\r\n });\r\n }\r\n\r\n self.editRow = function (el) {\r\n doTableAction(el, function (table) {\r\n table.disableButtons();\r\n var row = $(el).closest('[data-table-row]');\r\n var dialogUrl = $(el).data().modalUrl || table.getEditDialogUrl();\r\n\r\n if (row && dialogUrl) {\r\n dialogModalManager.showDialog({\r\n url: dialogUrl,\r\n model: table.getRowModel(row),\r\n table: table,\r\n row: row,\r\n autoClose: false,\r\n onShow: onEditDialogShow,\r\n onSubmit: onEditDialogSubmit,\r\n onClose: function () {\r\n table.enableButtons();\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n self.eachRows = function (tableName, fn) {\r\n doTableAction(tableName, function (table) {\r\n table.eachRows(fn);\r\n });\r\n };\r\n\r\n self.getRowByIndex = function (tableName, index) {\r\n return doTableAction(tableName, function (table) {\r\n return table.getRowByIndex(index);\r\n });\r\n };\r\n\r\n self.getRowModelByIndex = function (tableName, index) {\r\n return doTableAction(tableName, function (table) {\r\n var row = table.getRowByIndex(index);\r\n if (row) {\r\n return table.getRowModel(row);\r\n }\r\n return null;\r\n });\r\n };\r\n\r\n function TableObject(tableManager, tableSettings) {\r\n\r\n tableSettings.tableSelector = tableSettings.tableSelector ? tableSettings.tableSelector :\r\n (tableSettings.tableName ? '[data-table-name=\"' + tableSettings.tableName + '\"]' : null);\r\n\r\n if (tableSettings.tableSelector == null) throw 'Missing required tableSelector or tableName settings.';\r\n\r\n var self = this;\r\n self.data = tableSettings;\r\n self.tableManager = tableManager;\r\n var $tableContainer = tableSettings.tableSelector ? $(tableSettings.tableSelector) : null;\r\n var $tableView = null;\r\n var $tableRows = null;\r\n\r\n if (typeof $tableContainer !== \"undefined\" && $tableContainer.length) {\r\n self.collectionName = tableSettings.collectionName ? tableSettings.collectionName :\r\n ($tableContainer && $tableContainer.data().collectionName ? $tableContainer.data().collectionName : tableSettings.tableName);\r\n }\r\n else {\r\n self.collectionName = tableSettings.tableName;\r\n }\r\n\r\n if (typeof $tableContainer !== \"undefined\" && $tableContainer.length) {\r\n self.fieldPrefix = tableSettings.fieldPrefix ? tableSettings.fieldPrefix :\r\n ($tableContainer && $tableContainer.data().fieldPrefix ? $tableContainer.data().fieldPrefix : '');\r\n }\r\n else {\r\n self.fieldPrefix = '';\r\n }\r\n\r\n self.confirmDeleteRow = tableSettings.confirmDeleteRow;\r\n self.confirmDeleteRowDialogTitle = tableSettings.confirmDeleteRowDialogTitle;\r\n self.confirmDeleteRowDialogMessage = tableSettings.confirmDeleteRowDialogMessage;\r\n self.onEditDialogShow = tableSettings.onEditDialogShow;\r\n self.onEditDialogSubmit = tableSettings.onEditDialogSubmit;\r\n\r\n function refreshTableViewVisibility() {\r\n var hasRows = $tableRows.children().length > 0;\r\n $tableView.toggle(hasRows);\r\n }\r\n\r\n function renumberRows() {\r\n $tableRows.find('[data-table-cell-rownumber]').each(function (idx) {\r\n $(this).html(idx + 1);\r\n });\r\n }\r\n\r\n function getCellValues(columnIdx) {\r\n let values = [];\r\n $tableRows.find('[data-table-column-index=\"' + columnIdx + '\"]').map(function (idx, el) {\r\n let val = $(el).data('table-cell-value');\r\n val = $.isNumeric(val) ? Number(val) : null;\r\n values.push(val);\r\n });\r\n return values;\r\n }\r\n\r\n function updateTotalCell($cell, values) {\r\n if (values && values.length) {\r\n let sum = values.reduce(function (total, val) {\r\n if (val) {\r\n return total ? total + val : val;\r\n }\r\n return total;\r\n });\r\n\r\n if (sum != null) {\r\n //$cell.html(sum);\r\n $cell.autoNumeric(sum);\r\n }\r\n else {\r\n $cell.empty();\r\n }\r\n }\r\n }\r\n\r\n function refreshAutoTotalCells() {\r\n if (self.data.autoTotal) {\r\n let cells = $tableContainer.find('[data-table-total-cell]');\r\n for (let i = 0; i < cells.length; i++) {\r\n let $cell = $(cells[i]);\r\n let columnIdx = $cell.data('table-total-cell');\r\n let values = getCellValues(columnIdx);\r\n updateTotalCell($cell, values);\r\n }\r\n }\r\n }\r\n\r\n function toggleDisablingButtons(disable) {\r\n disable = disable ? true : false;\r\n\r\n $.each($tableContainer.find('[data-table-button]'), function () {\r\n $(this).attr('disabled', disable);\r\n });\r\n }\r\n\r\n function refreshButtonsClickEvent($container) {\r\n $.each($container.find('[data-table-button]'), function (idx, el) {\r\n let $el = $(el);\r\n let type = $el.data('table-button');\r\n $el.off('click');\r\n\r\n switch (type) {\r\n case 'add':\r\n $el.click(function () {\r\n self.tableManager.addNewRow(self.tableName, this);\r\n });\r\n break;\r\n case 'edit':\r\n $el.click(function () {\r\n self.tableManager.editRow(this);\r\n });\r\n break;\r\n case 'delete':\r\n $el.click(function () {\r\n self.tableManager.deleteRow(this);\r\n });\r\n break;\r\n case 'toggle':\r\n $el.click(function () {\r\n self.tableManager.togglePreviewRow(this);\r\n });\r\n break;\r\n }\r\n });\r\n\r\n }\r\n\r\n if ($tableContainer && $tableContainer.length) {\r\n self.tableName = $tableContainer.data('table-name');\r\n self.data = $.extend({}, self.data, $tableContainer.data());\r\n self.tableContainer = $tableContainer;\r\n $tableView = $tableContainer.find('[data-table-view]');\r\n $tableView = $tableView.length ? $tableView : $tableContainer;\r\n $tableRows = $tableView.find('[data-table-rows]');\r\n $tableRows = $tableRows.length ? $tableRows : $tableContainer;\r\n\r\n renumberRows();\r\n refreshAutoTotalCells();\r\n refreshButtonsClickEvent($tableContainer);\r\n refreshTableViewVisibility();\r\n }\r\n\r\n self.getEditDialogUrl = function () {\r\n return typeof (self.data.editDialogUrl) === 'function' ? self.data.editDialogUrl() : self.data.editDialogUrl;\r\n };\r\n\r\n self.getRowUrl = function () {\r\n var getRowUrl = typeof (self.data.getRowUrl) === 'function' ? self.data.getRowUrl(self) : self.data.getRowUrl;\r\n return getRowUrl ? getRowUrl : typeof (self.data.editRowUrl) === 'function' ? self.data.editRowUrl() : self.data.editRowUrl;\r\n };\r\n\r\n self.getRowsUrl = function () {\r\n return typeof (self.data.getRowsUrl) === 'function' ? self.data.getRowsUrl(self) : self.data.getRowsUrl;\r\n };\r\n\r\n self.getEmptyModel = function () {\r\n return typeof (self.data.emptyModel) === 'function' ? self.data.emptyModel(self) : (self.data.emptyModel ? self.data.emptyModel : {});\r\n };\r\n\r\n self.onBeforeGetRow = function (data) {\r\n return typeof self.data.onBeforeGetRow === 'function' ? self.data.onBeforeGetRow(data, self) : data;\r\n };\r\n\r\n self.onBeforeGetRows = function (data) {\r\n return typeof self.data.onBeforeGetRows === 'function' ? self.data.onBeforeGetRows(data, self) : data;\r\n }\r\n\r\n self.getCollectionName = function () {\r\n return self.fieldPrefix + (self.fieldPrefix ? '.' : '') + self.collectionName;\r\n };\r\n\r\n self.getRowModel = function (row, unformatAutoNumericFields) {\r\n var array = null;\r\n if (unformatAutoNumericFields) {\r\n var $clonedRow = $(row).clone();\r\n $clonedRow.autoNumericInit();\r\n $clonedRow.autoNumericToNumberString();\r\n array = $clonedRow.find('input,select').serializeArray();\r\n $clonedRow.remove();\r\n } else {\r\n array = $(row).find('input,select').serializeArray();\r\n }\r\n\r\n let collectionName = self.getCollectionName();\r\n var index = array.find(function (el) { return el.name === collectionName + '.index'; });\r\n index = index ? index.value : null;\r\n if (index != null) {\r\n //var model = {};\r\n var model = [];\r\n var prefix = collectionName + '[' + index + '].';\r\n var prefixLen = prefix.length;\r\n /*var fieldRegexp = /^([^\\[]+)\\[(.+)]\\.(.+)/g;\r\n\r\n var setObjField = function (obj, fieldName, value) {\r\n var match = fieldRegexp.exec(fieldName);\r\n if (match) {\r\n let array = match[1];\r\n let idx = match[2];\r\n let field = match[3];\r\n if (obj[array] === undefined) {\r\n obj[array] = {};\r\n }\r\n if (obj[array][idx] === undefined) {\r\n obj[array][idx] = {};\r\n }\r\n setObjField(obj[array][idx], field, value);\r\n }\r\n else {\r\n obj[fieldName] = value;\r\n }\r\n }*/\r\n\r\n array.map(function (el) {\r\n //if (el.name.startsWith(prefix) && !el.name.endsWith(\".index\")) {\r\n if (el.name.startsWith(prefix)) {\r\n var fieldName = el.name.substr(prefixLen);\r\n //setObjField(model, fieldName, el.value);\r\n model.push({ name: fieldName, value: el.value });\r\n }\r\n });\r\n }\r\n return model;\r\n };\r\n\r\n self.getRowData = function (row) {\r\n var data = {};\r\n var cells = $(row).find('[data-table-column-index]').map(function (idx, el) {\r\n var $el = $(el);\r\n var index = $el.data('table-column-index');\r\n var text = $el.html().trim();\r\n var value = $el.data('table-cell-value');\r\n data[index] = { value: value, text: text };\r\n });\r\n return data;\r\n };\r\n\r\n self.getTableModel = function () {\r\n const model = [];\r\n self.eachRows(function (idx, row) {\r\n model.push(self.getRowModel(row));\r\n });\r\n return model;\r\n };\r\n\r\n self.getTableModelWithUnformatAutoNumericFields = function () {\r\n const model = [];\r\n var unformatAutoNumericFields = true;\r\n self.eachRows(function (idx, row) {\r\n model.push(self.getRowModel(row, unformatAutoNumericFields));\r\n });\r\n return model;\r\n };\r\n\r\n self.getRowIndex = function (row) {\r\n return $(row).find('input[name=\"' + self.tableName + '.index\"]').val();\r\n };\r\n\r\n self.getRowFieldId = function (row, fieldName) {\r\n var index = self.getRowIndex(row);\r\n return ['#', self.tableName, '_', index, '__', fieldName].join('');\r\n };\r\n\r\n self.getRowFieldName = function (row, fieldName) {\r\n var index = self.getRowIndex(row);\r\n return [self.tableName, '[', index, '].', fieldName].join('');\r\n };\r\n\r\n self.getRowByIndex = function (index) {\r\n return $tableRows.find('input[value=\"' + index + '\"]').closest('[data-table-row]');\r\n };\r\n\r\n self.addRow = function ($row) {\r\n if ($tableRows && $tableRows.length > 0) {\r\n $row.appendTo($tableRows);\r\n renumberRows();\r\n refreshAutoTotalCells();\r\n refreshTableViewVisibility();\r\n refreshButtonsClickEvent($row);\r\n if (typeof (self.data.onAddRow) === 'function') {\r\n self.data.onAddRow($row, this);\r\n }\r\n }\r\n };\r\n\r\n self.addRows = function (rows) {\r\n if ($tableRows && $tableRows.length) {\r\n var $rows = $(rows);\r\n $rows.appendTo($tableRows);\r\n $tableRows = $tableView.find('[data-table-rows]');\r\n renumberRows();\r\n refreshAutoTotalCells();\r\n refreshTableViewVisibility();\r\n refreshButtonsClickEvent($rows);\r\n if (typeof (self.data.onAddRows) === 'function') {\r\n self.data.onAddRows($rows, this);\r\n }\r\n }\r\n };\r\n\r\n self.deleteRow = function ($row) {\r\n $row.remove();\r\n renumberRows();\r\n refreshAutoTotalCells();\r\n refreshTableViewVisibility();\r\n if (typeof (self.data.onDeleteRow) === 'function') {\r\n self.data.onDeleteRow($row, this);\r\n }\r\n };\r\n\r\n self.replaceRow = function ($row, $content) {\r\n $row.replaceWith($content);\r\n renumberRows();\r\n refreshAutoTotalCells();\r\n refreshButtonsClickEvent($content);\r\n if (typeof (self.data.onReplaceRow) === 'function') {\r\n self.data.onReplaceRow($content, this);\r\n }\r\n };\r\n\r\n self.clear = function () {\r\n $tableRows.empty();\r\n refreshAutoTotalCells();\r\n refreshTableViewVisibility();\r\n };\r\n\r\n self.eachRows = function (fn) {\r\n if ($tableRows && $tableRows.length) {\r\n var rows = $tableRows.find('[data-table-row]');\r\n for (let i = 0; i < rows.length; i++) {\r\n fn(i, rows[i], this);\r\n }\r\n }\r\n };\r\n\r\n self.disableButtons = function () {\r\n toggleDisablingButtons(true);\r\n };\r\n\r\n self.enableButtons = function () {\r\n toggleDisablingButtons(false);\r\n };\r\n\r\n if (typeof (self.data.onInitialized) === 'function') {\r\n self.data.onInitialized(self);\r\n }\r\n\r\n return self;\r\n }\r\n};","(function ($) {\r\n\r\n if (!$.fn.tooltip) {\r\n throw new Error('Bootstrap Tooltip must be included first!');\r\n }\r\n\r\n var Tooltip = $.fn.tooltip.Constructor;\r\n\r\n $.extend(Tooltip.Default, {\r\n customClass: ''\r\n });\r\n\r\n var _show = Tooltip.prototype.show;\r\n\r\n Tooltip.prototype.show = function () {\r\n\r\n _show.apply(this);\r\n\r\n if (this.config.customClass) {\r\n var tip = this.getTipElement();\r\n $(tip).addClass(this.config.customClass);\r\n }\r\n\r\n };\r\n\r\n})(window.jQuery);"]}