{"id":87570,"date":"2024-04-18T13:05:39","date_gmt":"2024-04-18T10:05:39","guid":{"rendered":"https:\/\/tere-tech.eu\/balticfinns\/?page_id=87570"},"modified":"2024-04-19T09:59:32","modified_gmt":"2024-04-19T06:59:32","slug":"uudistuotannon-tuoreimmmat-alennukset","status":"publish","type":"page","link":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/uudistuotannon-tuoreimmmat-alennukset\/","title":{"rendered":"Uudistuotannon tuoreimmmat ALEnnukset"},"content":{"rendered":"\n<script src=\"\/nodejs\/flat-prices\/components\/newbiesWP\/script.js?108537755\"><\/script>\n\n\n\n<p class=\"has-cool-to-warm-spectrum-gradient-background has-background has-medium-font-size\"><strong>Tallinnan PARHAAT UUSIEN KOTIEN ALE :t l\u00f6yd\u00e4t t\u00e4\u00e4lt\u00e4 AINA TUOREINA !<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Parhaat viikkomuutokset hinnoissa<\/h2>\n\n\n\n<p class=\"has-contrast-2-color has-text-color\">T\u00e4st\u00e4  l\u00f6yd\u00e4t aivan automaattisesti tarjouksina ne ALEntuneet uudet kodit + voit valita sek\u00e4 asuinalueen ett\u00e4 huoneiden lkm oman kiinnostuksen mukaan. Talokuvista napauttamalla p\u00e4\u00e4set my\u00f6s mukavasti vilkaisemaan suoraan l\u00e4hi- &amp; aluepalveluita tarkemmin kullekin myyntikodille.<\/p>\n\n\n\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/4.7.0\/css\/font-awesome.min.css?1231785755\">\n\n<div style=\"display: none\">\n    <div id=\"serviceBubble\">        \n\n    <i v-show=\"backImg === ''\" class=\"fa fa-spinner fa-pulse fa-3x fa-fw\" \n               style=\"color: black; font-size:x-large; float:right\"><\/i>\n        \n    <div v-show=\" backImg !== '' \" class=\"img-container bubble_look\">\n      <img v-bind:src=\"backImg\" \n           v-bind:data-src=\"bubbleStyle2\" \n           alt=\"House's foto\" \n           loading=\"lazy\">\n      \n      <div class=\"overlay-text\">\n        <span class=\"text-line\">\n            {{ placeType.toUpperCase() }}<\/span>\n        <span class=\"text-line\">\n            {{ placeName }}<\/span>\n        <span class=\"text-line\">\n            {{ placeDist }} \n            <span v-if=\" placeDist > 0 \">km<\/span>\n        <\/span>\n      <\/div>\n      \n      <button title=\"Open big full foto\" \n              class='btn btn-info overlay-button' \n              @click=\"openWin(placeType, placeName)\"\n              target=\"_blank\">\n          <span class=\"glyphicon glyphicon-new-window\" \n                style=\"font-size: large; color: navy; padding: 4px\">\n          <\/span>\n      <\/button>\n      \n      <button v-show=\"onRestaurants\" \n              class='btn btn-info overlay-button'\n              >\n          <a :href=\"tAdvisor\" target=\"_blank\">\n          <img title=\"Check reviews\" \n               style=\"padding: 5px\"\n               :src=\"imgAdv\">\n          <\/a>\n      <\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- <\/template> -->\n\n<script>\n\/*\n  satImg = {lat: 59.434735167900556, lng: 24.75067913532257, zoom: 0.15, layers: 'of10000'};\n  imgOut = {h: 360, w: 340};\n  service = {type: 'restaurant', name: 'Hese', dist: '0.7'};\n *\/\n\n    vueServiceBubble = {};\n    function newServiceBubble(service, satImg, imgOut, id) {\n        if (typeof vueServiceBubble[id] === 'object') {\n            return;\n        }\n        const template = jQuery(\"#serviceBubble\").html();\n        if (!id) {\n            id = 'serviceBubble';\n        } else {\n            if (jQuery(\"#\" + id).css(\"height\")) {\n                const pxH = jQuery(\"#\" + id).css(\"height\").replace(\"px\", \"\");\n                if (pxH) {\n                    imgOut.h = pxH;\n                    imgOut.w = jQuery(\"#\" + id).css(\"width\").replace(\"px\", \"\");\n                }\n                \/\/ await sleep(500);\n            } else {\n                console.warn(\"Image's element not existing: \" + id);\n                return;\n            }\n            \/\/ const template = jQuery(\"#serviceBubble\").html();\n            jQuery(\"#\" + id).html(template);\n        }\n        vueServiceBubble[id] = new Vue({\n          el: \"#\" + id,\n          data: {\n                placeType: service.type,\n                placeName: service.name,\n                placeDist: service.dist,\n\n                lat: satImg.lat,\n                lng: satImg.lng,\n                zoom: satImg.zoom,\n                layers: satImg.layers,\n                \n                waitingStuff: true,\n                \n                bbox: {leftdown: {}, rightup: {}},\n\n                h: imgOut.h,\n                w: imgOut.w,\n\n                maxH: window.innerHeight,\n                maxW: window.innerWidth,\n\n                backImg: '',\n                onRestaurants: false,\n                tAdvisor: 'https:\/\/www.tripadvisor.com\/Restaurants',\n                imgAdv: '\/nodejs\/flat-prices\/icons\/tadvisor.png'\n          },\n          mounted() {\n              this.getLatLngBox();\n              const eatThere = ['restaurant', 'cafe'];\n              if (eatThere.indexOf(this.placeType) > -1) {\n                  this.onRestaurants = true;\n              }\n          },\n          methods: {\n              getLatLngBox: async function() {\n                const q = '\/nodejs\/bbox?lng=' + satImg.lng + '&lat=' + satImg.lat + \n                          '&zoom=' + this.zoom + '&h=' + imgOut.h + '&w=' + imgOut.w;\n                  let bbox = 0;\n                  await jQuery.getJSON(q, function(data) {\n                      bbox = data;\n                  });\n                  if (bbox) {\n                      await sleep(1000);\n                      \/\/ Preventing too many calls \/ sec here for node...\n                  }\n                  \/\/ console.info(this.placeType, bbox);\n                  this.bbox = bbox;\n              },\n              bubbleImg(max) {\n                  \/\/ const locs = this.bbox;\n                  const ld = this.bbox.leftdown;\n                  const ru = this.bbox.rightup;\n                  \n                  const server = 'https:\/\/kaart.maaamet.ee\/wms\/';\n                  const fixedArgs = 'REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&FORMAT=image\/png&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&SRS=EPSG:3301&';\n                  const layersOut = 'LAYERS=' + this.layers + '&';\n                  const box = 'BBOX=' + ld.lng + ',' + ld.lat + ',' + ru.lng + ',' + ru.lat + '&'; \/\/541491.80101501,6589457.0255543,541625.95709475,6589616.0160731&';\n                  let sizeOut = 'WIDTH=' + this.w + '&HEIGHT=' + this.h + '&';\n                  if (max) {\n                      sizeOut = 'WIDTH=' + this.maxW + '&HEIGHT=' + this.maxH + '&';\n                  }\n                  const url = server + 'alus?' + fixedArgs + layersOut + box + sizeOut + 'STYLES=';\n                  return url;\n                  \/*\n                  return rootHB + 'genkml.php?url=1&lng=' +lng+ '&lat=' + lat + \n                          '&zoom=' +zoom+ '&layer=' + layers + '&w=' +w+ '&h=' +h;\n                  *\/\n              },\n              openWin(part1, part2) {                  \n                  const title = part1.toUpperCase() + ', ' + part2;\n                  const url = 'https:\/\/tere-tech.eu\/nodejs\/components\/airbrowser.php?layers=airfoto';\n                  const args = 'lat=' + this.lat + '&lng=' + this.lng + \n                              '&zoom=' + this.zoom + '&title=' + title;\n\n                  this.maxH = window.innerHeight;\n                  this.maxW = window.innerWidth;\n                  window.open(url + '&' + args, \"\",\n                                \"width=\" + this.maxW + \",height=\" + this.maxH + \n                                \",location=no\");\n              }\n              \/*\n              bubbleStyle2() {\n                      this.backImg = this.bubbleImg();\n                      return 'background-image: url(' + this.backImg + \n                              '); width: ' + this.w + 'px; height: ' + this.h + 'px;';\n              }\n              *\/\n          },\n      computed: {\n          \/*\n              bubbleStyle() {\n                  if (this.bbox.leftdown.lat > 0) {\n                      this.backImg = this.bubbleImg();\n                      return 'background-image: url(' + this.backImg + \n                              '); width: ' + this.w + 'px; height: ' + this.h + 'px;';\n                  }\n                  return '';\n              },\n              *\/\n              bubbleStyle2() {\n                  if (this.bbox.leftdown.lat > 0) {\n                      this.backImg = this.bubbleImg();\n                      return this.backImg;\n                  }\n                  return '';\n              }\n          }\n      });\n    }\n<\/script>\n\n<style scoped>\n    .bubble_look {\n       display: inline-block; \n       border: 8px inset gray;\n       color: white;\n       font-size: large;\n       text-shadow: 2px 2px blue;\n    }\n    \n    .img-container {\n      position: relative;\n    }\n\n    .overlay-text {\n      position: absolute;\n      top: 0;\n      left: 0;\n      z-index: 2;\n      display: flex;\n      flex-direction: column;\n      align-items: flex-start;\n    }\n\n    .text-line {\n      font-weight: bold;\n      color: white;\n      font-size: 20px;\n      margin-bottom: 5px;\n    }\n\n    .overlay-button {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 2;\n    }\n<\/style><br\/>\n\n<div id='gainsBetterTable'>\n    <div \n         v-show='fullLoaded'> \n    \n        <table v-show='fullLoaded' style=\"display:none\">\n            \n            <tr><td>\n                <span style=\"float:right; font-size: xx-large; display:none\" \n                      v-show='fullLoaded'>\n\n                    <i v-if=\"!subs.length > 0\" class=\"fa fa-spinner fa-pulse fa-3x fa-fw\" \n                       style=\"color:gray; font-size:xx-large\"><\/i>\n\n                    <b style='color: gray; font-size: medium'>\n                        {{ descMenu.toUpperCase() }}<\/b>\n                    <select @change=\"zeroLists()\" \n                             v-model=\"selectArea\">\n                        <option v-for=\"item in subs\" \n                                :value=\"item\"> \n                            {{ item }}\n\n                        <\/option>\n                    <\/select>\n\n                    <span class=\"badge\" \n                          style=\"font-size: x-large; color: gold\">\n                        <b>{{ linesVisible }} {{ descPcs }}<\/b>\n                    <\/span>\n                <\/span>\n            <\/td><\/tr>\n            \n            <tr><td>\n                <b style=\"font-size: large; float:right\">\n                    <input type=\"checkbox\" class=\"rooms_checkbox\"\n                       v-model=\"filterRooms[1]\"> \n                    1 {{ descRooms }}\n                    <input type=\"checkbox\" class=\"rooms_checkbox\"\n                           v-model=\"filterRooms[2]\"> \n                    2 {{ descRooms }}\n                    <input type=\"checkbox\" class=\"rooms_checkbox\"\n                           v-model=\"filterRooms[3]\"> \n                    3 {{ descRooms }}\n                    <input type=\"checkbox\" class=\"rooms_checkbox\"\n                           v-model=\"filterRooms[4]\"> \n                    >3 {{ descRooms }}\n                <\/b>\n            <\/td><\/tr>\n            \n            <tr v-if=\"runError\">\n                <td style=\"font-size: large\">\n                    <b style=\"color:red\">\ud83d\ude41 OOPS! \ud83d\ude41<\/b> \n                    jotain meni nyt pieleen ... \ud83d\ude41 \ud83d\ude41 \ud83d\ude41\n                    <br>\n                    <button @click=\"getList()\"\n                             class=\"btn btn-danger\">\n                        Lataa sivua + dataa t\u00e4st\u00e4 uudelleen !\n                    <\/button>\n                <\/td>\n            <\/tr>\n        <\/table>\n    <\/div>\n\n    <table style='display:none' \n           v-show='fullLoaded'\n           ref=\"priceTable\">\n        <tbody>\n            <tr>\n                <td><\/td><td><\/td>\n                <td style=\"font-size: x-small; text-align: right; color: gray\">\n                    MARKET DATE <br>\n                    {{ date }}\n                <\/td>\n            <\/tr>\n            <tr v-for=\"item in keys\" \n                :key=\"item.key\"\n                v-show=\"item.discounted < 0 && homeVisible(item)\">\n                <td v-show=\"!item.chart\">\n                    <div :id=\" 'flat_' + item.key \" \n                         :style=\"fotoDims\">\n                        [ {{ item.address }} ]\n                    <\/div>\n                    <a target=\"_blank\" href=\"https:\/\/maaamet.ee\/\" \n                       class=\"c-ma-style\">                    \n                        (c) {{ year + 1 }} Maa-amet<\/a>\n                <\/td>\n                <td v-show=\"item.chart\">\n                    <div :id=\" 'chart_' + item.key \" \n                         :style=\"fotoDims\">\n                    <\/div>\n                <\/td>\n                <td style=\"font-size: xx-large; color: #0505bd\">\n                    \n                    <b class=\"home-addr\" :style='scaleSize(item.address)'>\n                        <span class=\"glyphicon glyphicon-home comp-home\"><\/span> \n                        {{ item.address.toUpperCase() }}\n                    <\/b>\n                    \n                    <br\/>\n                    \n                    <img :src=\"alePath + 'ale_years.png'\">\n                    {{ builtYear(item.built) }}<br\/>\n                    \n                    <img :src=\"alePath + 'ale_m2.png'\">\n                    {{ item.m2 }} m2<br\/>\n                    \n                    <img :src=\"alePath + 'ale_rooms.png'\">\n                    {{ item.rooms }} {{ descRooms }}<br\/>\n                    \n                    <img :src=\"alePath + 'ale_floor.png'\">\n                    {{ fixFloors(item.floors) }}<br\/>\n                    \n                    \n                <\/td>\n                <td style=\"font-size: x-large;\" nowrap>\n                    <div class=\"prices_figs\">\n                        <div>\n                    \n                        {{ descSale }}\n                        <\/div>\n                        \n                            \n                        <img v-bind:src=\"alePath + 'price2.png'\" \n                             style=\"width: 60px\">\n                        <b class=\"kpi\">\n                            {{ item.price }} \u20ac <\/b>\n                        <br>\n                        \n                        <b v-show=\"discountsOK\">\n                            <img v-bind:src=\"alePath + 'price2.png'\" \n                                 style=\"width: 60px\">\n                            <span class=\"price-disc\">\n                                <span class=\"glyphicon glyphicon-arrow-down\" \n                                      style=\"color: green;\"><\/span>\n                                ALE {{ showChanges(item) }}\n                            \n                                <sup class=\"price-disc-prcnt\">\n                                    {{ showChanges(item, true) }} %\n                                    \n                                    <b v-if='showChanges(item, true) <= -10' \n                                       style=\"color: yellow; font-size: large\">\n                                        <span class=\"glyphicon glyphicon-star\"><\/span>\n                                    <\/b>\n                                <\/sup>\n                            <\/span>\n                            <br>\n                        <\/b>\n                        \n                        <img v-bind:src=\"alePath + 'price2.png'\" \n                             style=\"width: 60px\">\n                        \/\n                        <img v-bind:src=\"alePath + 'ale_m2.png'\" \n                             width=\"38\">\n                        <span style=\"font-size: medium\">\n                            {{ (item.price \/ item.m2).toFixed(2) }} \u20ac\/m2\n                        <\/span>\n                    <\/div>\n\n                    <div class=\"gains_figs\" style=\"display:none\">\n                        <p>\n                            {{ descGain }} \n                            \n                            \n                            <button class=\"btn btn-success style_gmail\" \n                               @click=\"getMailLink(item)\" \n                               :title=\"descMail\" \n                               target=\"_blank\">\n                                <span class=\"style_gmail2\">\n                                    <svg style=\"display:block;\" \n                                         focusable=\"false\" \n                                         aria-hidden=\"true\" \n                                         xmlns=\"http:\/\/www.w3.org\/2000\/svg\" \n                                         width=\"100%\" \n                                         height=\"100%\" \n                                         viewBox=\"0 0 32 32\">\n                                        <path fill=\"white\" d=\"M2.902 6.223h26.195v19.554H2.902z\"><\/path>\n                                        <path fill=\"#E14C41\" \n                                              class=\"\" \n                                              d=\"M2.902 25.777h26.195V6.223H2.902v19.554zm22.44-4.007v3.806H6.955v-3.6h.032l.093-.034 6.9-5.558 2.09 1.77 1.854-1.63 7.42 5.246zm0-.672l-7.027-4.917 7.028-6.09V21.1zm-1.17-14.67l-.947.905c-2.356 2.284-4.693 4.75-7.17 6.876l-.078.06L8.062 6.39l16.11.033zm-10.597 9.61l-6.62 5.294.016-10.914 6.607 5.62\">                                        \n                                        <\/path>\n                                    <\/svg>\n                                <\/span>\n                            <\/button>\n                        <\/p>\n                        \n                        <div>\n                            <img v-bind:src=\"alePath + 'c_bag.png'\">\n                            \/\n                            <img v-bind:src=\"alePath + 'ale_years.png'\" width=\"16\">\n                            <b>\n                                +{{ Math.round(item.gainOfWeek \/ 7) }} \u20ac\/{{ descUnit2 }} \n                                ({{ (gainPrcnt(item, true) \/ 7).toFixed(1) }}%)\n                            <\/b>\n                        <\/div>\n                        \n                        <div>\n                            <img v-bind:src=\"alePath + 'c_bag.png'\">\n                            \/\n                            <img v-bind:src=\"alePath + 'ale_years.png'\" width=\"24\">\n                            <b>\n                                +{{ item.gainOfWeek }} \u20ac\/{{ descUnit1 }} \n                                ( {{ Math.round(gainPrcnt(item, true)) }}%\n                                <span v-show=\"gainPrcnt(item, 1) === maxWeekly\">\n                                    <span class=\"glyphicon glyphicon-certificate bestGainers\"><\/span>\n                                <\/span>\n                                )\n                            <\/b>\n                        <\/div>\n                        \n                    <\/div>\n                <\/td>\n                <td>\n                    <div>                        \n                            <button @click=\"goHB(item)\" \n                                    class=\"btn btn-info\" \n                                    style=\"cursor:pointer; float:right;\" \n                                    :title=\"descHB\"> \n                                <img :src=\"alePath + 'hawk_small.png'\" \n                                     style=\"width:36px; height:36px\">\n                                <span class=\"glyphicon glyphicon-new-window pop-up-butt\"><\/span>\n                            <\/button>\n                        <br> \n                            <button @click=\"goPortal(item)\" \n                                    class=\"btn btn-success\" \n                                    style=\"cursor:pointer; float:right;\" \n                                    v-bind:title=\"descLink\"> \n                                <img style=\"width: 32px; height: 32px; padding: 4px\" \n                                     :src=\"alePath + 'kv.gif'\"> \n                                <span class=\"glyphicon glyphicon-new-window pop-up-butt\"><\/span>\n                            <\/button>\n                        <\/div>\n                <\/td>\n            <\/tr>\n        <\/tbody>\n    <\/table>\n<\/div>\n\n<!-- <\/template> -->\n\n<script>\n    \/\/ Shows & calculates gains tables of NEW home sales for each area when asked in WP dynamic page.\n    \n    myBorders = {};\n    userInfo = {};\n    \n    async function gainsTable(data, areas) {\n    \/*\n        if (!data) {\n            console.error('No gains data given for its table !');\n            return;\n        }\n        let gainers = data.changeAmounts.gainMore;\n        gainers = gainers.concat(data.newSales);\n        let subsF = {};\n        let keys = [];\n        console.info(gainers);\n        for (let i in gainers) {\n            const sub = gainers[i].area;\n            subsF[sub + data.date] = 1;\n            if (typeof keys[sub] === 'undefined') {\n                keys[sub] = [];\n            }\n            const k = gainers[i].key;\n            keys.push(k);\n        }\n        const files = Object.keys(subsF);\n        const qData = {date: data.date, areas: files, keys: keys};\n        console.info('Going out for indexed homes ...');\n        homes = 0;\n        await jQuery.post(\"\/nodejs\/keys2offers\/\", qData, function(list) {\n              homes = list;\n              console.log(homes);\n        }, \"json\");\n        \n        if (typeof homes !== 'object') {\n            console.warn('Failed to fetch gains table: ', homes);\n            return; \n        }\n        *\/\n        \/\/ Some globals for WP page.\n        userInfo = await getUserInfo();\n        \/\/ myBorders = await getAllBorders('Tallinn', 1);\n\n        vueGainTable = new Vue({\n          el: \"#gainsBetterTable\",\n          data: {\n              date: '____',\n              dateBefore: '',\n              \n              discountsOK: false,\n              domain: window.location.protocol + '\/\/' + window.location.host,\n              mainTitle: getMsg(1249),\n              subs: [], \/\/ areas,\n              chartData: data,\n\n              fullLoaded: false,\n              hasRights: false,\n              inFiles: '', \/\/files,\n              filterRooms: [0, 0, 1, 0, 0],\n              \n              fotoDims: 'width: 440px; height: 380px; background-color: #EEE',\n              \n              showAll: false,\n              homeDetails: [],\n              \n              homePcs: {},\n              linesVisible: 0,\n              \n              roomsPcs: {},\n              pcsUpdated: {},\n              pcsNew: {},\n              \/\/ gainsCharts: {},\n              allCharts: false,\n              \n              selectArea: 'Kesklinn',\n              alePath: '\/nodejs\/flat-prices\/icons\/',\n              \n              descMenu: getMsg(1287), \/\/ getMsg(1245),\n              descSelect: getMsg(1246), \/\/ ***\n              descPcs: getMsg(480),\n              \n              descLink: getMsg(221),\n              descHB: getMsg(1233),\n              descRooms: getMsg(1234),\n              descHome: getMsg(1235),\n              descStatus: getMsg(1236), \n              \n              descMore: getMsg(1230),\n              descNewOnes: getMsg(1232),\n              \n              descAct2: getMsg(1237),\n              descAct1:  getMsg(1238),\n              descMail: getMsg(1286),\n              \n              descSale: getMsg(1285), \/\/getMsg(1239),\n              descGain: getMsg(1240),\n              \n              descJoin: getMsg(1241),\n              descCheck: getMsg(1242),\n              \n              descUnit1: getMsg(1243),\n              descUnit2: getMsg(1244),\n              \n              keys: {},\n              \n              homeDetailsVisible: false,\n              \n              zoom: 0.22, \n              layers: 'of10000',\n              \n              imgList: {},\n              imgList2: [],\n              \n              fotoDown: 0,\n              salesInTable: 0,\n              \n              borders: {},\n              \n              maxWeekly: 0,\n              maxAll: 0,\n              \n              runError: false,\n              \n              fotosDone: {}\n          },\n          mounted() {\n              \/\/ this.borders = myBorders;\n              \/\/ let homes = [];\n              this.setHomes([]);\n              this.fullLoaded = true;\n              \n              \/\/ this.getFotos();\n          },\n          beforeUpdate() {\n              this.salesInTable = 0;\n          },\n          updated() {\n              let visibles = [];\n              for (let k in this.keys) {\n                  const h = this.keys[k];\n                  if (h.discounted < 0 && this.homeVisible(h)) {\n                      visibles.push(h);\n                  }\n              }\n              this.homePcs[this.selectArea] = visibles.length;\n              this.linesVisible = visibles.length;\n              \/\/ console.info('IN TABLE: ', visibles);\n              this.getFotos2(visibles);\n          },\n          methods: {\n              getDate: async function() {\n                    const q = rootHB + 'get_dates.php?count=2';\n                    const response = await fetch(q);\n                    const dates = await response.json();\n                    this.date = dates.pop();\n                    this.dateBefore = dates.pop();\n              },\n              setHomes: async function(newOnes) {\n                  this.borders = await getAllBorders('Tallinn', 1);\n\n                  await this.getList();\n                  await sleep(4000);\n                  this.getDate();\n                  \n                  \/\/ await this.getDownMoves();\n                  \n                  \/*\n                  let minPcs = 1000;\n                  let homesNew = [];\n                  for (let sub in newOnes) {\n                      \/\/ let cH = homes;\n                      homesNew = homesNew.concat(newOnes[sub]);\n                      if (newOnes[sub].length < minPcs) {\n                          minPcs = newOnes[sub].length;\n                          this.selectArea = sub;\n                      }\n                      this.homePcs[sub] = newOnes[sub].length;\n                      if (this.subs.indexOf(sub) === -1) {\n                          this.subs.push(sub);\n                      }\n                      this.roomsPcs[sub] = {};\n                  }\n                  this.indexTable(homesNew);\n                  *\/\n                  \n                  \/\/ this.homeDetails = homesNew;\n                  \/\/ this.homeDetailsVisible = true;\n                  \/\/ jQuery(\"#gainsBetterTable\").css(\"display\", \"block\");\n              },\n              homeVisible(item) {\n                  if (typeof item !== 'object') {\n                      return false;\n                  }\n                  if (this.selectArea === item.town_area && \n                          \/\/ this.inArea(item) && \n                          this.checkRooms(item.rooms)) {\n                      return true;\n                  }\n                  return false;\n              },\n              getFotos2: async function(imgList) {\n                  if (!imgList.length) {\n                      return;\n                  }\n                  await sleep(3000);\n                  const everyPcs = 5;\n                  const imgOut = {h: 0, w: 0};\n                  let satImg = {lat: 0, lng: 0, \n                                zoom: this.zoom, layers: this.layers};\n                  let service = {type: '', name: '', dist: ''};\n                  console.info('Getting next fotos: ' + imgList.length);\n                  for (let i in imgList) {\n                      const id = 'flat_' + imgList[i].key;\n                      if (!this.fotosDone[id]) {\n                          this.fotosDone[id] = 1;\n                      \n                          const poi = imgList[i].poi;\n                          satImg.lat = poi.lat;\n                          satImg.lng = poi.lon;\n\n                          service.type = imgList[i].address;\n                          service.name = imgList[i].town_area;\n\n                          console.info('New Foto(s): ' + id);\n                          newServiceBubble(service, satImg, imgOut, id);\n\n                          this.fotoDown++;\n                          if (this.fotoDown % everyPcs === 0) {\n                              console.info('SLEEP ...', this.fotoDown);\n                              await sleep(2000);\n                          }\n                      }\n                  }\n              },\n              pushImg(poi, key, addr, area) {\n                  if (!poi) {\n                      return '';\n                  }\n                  this.salesInTable++;\n                  this.imgList['flat_' + key] = [addr, area, poi];\n                  return '';\n              },\n              getFotos: async function() {\n                  if (this.imgList === {}) {\n                      return;\n                  }\n                  const everyPcs = 5;\n                  const imgOut = {h: 0, w: 0};\n                  let satImg = {lat: 0, lng: 0, \n                                zoom: this.zoom, layers: this.layers};\n                  let service = {type: '', name: '', dist: ''};\n                  for (let id in this.imgList) {\n                      const poi = this.imgList[id][2];\n                      satImg.lat = poi.lat;\n                      satImg.lng = poi.lon;\n                      \n                      service.type = this.imgList[id][0];\n                      service.name = this.imgList[id][1];\n\n                      newServiceBubble(service, satImg, imgOut, id);\n                      \n                      this.fotoDown++;\n                      if (this.fotoDown % everyPcs === 0) {\n                          console.info('SLEEP ...', this.fotoDown);\n                          await sleep(2000);\n                      }\n                  }\n                  \/\/ await nextTick();\n                  \/\/ this.homePcs[this.selectArea] = this.salesInTable;\n              },\n              checkRooms(nro) {\n                  if (nro < 4) {\n                      return this.filterRooms[nro];\n                  }\n                  return this.filterRooms[4];\n              },\n              showChart(key, street) {\n                  \/\/ console.info(this.keys[key].chart);\n                  if (this.keys[key].chartDone) {\n                      return;\n                  }\n                  let that = this;\n                  const q = '\/nodejs\/gains_of_sale?k=' + key + '&s=' + this.selectArea;\n                  jQuery.getJSON(q, function(events) {\n                      console.info(events);\n                      that.keys[key].chartDone = true;\n                      const id = 'chart_' + key;\n                        let myEChart = new hbEcharts(id);\n                        myEChart.gainsChart(\n                          street,\n                          'Price',\n                          'Gain',\n                          events.sales.dates,\n                          events.sales.prices,\n                          events.gains,\n                          '\u20ac'\n                        );\n                  });\n              },\n              getImg(poi, id, addr, area) {\n                  if (!(poi.lat > 0 && poi.lon > 0)) {\n                      return '';\n                  }                  \n                    const satImg = {lat: poi.lat, lng: poi.lon, \n                                    zoom: this.zoom, layers: this.layers};\n                    const imgOut = {h: 200, w: 200};\n                    const service = {type: addr, name: area, dist: ''};\n                    \/\/ newServiceBubble(service, satImg, imgOut, 'flat_' + id);\n                    return '';\n              },\n              indexTable(homes) { \n                  \/\/ let toHome = {}; \n                  for (let h in homes) {\n                      this.keys[homes[h].key] = homes[h];\n                      \/\/ this.statRooms(homes[h]);\n                  }\n                  return;\n                  \n                  let weeklyMoves = this.chartData.changeAmounts.gainMore;\n                  console.info('Updated', weeklyMoves);\n                  for (let i in weeklyMoves) {\n                      const key = weeklyMoves[i].key;\n                      \/\/ console.info(key);\n                      if (typeof this.keys[key] === 'object') {\n                          this.keys[key].gain = -weeklyMoves[i].to;\n                          this.keys[key].gainOfWeek = weeklyMoves[i].diff;\n                          this.keys[key].chart = false;\n                          this.keys[key].chartDone = false;\n                          this.updatePcs(this.pcsUpdated, weeklyMoves[i].area);\n                      } else {\n                          console.warn('Not home found for key: ', key);\n                      }\n                      \/\/ this.gainsCharts[key] = false;\n                  }\n                  weeklyMoves = this.chartData.newSales;\n                  console.info('New', weeklyMoves);\n                  for (let i in weeklyMoves) {\n                      const key = weeklyMoves[i].key;\n                      if (typeof this.keys[key] === 'object') {\n                          this.keys[key].gain = -weeklyMoves[i].to;\n                          this.keys[key].gainOfWeek = this.keys[key].gain;\n                          this.keys[key].chart = false;\n                          this.keys[key].chartDone = false;\n                          this.keys[key].newbie = true;\n                          this.updatePcs(this.pcsNew, weeklyMoves[i].area);\n                      } else {\n                          console.warn('Not home found for key: ', key);\n                      }\n                  }\n              },\n              updatePcs(arr, sub) {\n                  if (typeof arr[sub] !== 'number') {\n                      arr[sub] = 0;\n                  }\n                  arr[sub]++;\n              },\n              statRooms(home) {\n                  const sub = home.town_area;\n                  const rooms = home.rooms;\n                  if (typeof this.roomsPcs[sub][rooms] !== 'number') {\n                      this.roomsPcs[sub][rooms] = 0;\n                  }\n                  this.roomsPcs[sub][rooms]++;                  \n              },\n              countsOfActive(sub) {\n                  let sum = 0;\n          return 0;\n          \/\/ TODO: this should return count of homes from selected area based on full set of homes.\n                  const filters = this.filterRooms;\n                  for (let r in filters) {\n                      if (filters[r] && this.roomsPcs[sub][r] > 0) {\n                          sum = sum + this.roomsPcs[sub][r];\n                      }\n                  }\n                  return sum;\n              },\n              builtYear(nro) {\n                  if (+nro > 1000) {\n                      return nro;\n                  }\n                  return '';\n              },\n              fixFloors(floorStr) {\n                  if (typeof floorStr !== 'string') {\n                      return floorStr;\n                  }\n                  const pair = floorStr.split('\/');\n                  if (pair.length === 2) {\n                      if (+pair[0] > +pair[1]) {\n                          return pair[1] + '\/' + pair[0];\n                      }\n                  }\n                  return floorStr;\n              },\n              gainPrcnt(item, weekly) {\n                  let gainW = 0;\n                  if (weekly) {\n                      gainW = this.prcntIt(+item.gainOfWeek, item.price);\n                      if (gainW > this.maxWeekly) {\n                          this.maxWeekly = gainW;\n                      }\n                  } else {\n                      \/\/ gainW = +item.gain;\n                      gainW = this.prcntIt(+item.gain, item.price);\n                      if (gainW > this.maxAll) {\n                          this.maxAll = gainW;\n                      }\n                  }\n                  \/\/ let prcnt = Math.round(100 * gainW \/ (item.price));\n                  return gainW;\n              },\n              prcntIt(from, total) {\n                  return 100 * from \/ (total);\n              },\n              gainClusionMsg(pChange) {\n                    if (+pChange < 0) {\n                        return getMsg(1248);\n                    }\n                    return getMsg(1247);\n                },\n              goPortal(home) {\n                  if (home.linkID) {\n                    urlX = \"https:\/\/www.kv.ee\/\" + home.linkID;\n                    window.open(urlX);\n                    return;\n                }\n                link2flat(home.address, +home.m2, +home.price);\n              },\n              goHB(saleOfHome) {\n                  const lat = saleOfHome.poi.lat;\n                  const lng = saleOfHome.poi.lon;\n                  const k = saleOfHome.key;\n                  const sub = saleOfHome.town_area;\n                  const url = this.domain + '\/balticfinns\/hb.php?k=' + k + \n                              '&sub=' + sub + '&d=' + this.date;\n                  \/\/ const url = this.domain + '\/balticfinns\/hb.php#18\/' + lat + '\/' + lng;\n                          \/\/ '\/' + this.date + '\/' + k;\n                  window.open(url);\n              },\n              \/\/ Setting better font size for longer home's address.\n              scaleSize(street) {\n                  if (street.length <= 10) {\n                      return '';\n                  }\n                  if (street.length <= 15) {\n                      return 'font-size:medium';\n                  }\n                  return 'font-size:small';\n              },\n              switchGain(item) {\n                  this.keys[item.key].chart = !this.keys[item.key].chart;\n                  this.showChart(item.key, item.address);\n              },\n              inArea(sale) {\n                  if (typeof sale.poi !== 'object') {\n                      console.warn('Not lat & lng found', sale);\n                      return false;\n                  }\n                  const latLng = [sale.poi.lat, sale.poi.lon];\n                  if (vueDB.inside(latLng, this.selectArea)) {\n                      return true;\n                  }\n                  console.warn('Home was dropped from table', sale.address.toUpperCase(), latLng);\n                  this.findItsArea(sale, latLng);\n                  return false;\n              },\n              findItsArea: async function(sale, poi) {\n                  const addr = sale.address.toUpperCase();\n                  for (let sub in this.borders) {\n                      if (vueDB.inside(poi, sub)) {\n                          console.warn(addr + ' sale belongs to area ' + sub);\n                      }\n                  }\n              },\n            genHome(active) {\n                \/\/ return {};\n        \n                active.bidTotal = active.price + active.gain;\n                  const poi = {lat: active.poi.lat, lng: active.poi.lng, lon: active.poi.lng};\n                  const h = {address: active.address, town_area: this.town_area,\n                          bid: active.bidTotal, gain: active.bidTotal,\n                          m2: active.m2, size: active.m2, rooms: active.rooms,\n                          built: active.built, floors: active.floors,\n                          material: active.material, key: \"-\", \n                          date: this.date, poi: poi};\n                  return h;\n                  \n              },\n              zeroLists() {\n                  this.imgList = {};\n                  this.maxWeekly = 0;\n                  this.maxAll = 0;\n                  this.fotosDone = {};\n              },\n              makeTheBid(item) {\n                  \/*\n                  ccc.login(userInfo, 0); \n                  ccc.setHome(this.genHome(item), 1); \n                  vueHB.hideAllControls();\n                  *\/\n              },\n              getMailLink(sale) {\n                  const mailer = 'https:\/\/mail.google.com\/mail\/u\/0\/';\n                  const subject = 'Edullinen+ja+kannattava+asuntomyynti:+' + \n                          sale.address + '+(' + sale.rooms + 'H. ' + sale.price + '+euro)';\n                  const script = window.location.host + '\/balticfinns\/hb.php';\n                  const url = script + '?k=' + sale.key + \n                          '%26sub=' + sale.town_area + '%26d=' + this.date;\n                  const body = 'Link:' + url;\n                  const act = mailer + '?ui=2&fs=1&tf=cm&su=' + subject + '&body=' + body;\n                  window.open(act);\n                  return act;\n                },\n                joinIn() {\n                    console.info('Go to join member page !');\n                    const reDir = '\/balticfinns\/index.php\/ne-edullisemmat-asunnot-alueineen\/';\n                    const url = 'https:\/\/tere-tech.eu\/balticfinns\/wp-login.php?redirect_to=' + reDir;\n                    window.open(url);\n                },\n                getList: async function() {\n                    this.runError = false;\n                    this.year = (new Date().getFullYear() - 1);\n                    this.query = rootHB + \"gen_stats.php?new=\" + this.year;\n                    \n                    let that = this;\n                    let dataIn = {};\n                    try {\n                        await jQuery.getJSON(this.query, function (stats) {\n                            dataIn = stats;\n                            that.newbies = dataIn;\n                            that.getDownMoves();\n                        });\n                    } catch(err) {\n                        console.error(err);\n                        this.runError = true;\n                    }\n                    \/\/ await this.getDownMoves();\n                    \/\/ this.newbies = dataIn;\n                    this.getSubs();\n                    \/\/ this.collectHomes();\n                    this.indexTable(this.collectHomes());\n                    \n                    return dataIn;\n                },\n                getSubs() {\n                    const subs = [];\n                    for (let s in this.newbies.subs) {\n                        if (+this.newbies.subs[s] > 0) {\n                            subs.push(s);\n                        }\n                    }\n                    this.subs = subs;\n                },\n                collectHomes() {\n                    let homes = [];\n                    for (let addr in this.newbies.offers) {\n                        const house = this.newbies.offers[addr];\n                        for (let i in house) {\n                            const h = house[i];\n                            house[i].poi = {lat: h.lat, lon: h.lng};\n                            homes.push(house[i]);\n                        }\n                    }\n                    this.homeDetails = homes;\n                    this.homeDetailsVisible = true;\n                    \n                    return this.homeDetails;\n                },\n                updateDics() {\n                    if (!this.discountsOK) {\n                        this.runError = true;\n                        console.warn('?? No discounts data received from server.');\n                        return;\n                    }\n                    const discounts = this.downNewbies;\n                    for (let h in this.homeDetails) {\n                        const key = this.homeDetails[h].key;\n                        if (discounts[key]) {\n                            this.homeDetails[h].discounted = -discounts[key][1];\n                            \/\/ console.info('!! ALE home: ', this.homeDetails[h]);\n                        }\n                    }\n                },\n                showChanges(item, prcnt) {\n                    const before = item.price - item.discounted;\n                    if (prcnt) {\n                        const prcnt = 100 * item.discounted \/ before;\n                        return prcnt.toFixed(0);\n                    }\n                    return item.discounted + '\u20ac ';\n                },\n                getDownMoves: async function() {\n                      if (!this.newbies) {\n                          console.error('Newbies fetch not ended yet!');\n                          return;\n                      }\n                      const downQ = '&downOnly=1';\n                      \/\/ this.query = \"\/nodejs\/flat-prices\/gen_stats.php?new=\";\n                      let dataIn = {};\n                      \/\/ await sleep(3000);\n                      let ok = false;\n                      try {\n                          await jQuery.getJSON(this.query + downQ, function (downHomes) {\n                                dataIn = downHomes;\n                                if (typeof dataIn === 'object') {\n                                    ok = true;\n                                }\n                          });\n                      } catch(err) {\n                          console.error('?? No data received in time.', err);\n                      }\n                      this.downNewbies = dataIn;\n                      this.discountsOK = ok;\n                      this.updateDics();\n                      \n                      this.downCounts = 0;\n                      \n                      return;\n\n                      const indPrice = 0;\n                      const indDiscount = 1;\n                      const indFlat = 2;\n                      const sep = '<br\/>';\n\n                      for (let addr in this.houses) {\n                          let max = 0;\n                          \n                          let price = 0;\n                          \n                          let move = 0;\n                          let prcnt = 0;\n\n                          for (let home in this.houses[addr]) {\n                              let h = this.houses[addr][home];\n                              const key = h.key;\n                              const rec = dataIn[h.key];\n                              if (rec && +h.m2 > 5) {\n                                  this.downMoves[addr] = rec;\n                                  move = rec[indDiscount];\n                                  h.discounted = move;\n                                  if (+move === 0) {\n                                      if (!this.homesNew[addr]) {\n                                          this.homesNew[addr] = [];\n                                      }\n                                      \/\/ h.discounted = -1;\n                                      h.newSale = 1;\n                                      this.homesNew[addr].push(h);\n                                  } else\n                                  if (move > max) {\n                                      max = move;\n                                      price = rec[indPrice];\n                                      \/\/ street = rec[indFlat];\n                                      const p = (100 * move \/ (price + move));\n                                      prcnt = p.toFixed(0);\n                                      \/\/ Show +1 decimals if rounded prcnt < 0 before\n                                      if (+prcnt === 0) {\n                                          prcnt = p.toFixed(1);\n                                      }\n                                      \/\/ this.discounts[addr] = prcnt;\n\n                                      \/\/ Map & store house's max discounted homes for later use.\n                                      this.maxDowns[addr] = this.houses[addr][home];\n                                      this.maxDowns[addr].discPrcnt = '-' + prcnt;\n\n                                      this.downCounts++;\n                                  }\n                              }\n                          }\n                          if (prcnt) {\n                              \/\/ console.info(this.maxDowns[addr]);\n                              \/\/ this.maxDowns[addr] = this.houses[addr][home];\n                              \n                              this.discounts[addr] = prcnt;\n                              \n                              \/*\n\n                              \/\/ Composing BootStrap's tooltip's for each bubble of house.\n                              const h = this.maxDowns[addr];\n                              msg = '<b>-' + h.discounted + this.unit + \n                                      ' <b class=\"down-prcnt-2\">' + \n                                          h.discPrcnt + '%<\/b><\/b>' +\n                                      sep + '<b class=\"down-price\">' + \n                                          h.price + ' ' + this.unit + '<\/b>' +\n                                      sep + '<b class=\"home-address\">' + \n                                          h.address + \n                                      sep + h.m2 + ' m2<\/b>';\n\n                              this.downTle[addr] = '<div class=\"ico-title\">' + msg + '<\/div>';\n                              *\/\n                          }\n                      }\n                      \/\/ this.$forceUpdate();\n                  }\n          },\n          computed: {\n              \n                enoughRights() {\n                    if (userLevel('administrator') || userLevel('house_developer') || \n                          userLevel('home_buyer') || userLevel('home_seller')) {\n                              return true;\n                    }\n                    return false;\n                }\n          }\n        });\n    }\n\ngainsTable({}, []);\n\n    async function getUserInfo() {\n            const q = rootHB + 'components\/newbiesWP\/user_info.php';\n            const response = await fetch(q);\n            const data = await response.json();\n            return data;\n        };\n    \n    async function getAllBorders(city, only) {\n      let query = rootHB + \"get_borders.php?city=\" + city;\n      if (only) {\n          query = query + \"&only=1\";\n      }\n      let borders = {};\n      await jQuery.getJSON(query, function (data) {\n        borders = data;\n      });\n      return borders;\n    }\n\n<\/script>\n\n<style scoped>\n    .prices_figs {\n        color: darkred;\n        background-color: #ffd392;\n        text-shadow: 1px 2px black;\n        border: 5px outset gray;\n    }\n    .gains_figs {\n        color: green;\n        background-color: #adf9ad;\n        text-shadow: 2px 1px black;\n        border: 5px outset gray;\n    }\n    .kpi {\n        border: 4px double navy; \n        font-size: x-large; \n        padding: 4px;\n        border-radius: 8px;\n    }\n    .gain_group {\n        padding:6px;\n        border: 1px solid black;\n        font-size: xx-large;\n    }\n    .bestGainers {\n        color: lime;\n        font-size: large;\n        text-shadow: 2px 3px darkgreen;\n    }\n    .mem_butt {\n        font-size: medium; \n        color: white; \n    }\n    .gain_checkbox {\n        width: 30px; \n        height: 30px;\n    } \n    .rooms_checkbox {\n        width: 20px; \n        height: 20px;\n    }\n    .style_gmail {\n        float:right;\n    }\n    .style_gmail2 {\n        background-color:#5cb85c;\n        width:24px;\n        height:24px;\n        margin: 4px;\n        border: 1px solid white;\n        display:inline-block;\n        overflow:hidden;\n    }\n    .price-disc {\n        font-size: x-large;\n        padding: 4px;\n        background-color: gold;\n        color: red;\n        margin: 4px;\n        border: 6px dashed red;\n    }\n    .price-disc-prcnt {\n        font-size: medium;\n        background-color: red;\n        color: gold;\n        margin: 4px;\n        padding: 2px;\n        border: 1px solid darkred;\n    }\n    .home-addr {\n        color: white;\n        background-color: navy;\n        font-size: x-large;\n        padding: 4px;\n    }\n    .comp-home {\n        color: gold; \n        font-size: x-large;\n        font-weight: bold;\n    }\n    .c-ma-style {\n        font-size: x-small;\n    }\n    .pop-up-butt {\n        font-size: large; \n        color: navy; \n        padding: 4px;\n    }\n<\/style>\n\n\n\n<h3 class=\"wp-block-heading\">Kaikki uusien kotien l\u00f6yd\u00f6t talteen arvonm\u00e4\u00e4rityksell\u00e4<\/h3>\n\n\n\n<p class=\"has-electric-grass-gradient-background has-background\"><strong>Automatisoitu tekninen arvonm\u00e4\u00e4ritys<\/strong> on ulottuvillasia my\u00f6s <em>AIVAN KAIKISTA uusista myyntikodeista<\/em> Tallinnaan kotiselaimen kautta. L\u00f6yd\u00e4t t\u00e4ysin <strong>neutraalin &amp; puolueettoman markkina-arvion<\/strong> kautta kuinka hyvi\u00e4 asuntotarjoukset ovat niiden l\u00e4himarkkinoillaan. Kokeile vaikka t\u00e4n\u00e4\u00e4n &amp; <strong>avaa markkinat t\u00e4\u00e4lt\u00e4:<\/strong><\/p>\n\n\n\n<table class=\"announcement\"  style=\"text-shadow:1px 1px navy; font-size: large\" ><tr><td><ul><li><a class=\"noteitem\" href=\"\/balticfinns\/hb.php\" target=\"_blank\"><img src=\"\/balticfinns\/wp-content\/plugins\/flat-prices\/icons\/hawk_small.png\" > HOME BROWSER | KOTISELAIN<\/a><\/li><\/ul><\/td><td><a href=\"\/balticfinns\/wp-login.php?redirect_to=hb.php\" target=\"_blank\"><span class=\"glyphicon glyphicon-log-in\" style=\"font-size:xx-large; color:navy\"><\/span><\/a><\/td><\/tr><\/table><div style=\"text-align: center\">\n    <b>\n        <a href=\"mailto:info@tere-tech.com\">\n            <span class=\"glyphicon glyphicon-envelope\" style=\"font-size:x-large\"><\/span> \n            info@tere-tech.com\n        <\/a>\n    <\/b>\n<\/div>\n\n\n\n\n<p class=\"has-luminous-dusk-gradient-background has-background has-medium-font-size\"><strong>Anna hyv\u00e4n kiert\u00e4\u00e4 &amp; jaa toki t\u00e4m\u00e4 kiva ostajan vinkkilista SOME:sta yst\u00e4villesi alta.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tallinnan PARHAAT UUSIEN KOTIEN ALE :t l\u00f6yd\u00e4t t\u00e4\u00e4lt\u00e4 AINA TUOREINA ! Parhaat viikkomuutokset hinnoissa T\u00e4st\u00e4 l\u00f6yd\u00e4t aivan automaattisesti tarjouksina ne ALEntuneet uudet kodit + voit valita sek\u00e4 asuinalueen ett\u00e4 huoneiden lkm oman kiinnostuksen mukaan. Talokuvista napauttamalla p\u00e4\u00e4set my\u00f6s mukavasti vilkaisemaan suoraan l\u00e4hi- &amp; aluepalveluita tarkemmin kullekin myyntikodille. Kaikki uusien kotien l\u00f6yd\u00f6t talteen arvonm\u00e4\u00e4rityksell\u00e4 Automatisoitu tekninen &#8230; <a title=\"Uudistuotannon tuoreimmmat ALEnnukset\" class=\"read-more\" href=\"https:\/\/tere-tech.eu\/balticfinns\/index.php\/uudistuotannon-tuoreimmmat-alennukset\/\" aria-label=\"Lue lis\u00e4\u00e4 aiheesta Uudistuotannon tuoreimmmat ALEnnukset\">Lue lis\u00e4\u00e4<\/a><\/p>\n","protected":false},"author":1,"featured_media":87612,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"_links":{"self":[{"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/pages\/87570"}],"collection":[{"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/comments?post=87570"}],"version-history":[{"count":28,"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/pages\/87570\/revisions"}],"predecessor-version":[{"id":87610,"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/pages\/87570\/revisions\/87610"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/media\/87612"}],"wp:attachment":[{"href":"https:\/\/tere-tech.eu\/balticfinns\/index.php\/wp-json\/wp\/v2\/media?parent=87570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}