CINXE.COM

EU-perusteos, 2. uudistettu laitos – UM julkaisupalvelut

<!doctype html> <html lang="fi" class="no-js" itemscope itemtype="http://schema.org/WebPage"> <head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=HxkREWBo" charset="utf-8"></script> <script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("https://web.archive.org/web"); __wm.wombat("https://julkaisut.um.fi/products/eu-perusteos-2-uudistettu-laitos","20231121174249","https://web.archive.org/","web","/_static/", "1700588569"); </script> <link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" /> <link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <script type="application/vnd.locksmith+json" data-locksmith>{"version":"v38","locked":false,"initialized":true,"scope":"product","access_granted":true,"access_denied":false,"requires_customer":false,"manual_lock":false,"remote_lock":false,"has_timeout":false,"remote_rendered":null,"hide_resource":false,"hide_links_to_resource":false,"transparent":true,"locks":{"all":[],"opened":[]},"keys":[],"keys_signature":"a01a4dfcdb1d084dcaa180fa67ab0844ddcf9982986155db462e143cf2df5360","state":{"template":"product","theme":79529541683,"product":"eu-perusteos-2-uudistettu-laitos","collection":null,"page":null,"blog":null,"article":null,"app":null},"now":1700588566,"path":"\/products\/eu-perusteos-2-uudistettu-laitos","locale_root_url":"\/","canonical_url":"https:\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/products\/eu-perusteos-2-uudistettu-laitos","customer_id":null,"customer_id_signature":"a01a4dfcdb1d084dcaa180fa67ab0844ddcf9982986155db462e143cf2df5360","cart":null}</script><script data-locksmith>!function(){var require=undefined,reqwest=function(){function succeed(e){var t=protocolRe.exec(e.url);return t=t&&t[1]||context.location.protocol,httpsRe.test(t)?twoHundo.test(e.request.status):!!e.request.response}function handleReadyState(e,t,n){return function(){return e._aborted?n(e.request):e._timedOut?n(e.request,"Request is aborted: timeout"):void(e.request&&4==e.request[readyState]&&(e.request.onreadystatechange=noop,succeed(e)?t(e.request):n(e.request)))}}function setHeaders(e,t){var n,s=t.headers||{};s.Accept=s.Accept||defaultHeaders.accept[t.type]||defaultHeaders.accept["*"];var r="undefined"!=typeof FormData&&t.data instanceof FormData;for(n in!t.crossOrigin&&!s[requestedWith]&&(s[requestedWith]=defaultHeaders.requestedWith),!s[contentType]&&!r&&(s[contentType]=t.contentType||defaultHeaders.contentType),s)s.hasOwnProperty(n)&&"setRequestHeader"in e&&e.setRequestHeader(n,s[n])}function setCredentials(e,t){"undefined"!=typeof t.withCredentials&&"undefined"!=typeof e.withCredentials&&(e.withCredentials=!!t.withCredentials)}function generalCallback(e){lastValue=e}function urlappend(e,t){return e+(/[?]/.test(e)?"&":"?")+t}function handleJsonp(e,t,n,s){var r=uniqid++,o=e.jsonpCallback||"callback",a=e.jsonpCallbackName||reqwest.getcallbackPrefix(r),i=new RegExp("((^|[?]|&)"+o+")=([^&]+)"),l=s.match(i),c=doc.createElement("script"),u=0,d=-1!==navigator.userAgent.indexOf("MSIE 10.0");return l?"?"===l[3]?s=s.replace(i,"$1="+a):a=l[3]:s=urlappend(s,o+"="+a),context[a]=generalCallback,c.type="text/javascript",c.src=s,c.async=!0,"undefined"!=typeof c.onreadystatechange&&!d&&(c.htmlFor=c.id="_reqwest_"+r),c.onload=c.onreadystatechange=function(){if(c[readyState]&&"complete"!==c[readyState]&&"loaded"!==c[readyState]||u)return!1;c.onload=c.onreadystatechange=null,c.onclick&&c.onclick(),t(lastValue),lastValue=undefined,head.removeChild(c),u=1},head.appendChild(c),{abort:function(){c.onload=c.onreadystatechange=null,n({},"Request is aborted: timeout",{}),lastValue=undefined,head.removeChild(c),u=1}}}function getRequest(e,t){var n,s=this.o,r=(s.method||"GET").toUpperCase(),o="string"==typeof s?s:s.url,a=!1!==s.processData&&s.data&&"string"!=typeof s.data?reqwest.toQueryString(s.data):s.data||null,i=!1;return("jsonp"==s.type||"GET"==r)&&a&&(o=urlappend(o,a),a=null),"jsonp"==s.type?handleJsonp(s,e,t,o):((n=s.xhr&&s.xhr(s)||xhr(s)).open(r,o,!1!==s.async),setHeaders(n,s),setCredentials(n,s),context[xDomainRequest]&&n instanceof context[xDomainRequest]?(n.onload=e,n.onerror=t,n.onprogress=function(){},i=!0):n.onreadystatechange=handleReadyState(this,e,t),s.before&&s.before(n),i?setTimeout(function(){n.send(a)},200):n.send(a),n)}function Reqwest(e,t){this.o=e,this.fn=t,init.apply(this,arguments)}function setType(e){return null===e?undefined:e.match("json")?"json":e.match("javascript")?"js":e.match("text")?"html":e.match("xml")?"xml":void 0}function init(o,fn){function complete(e){for(o.timeout&&clearTimeout(self.timeout),self.timeout=null;0<self._completeHandlers.length;)self._completeHandlers.shift()(e)}function success(resp){var type=o.type||resp&&setType(resp.getResponseHeader("Content-Type"));resp="jsonp"!==type?self.request:resp;var filteredResponse=globalSetupOptions.dataFilter(resp.responseText,type),r=filteredResponse;try{resp.responseText=r}catch(e){}if(r)switch(type){case"json":try{resp=context.JSON?context.JSON.parse(r):eval("("+r+")")}catch(err){return error(resp,"Could not parse JSON in response",err)}break;case"js":resp=eval(r);break;case"html":resp=r;break;case"xml":resp=resp.responseXML&&resp.responseXML.parseError&&resp.responseXML.parseError.errorCode&&resp.responseXML.parseError.reason?null:resp.responseXML}for(self._responseArgs.resp=resp,self._fulfilled=!0,fn(resp),self._successHandler(resp);0<self._fulfillmentHandlers.length;)resp=self._fulfillmentHandlers.shift()(resp);complete(resp)}function timedOut(){self._timedOut=!0,self.request.abort()}function error(e,t,n){for(e=self.request,self._responseArgs.resp=e,self._responseArgs.msg=t,self._responseArgs.t=n,self._erred=!0;0<self._errorHandlers.length;)self._errorHandlers.shift()(e,t,n);complete(e)}this.url="string"==typeof o?o:o.url,this.timeout=null,this._fulfilled=!1,this._successHandler=function(){},this._fulfillmentHandlers=[],this._errorHandlers=[],this._completeHandlers=[],this._erred=!1,this._responseArgs={};var self=this;fn=fn||function(){},o.timeout&&(this.timeout=setTimeout(function(){timedOut()},o.timeout)),o.success&&(this._successHandler=function(){o.success.apply(o,arguments)}),o.error&&this._errorHandlers.push(function(){o.error.apply(o,arguments)}),o.complete&&this._completeHandlers.push(function(){o.complete.apply(o,arguments)}),this.request=getRequest.call(this,success,error)}function reqwest(e,t){return new Reqwest(e,t)}function normalize(e){return e?e.replace(/\r?\n/g,"\r\n"):""}function serial(e,t){var n,s,r,o,a=e.name,i=e.tagName.toLowerCase(),l=function(e){e&&!e.disabled&&t(a,normalize(e.attributes.value&&e.attributes.value.specified?e.value:e.text))};if(!e.disabled&&a)switch(i){case"input":/reset|button|image|file/i.test(e.type)||(n=/checkbox/i.test(e.type),s=/radio/i.test(e.type),r=e.value,(!n&&!s||e.checked)&&t(a,normalize(n&&""===r?"on":r)));break;case"textarea":t(a,normalize(e.value));break;case"select":if("select-one"===e.type.toLowerCase())l(0<=e.selectedIndex?e.options[e.selectedIndex]:null);else for(o=0;e.length&&o<e.length;o++)e.options[o].selected&&l(e.options[o])}}function eachFormElement(){var e,t,o=this,n=function(e,t){var n,s,r;for(n=0;n<t.length;n++)for(r=e[byTag](t[n]),s=0;s<r.length;s++)serial(r[s],o)};for(t=0;t<arguments.length;t++)e=arguments[t],/input|select|textarea/i.test(e.tagName)&&serial(e,o),n(e,["input","select","textarea"])}function serializeQueryString(){return reqwest.toQueryString(reqwest.serializeArray.apply(null,arguments))}function serializeHash(){var n={};return eachFormElement.apply(function(e,t){e in n?(n[e]&&!isArray(n[e])&&(n[e]=[n[e]]),n[e].push(t)):n[e]=t},arguments),n}function buildParams(e,t,n,s){var r,o,a,i=/\[\]$/;if(isArray(t))for(o=0;t&&o<t.length;o++)a=t[o],n||i.test(e)?s(e,a):buildParams(e+"["+("object"==typeof a?o:"")+"]",a,n,s);else if(t&&"[object Object]"===t.toString())for(r in t)buildParams(e+"["+r+"]",t[r],n,s);else s(e,t)}var context=this,XHR2;if("window"in context)var doc=document,byTag="getElementsByTagName",head=doc[byTag]("head")[0];else try{XHR2=require("xhr2")}catch(ex){throw new Error("Peer dependency `xhr2` required! Please npm install xhr2")}var httpsRe=/^http/,protocolRe=/(^\w+):\/\//,twoHundo=/^(20\d|1223)$/,readyState="readyState",contentType="Content-Type",requestedWith="X-Requested-With",uniqid=0,callbackPrefix="reqwest_"+ +new Date,lastValue,xmlHttpRequest="XMLHttpRequest",xDomainRequest="XDomainRequest",noop=function(){},isArray="function"==typeof Array.isArray?Array.isArray:function(e){return e instanceof Array},defaultHeaders={contentType:"application/x-www-form-urlencoded",requestedWith:xmlHttpRequest,accept:{"*":"text/javascript, text/html, application/xml, text/xml, */*",xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript",js:"application/javascript, text/javascript"}},xhr=function(e){if(!0!==e.crossOrigin)return context[xmlHttpRequest]?new XMLHttpRequest:XHR2?new XHR2:new ActiveXObject("Microsoft.XMLHTTP");var t=context[xmlHttpRequest]?new XMLHttpRequest:null;if(t&&"withCredentials"in t)return t;if(context[xDomainRequest])return new XDomainRequest;throw new Error("Browser does not support cross-origin requests")},globalSetupOptions={dataFilter:function(e){return e}};return Reqwest.prototype={abort:function(){this._aborted=!0,this.request.abort()},retry:function(){init.call(this,this.o,this.fn)},then:function(e,t){return e=e||function(){},t=t||function(){},this._fulfilled?this._responseArgs.resp=e(this._responseArgs.resp):this._erred?t(this._responseArgs.resp,this._responseArgs.msg,this._responseArgs.t):(this._fulfillmentHandlers.push(e),this._errorHandlers.push(t)),this},always:function(e){return this._fulfilled||this._erred?e(this._responseArgs.resp):this._completeHandlers.push(e),this},fail:function(e){return this._erred?e(this._responseArgs.resp,this._responseArgs.msg,this._responseArgs.t):this._errorHandlers.push(e),this},"catch":function(e){return this.fail(e)}},reqwest.serializeArray=function(){var n=[];return eachFormElement.apply(function(e,t){n.push({name:e,value:t})},arguments),n},reqwest.serialize=function(){if(0===arguments.length)return"";var e,t=Array.prototype.slice.call(arguments,0);return(e=t.pop())&&e.nodeType&&t.push(e)&&(e=null),e&&(e=e.type),("map"==e?serializeHash:"array"==e?reqwest.serializeArray:serializeQueryString).apply(null,t)},reqwest.toQueryString=function(e,t){var n,s,r=t||!1,o=[],a=encodeURIComponent,i=function(e,t){t="function"==typeof t?t():null==t?"":t,o[o.length]=a(e)+"="+a(t)};if(isArray(e))for(s=0;e&&s<e.length;s++)i(e[s].name,e[s].value);else for(n in e)e.hasOwnProperty(n)&&buildParams(n,e[n],r,i);return o.join("&").replace(/%20/g,"+")},reqwest.getcallbackPrefix=function(){return callbackPrefix},reqwest.compat=function(e,t){return e&&(e.type&&(e.method=e.type)&&delete e.type,e.dataType&&(e.type=e.dataType),e.jsonpCallback&&(e.jsonpCallbackName=e.jsonpCallback)&&delete e.jsonpCallback,e.jsonp&&(e.jsonpCallback=e.jsonp)),new Reqwest(e,t)},reqwest.ajaxSetup=function(e){for(var t in e=e||{})globalSetupOptions[t]=e[t]},reqwest}(); /*! * Reqwest! A general purpose XHR connection manager * license MIT (c) Dustin Diaz 2015 * https://github.com/ded/reqwest */!function(){var a=window.Locksmith={},e=document.querySelector('script[type="application/vnd.locksmith+json"]'),n=e&&e.innerHTML;if(a.state={},a.util={},a.loading=!1,n)try{a.state=JSON.parse(n)}catch(u){}if(document.addEventListener&&document.querySelector){var s,r,o,t=[76,79,67,75,83,77,73,84,72,49,49],i=function(){r=t.slice(0)},l="style",c=function(e){e&&27!==e.keyCode&&"click"!==e.type||(document.removeEventListener("keydown",c),document.removeEventListener("click",c),s&&document.body.removeChild(s),s=null)};i(),document.addEventListener("keyup",function(e){if(e.keyCode===r[0]){if(clearTimeout(o),r.shift(),0<r.length)return void(o=setTimeout(i,1e3));i(),c(),(s=document.createElement("div"))[l].width="50%",s[l].maxWidth="1000px",s[l].height="85%",s[l].border="1px rgba(0, 0, 0, 0.2) solid",s[l].background="rgba(255, 255, 255, 0.99)",s[l].borderRadius="4px",s[l].position="fixed",s[l].top="50%",s[l].left="50%",s[l].transform="translateY(-50%) translateX(-50%)",s[l].boxShadow="0 2px 5px rgba(0, 0, 0, 0.3), 0 0 100vh 100vw rgba(0, 0, 0, 0.5)",s[l].zIndex="2147483645";var t=document.createElement("textarea");t.value=JSON.stringify(JSON.parse(n),null,2),t[l].border="none",t[l].display="block",t[l].boxSizing="border-box",t[l].width="100%",t[l].height="100%",t[l].background="transparent",t[l].padding="22px",t[l].fontFamily="monospace",t[l].fontSize="14px",t[l].color="#333",t[l].resize="none",t[l].outline="none",t.readOnly=!0,s.appendChild(t),document.body.appendChild(s),t.addEventListener("click",function(e){e.stopImmediatePropagation()}),t.select(),document.addEventListener("keydown",c),document.addEventListener("click",c)}})}a.isEmbedded=-1!==window.location.search.indexOf("_ab=0&_fd=0&_sc=1"),a.path=a.state.path||window.location.pathname,a.basePath=a.state.locale_root_url.concat("/apps/locksmith").replace(/^\/\//,"/"),a.reloading=!1,a.util.console=window.console||{log:function(){},error:function(){}},a.util.makeUrl=function(e,t){var n,s=a.basePath+e,r=[],o=a.cache();for(n in o)r.push(n+"="+encodeURIComponent(o[n]));for(n in t)r.push(n+"="+encodeURIComponent(t[n]));return a.state.customer_id&&(r.push("customer_id="+encodeURIComponent(a.state.customer_id)),r.push("customer_id_signature="+encodeURIComponent(a.state.customer_id_signature))),s+=(-1===s.indexOf("?")?"?":"&")+r.join("&")},a._initializeCallbacks=[],a.on=function(e,t){if("initialize"!==e)throw'Locksmith.on() currently only supports the "initialize" event';a._initializeCallbacks.push(t)},a.initializeSession=function(e){if(!a.isEmbedded){var t=!1,n=!0,s=!0;(e=e||{}).silent&&(s=n=!(t=!0)),a.ping({silent:t,spinner:n,reload:s,callback:function(){a._initializeCallbacks.forEach(function(e){e()})}})}},a.cache=function(e){var t={};try{var n=function r(e){return(document.cookie.match("(^|; )"+e+"=([^;]*)")||0)[2]};t=JSON.parse(decodeURIComponent(n("locksmith-params")||"{}"))}catch(u){}if(e){for(var s in e)t[s]=e[s];document.cookie="locksmith-params=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/",document.cookie="locksmith-params="+encodeURIComponent(JSON.stringify(t))+"; path=/"}return t},a.cache.cart=a.state.cart,a.cache.cartLastSaved=null,a.params=a.cache(),a.util.reload=function(){a.reloading=!0;try{window.location.href=window.location.href.replace(/#.*/,"")}catch(u){a.util.console.error("Preferred reload method failed",u),window.location.reload()}},a.cache.saveCart=function(e){if(!a.cache.cart||a.cache.cart===a.cache.cartLastSaved)return e?e():null;var t=a.cache.cartLastSaved;a.cache.cartLastSaved=a.cache.cart,reqwest({url:"/cart/update.json",method:"post",type:"json",data:{attributes:{locksmith:a.cache.cart}},complete:e,error:function(e){if(a.cache.cartLastSaved=t,!a.reloading)throw e}})},a.util.spinnerHTML='<style>body{background:#FFF}@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}#loading{display:flex;width:100%;height:50vh;color:#777;align-items:center;justify-content:center}#loading .spinner{display:block;animation:spin 600ms linear infinite;position:relative;width:50px;height:50px}#loading .spinner-ring{stroke:currentColor;stroke-dasharray:100%;stroke-width:2px;stroke-linecap:round;fill:none}</style><div id="loading"><div class="spinner"><svg width="100%" height="100%"><svg preserveAspectRatio="xMinYMin"><circle class="spinner-ring" cx="50%" cy="50%" r="45%"></circle></svg></svg></div></div>',a.util.clobberBody=function(e){document.body.innerHTML=e},a.util.clobberDocument=function(e){e.responseText&&(e=e.responseText),document.documentElement&&document.removeChild(document.documentElement);var t=document.open("text/html","replace");t.writeln(e),t.close(),setTimeout(function(){var e=t.querySelector("[autofocus]");e&&e.focus()},100)},a.util.serializeForm=function(e){if(e&&"FORM"===e.nodeName){var t,n,s={};for(t=e.elements.length-1;0<=t;t-=1)if(""!==e.elements[t].name)switch(e.elements[t].nodeName){case"INPUT":switch(e.elements[t].type){default:case"text":case"hidden":case"password":case"button":case"reset":case"submit":s[e.elements[t].name]=e.elements[t].value;break;case"checkbox":case"radio":e.elements[t].checked&&(s[e.elements[t].name]=e.elements[t].value);break;case"file":}break;case"TEXTAREA":s[e.elements[t].name]=e.elements[t].value;break;case"SELECT":switch(e.elements[t].type){case"select-one":s[e.elements[t].name]=e.elements[t].value;break;case"select-multiple":for(n=e.elements[t].options.length-1;0<=n;n-=1)e.elements[t].options[n].selected&&(s[e.elements[t].name]=e.elements[t].options[n].value)}break;case"BUTTON":switch(e.elements[t].type){case"reset":case"submit":case"button":s[e.elements[t].name]=e.elements[t].value}}return s}},a.util.on=function(e,o,a,t){t=t||document;var i="locksmith-"+e+o,n=function(e){var t=e.target,n=e.target.parentElement,s=t.className.baseVal||t.className||"",r=n.className.baseVal||n.className||"";("string"==typeof s&&-1!==s.split(/\s+/).indexOf(o)||"string"==typeof r&&-1!==r.split(/\s+/).indexOf(o))&&!e[i]&&(e[i]=!0,a(e))};t.attachEvent?t.attachEvent(e,n):t.addEventListener(e,n,!1)},a.util.enableActions=function(e){a.util.on("click","locksmith-action",function(e){e.preventDefault();var t=e.target;t.dataset.confirmWith&&!confirm(t.dataset.confirmWith)||(t.disabled=!0,t.innerText=t.dataset.disableWith,a.post("/action",t.dataset.locksmithParams,{spinner:!1,type:"text",success:function(e){(e=JSON.parse(e.responseText)).message&&alert(e.message),a.util.reload()}}))},e)},a.util.inject=function(e,t){var n=["data","locksmith","append"];if(-1!==t.indexOf(n.join("-"))){var s=document.createElement("div");s.innerHTML=t,e.appendChild(s)}else e.innerHTML=t;var r,o,a=e.querySelectorAll("script");for(o=0;o<a.length;++o){r=a[o];var i=document.createElement("script");if(r.type&&(i.type=r.type),r.src)i.src=r.src;else{var l=document.createTextNode(r.innerHTML);i.appendChild(l)}e.appendChild(i)}var c=e.querySelector("[autofocus]");c&&c.focus()},a.post=function(e,t,n){!1!==(n=n||{}).spinner&&a.util.clobberBody(a.util.spinnerHTML);var s={};n.container===document?(s.layout=1,n.success=function(e){document.getElementById(n.container);a.util.clobberDocument(e)}):n.container&&(s.layout=0,n.success=function(e){var t=document.getElementById(n.container);a.util.inject(t,e),t.id===t.firstChild.id&&t.parentElement.replaceChild(t.firstChild,t)}),a.loading=!0;var r=a.util.makeUrl(e,s);reqwest({url:r,method:"post",type:n.type||"html",data:t,complete:function(){a.loading=!1},error:function(e){if(!a.reloading)if("dashboard.weglot.com"!==window.location.host){if(!n.silent)throw alert("Something went wrong! Please refresh and try again."),e;console.error(e)}else console.error(e)},success:n.success||a.util.clobberDocument})},a.postResource=function(e,t){e.path=a.path,e.search=window.location.search,e.state=a.state,e.passcode&&(e.passcode=e.passcode.trim()),e.email&&(e.email=e.email.trim()),e.state.cart=a.cache.cart,e.locksmith_json=a.jsonTag,e.locksmith_json_signature=a.jsonTagSignature,a.post("/resource",e,t)},a.ping=function(e){if(!a.isEmbedded){e=e||{};a.post("/ping",{path:a.path,search:window.location.search,state:a.state},{spinner:!!e.spinner,silent:"undefined"==typeof e.silent||e.silent,type:"text",success:function(e){(e=JSON.parse(e.responseText)).messages&&0<e.messages.length&&a.showMessages(e.messages)}})}},a.timeoutMonitor=function(){var e=a.cache.cart;a.ping({callback:function(){e!==a.cache.cart||setTimeout(function(){a.timeoutMonitor()},6e4)}})},a.showMessages=function(e){var t=document.createElement("div");t.style.position="fixed",t.style.left=0,t.style.right=0,t.style.bottom="-50px",t.style.opacity=0,t.style.background="#191919",t.style.color="#ddd",t.style.transition="bottom 0.2s, opacity 0.2s",t.style.zIndex=999999,t.innerHTML=" <style> .locksmith-ab .locksmith-b { display: none; } .locksmith-ab.toggled .locksmith-b { display: flex; } .locksmith-ab.toggled .locksmith-a { display: none; } .locksmith-flex { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; padding: 10px 20px; } .locksmith-message + .locksmith-message { border-top: 1px #555 solid; } .locksmith-message a { color: inherit; font-weight: bold; } .locksmith-message a:hover { color: inherit; opacity: 0.8; } a.locksmith-ab-toggle { font-weight: inherit; text-decoration: underline; } .locksmith-text { flex-grow: 1; } .locksmith-cta { flex-grow: 0; text-align: right; } .locksmith-cta button { transform: scale(0.8); transform-origin: left; } .locksmith-cta > * { display: block; } .locksmith-cta > * + * { margin-top: 10px; } .locksmith-message a.locksmith-close { flex-grow: 0; text-decoration: none; margin-left: 15px; font-size: 30px; font-family: monospace; display: block; padding: 2px 10px; } @media screen and (max-width: 600px) { .locksmith-wide-only { display: none !important; } .locksmith-flex { padding: 0 15px; } .locksmith-flex > * { margin-top: 5px; margin-bottom: 5px; } .locksmith-cta { text-align: left; } } @media screen and (min-width: 601px) { .locksmith-narrow-only { display: none !important; } } </style> "+e.map(function(e){return'<div class="locksmith-message">'+e+"</div>"}).join(""),document.body.appendChild(t),document.body.style.position="relative",document.body.parentElement.style.paddingBottom=t.offsetHeight+"px",setTimeout(function(){t.style.bottom=0,t.style.opacity=1},50),a.util.on("click","locksmith-ab-toggle",function(e){e.preventDefault();for(var t=e.target.parentElement;-1===t.className.split(" ").indexOf("locksmith-ab");)t=t.parentElement;-1!==t.className.split(" ").indexOf("toggled")?t.className=t.className.replace("toggled",""):t.className=t.className+" toggled"}),a.util.enableActions(t)}}()}();</script> <script data-locksmith>Locksmith.cache.cart=null</script> <script data-locksmith>Locksmith.jsonTag="\u003cscript type=\"application\/vnd.locksmith+json\" data-locksmith\u003e{\"version\":\"v38\",\"locked\":false,\"initialized\":true,\"scope\":\"product\",\"access_granted\":true,\"access_denied\":false,\"requires_customer\":false,\"manual_lock\":false,\"remote_lock\":false,\"has_timeout\":false,\"remote_rendered\":null,\"hide_resource\":false,\"hide_links_to_resource\":false,\"transparent\":true,\"locks\":{\"all\":[],\"opened\":[]},\"keys\":[],\"keys_signature\":\"a01a4dfcdb1d084dcaa180fa67ab0844ddcf9982986155db462e143cf2df5360\",\"state\":{\"template\":\"product\",\"theme\":79529541683,\"product\":\"eu-perusteos-2-uudistettu-laitos\",\"collection\":null,\"page\":null,\"blog\":null,\"article\":null,\"app\":null},\"now\":1700588566,\"path\":\"\\\/products\\\/eu-perusteos-2-uudistettu-laitos\",\"locale_root_url\":\"\\\/\",\"canonical_url\":\"https:\\\/\\\/julkaisut.um.fi\\\/products\\\/eu-perusteos-2-uudistettu-laitos\",\"customer_id\":null,\"customer_id_signature\":\"a01a4dfcdb1d084dcaa180fa67ab0844ddcf9982986155db462e143cf2df5360\",\"cart\":null}\u003c\/script\u003e";Locksmith.jsonTagSignature="7027ee518f9a579499754f2204f04431d6dc2fda62255c66fd451fe318d92fe6"</script> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Basic page needs ================================================== --> <meta charset="utf-8"> <meta name="google-site-verification" content="Fv2l_VrAwhypqhv__MQukVqy8uI2iEWk5UO-osDGxjQ"/> <link rel="shortcut icon" href="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/files/UM_merkki_32x32.png?v=1613573629" type="image/png"/> <!-- Title and description ================================================== --> <title> EU-perusteos, 2. uudistettu laitos &ndash; UM julkaisupalvelut </title> <!-- Social meta ================================================== --> <!-- /snippets/social-meta-tags.liquid --> <meta property="og:site_name" content="UM julkaisupalvelut"> <meta property="og:url" content="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/products/eu-perusteos-2-uudistettu-laitos"> <meta name="twitter:card" content="summary_large_image"> <!-- Helpers ================================================== --> <link rel="canonical" href="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/products/eu-perusteos-2-uudistettu-laitos"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#003773"> <!-- CSS ================================================== --> <link href="//web.archive.org/web/20231121174249cs_/https://julkaisut.um.fi/cdn/shop/t/2/assets/timber.scss.css?v=124607879368800232131669032221" rel="stylesheet" type="text/css" media="all"/> <link href="//web.archive.org/web/20231121174249cs_/https://julkaisut.um.fi/cdn/shop/t/2/assets/theme.scss.css?v=49224782600476689711669032221" rel="stylesheet" type="text/css" media="all"/> <script> window.theme = window.theme || {}; var theme = { strings: { addToCart: "Lisää ostoskoriin", soldOut: "Ei saatavilla painettuna", unavailable: "Ei käytettävissä", zoomClose: "Sulje (Esc)", zoomPrev: "Edellinen (vasen nuolinäppäin)", zoomNext: "Seuraava (oikea nuolinäppäin)", addressError: "Virhe etsittäessä tätä osoitetta", addressNoResults: "Tälle osoitteelle ei löytynyt tuloksia", addressQueryLimit: "Olet ylittänyt Google API: n käyttörajan. Harkitse päivitystä \u003ca href=\"https:\/\/developers.google.com\/maps\/premium\/usage-limits\"\u003ePremium-sopimukseen\u003c\/a\u003e.", authError: "Google Mapsin API-avaimen tunnistamisessa oli ongelma." }, settings: { // Adding some settings to allow the editor to update correctly when they are changed enableWideLayout: false, typeAccentTransform: true, typeAccentSpacing: true, baseFontSize: '16px', headerBaseFontSize: '30px', accentFontSize: '14px' }, variables: { mediaQueryMedium: 'screen and (max-width: 768px)', bpSmall: false }, moneyFormat: "€{{amount_with_comma_separator}}" } document.documentElement.className = document.documentElement.className.replace('no-js', 'supports-js'); </script> <!-- Header hook for plugins ================================================== --> <script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script><meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/25394872371/digital_wallets/dialog"> <link rel="alternate" hreflang="x-default" href="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/products/eu-perusteos-2-uudistettu-laitos"> <link rel="alternate" hreflang="fi-FI" href="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/products/eu-perusteos-2-uudistettu-laitos"> <link rel="alternate" hreflang="en-FI" href="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/en/products/eu-perusteos-2-uudistettu-laitos"> <link rel="alternate" hreflang="sv-FI" href="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/sv/products/eu-perusteos-2-uudistettu-laitos"> <link rel="alternate" type="application/json+oembed" href="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/products/eu-perusteos-2-uudistettu-laitos.oembed"> <script async="async" src="/web/20231121174249js_/https://julkaisut.um.fi/checkouts/internal/preloads.js?locale=fi-FI"></script><script id="shopify-features" type="application/json">{"accessToken":"b51947fe3465a565193c78ea7eb26f2d","betas":["rich-media-storefront-analytics"],"domain":"julkaisut.um.fi","predictiveSearch":true,"shopId":25394872371,"smart_payment_buttons_url":"https:\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shopifycloud\/payment-sheet\/assets\/latest\/spb.fi.js","dynamic_checkout_cart_url":"https:\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shopifycloud\/payment-sheet\/assets\/latest\/dynamic-checkout-cart.fi.js","locale":"fi","optimusEnabled":true,"optimusHidden":false,"betterDynamicCheckoutRecommendationVariant":"control","shopPromisePDPV3Enabled":false}</script> <script>var Shopify = Shopify || {}; Shopify.shop = "julkaisut-um.myshopify.com"; Shopify.locale = "fi"; Shopify.currency = {"active":"EUR","rate":"1.0"}; Shopify.country = "FI"; Shopify.theme = {"name":"Minimal","id":79529541683,"theme_store_id":380,"role":"main"}; Shopify.theme.handle = "null"; Shopify.theme.style = {"id":null,"handle":null}; Shopify.cdnHost = "julkaisut.um.fi/cdn"; Shopify.routes = Shopify.routes || {}; Shopify.routes.root = "/";</script> <script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script> <script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script> <script id="__st">var __st={"a":25394872371,"offset":7200,"reqid":"2ed4db61-9b85-47d9-9674-ba0658a77e06","pageurl":"julkaisut.um.fi\/products\/eu-perusteos-2-uudistettu-laitos","u":"17cc8852a1eb","p":"product","rtyp":"product","rid":4517818269747};</script> <script>window.ShopifyPaypalV4VisibilityTracking = true;</script> <script integrity="" data-source-attribution="shopify.loadfeatures" defer="defer" src="//web.archive.org/web/20231121174249js_/https://julkaisut.um.fi/cdn/shopifycloud/shopify/assets/storefront/load_feature-87876fa245af19cbd14aa886ed59c6aa8a27c45d24dcd7a81cf2d2323506233e.js" crossorigin="anonymous"></script> <script integrity="" data-source-attribution="shopify.dynamic-checkout" defer="defer" src="//web.archive.org/web/20231121174249js_/https://julkaisut.um.fi/cdn/shopifycloud/shopify/assets/storefront/features-1c0b396bd4d054b94abae1eb6a1bd6ba47beb35525c57a217c77a862ff06d83f.js" crossorigin="anonymous"></script> <script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script> <script src="//web.archive.org/web/20231121174249js_/https://julkaisut.um.fi/cdn/shop/t/2/assets/jquery-2.2.3.min.js?v=58211863146907186831574167365"></script> <script src="//web.archive.org/web/20231121174249js_/https://julkaisut.um.fi/cdn/shop/t/2/assets/lazysizes.min.js?v=155223123402716617051574167366" async="async"></script> <meta property="og:image" content="https://web.archive.org/web/20231121174249im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/EU-perusteotetukansi.jpg?v=1588077390"/> <meta property="og:image:secure_url" content="https://cdn.shopify.com/s/files/1/0253/9487/2371/products/EU-perusteotetukansi.jpg?v=1588077390"/> <meta property="og:image:width" content="629"/> <meta property="og:image:height" content="913"/> <link href="https://web.archive.org/web/20231121174249/https://monorail-edge.shopifysvc.com/" rel="dns-prefetch"> <script>(function(){if ("sendBeacon" in navigator && "performance" in window) {var session_token = document.cookie.match(/_shopify_s=([^;]*)/);function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 25394872371,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token: session_token && session_token.length === 2 ? session_token[1] : "",page_type: "product"};window.navigator.sendBeacon("https://web.archive.org/web/20231121174249/https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script> <script id="web-pixels-manager-setup">(function e(e,n,a,t,o,r,i){var s=null!==e,l=("function"==typeof BigInt&&BigInt.toString().indexOf("[native code]")?"modern":"legacy").substring(0,1),c=t.substring(0,1);if(s){window.Shopify=window.Shopify||{};var d=window.Shopify;d.analytics=d.analytics||{};var u=d.analytics;u.replayQueue=[],u.publish=function(e,n,a){u.replayQueue.push([e,n,a])};try{self.performance.mark("wpm:start")}catch(e){}}var p,f,y,h,v,m,w,g,b,_=[a,"/wpm","/",c,r,l,".js"].join("");f=(p={src:_,async:!0,onload:function(){if(e){var a=window.webPixelsManager.init(e);null==n||n(a);var t=window.Shopify.analytics;t.replayQueue.forEach((function(e){var n=e[0],t=e[1],o=e[2];a.publishCustomEvent(n,t,o)})),t.replayQueue=[],t.publish=a.publishCustomEvent,t.visitor=a.visitor}},onerror:function(){var n=(null==e?void 0:e.storefrontBaseUrl)?e.storefrontBaseUrl.replace(/\/$/,""):self.location.origin,a="".concat(n,"/.well-known/shopify/monorail/unstable/produce_batch"),t=JSON.stringify({metadata:{event_sent_at_ms:(new Date).getTime()},events:[{schema_id:"web_pixels_manager_load/2.0",payload:{version:o||"latest",page_url:self.location.href,status:"failed",error_msg:"".concat(_," has failed to load")},metadata:{event_created_at_ms:(new Date).getTime()}}]});try{if(self.navigator.sendBeacon.bind(self.navigator)(a,t))return!0}catch(e){}var r=new XMLHttpRequest;try{return r.open("POST",a,!0),r.setRequestHeader("Content-Type","text/plain"),r.send(t),!0}catch(e){console&&console.warn&&console.warn("[Web Pixels Manager] Got an unhandled error while logging a load error.")}return!1}}).src,y=p.async,h=void 0===y||y,v=p.onload,m=p.onerror,w=document.createElement("script"),g=document.head,b=document.body,w.async=h,w.src=f,v&&w.addEventListener("load",v),m&&w.addEventListener("error",m),g?g.appendChild(w):b?b.appendChild(w):console.error("Did not find a head or body element to append the script")})({shopId: 25394872371,storefrontBaseUrl: "https://web.archive.org/web/20231121174249/https://julkaisut.um.fi",cdnBaseUrl: "https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn",surface: "storefront-renderer",enabledBetaFlags: ["web_pixels_async_pixel_refactor","web_pixels_visitor_api","web_pixels_manager_performance_improvement"],webPixelsConfigList: [{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0570","apiClientId":"shopify-pixel","type":"APP"},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0570","apiClientId":"shopify-pixel","type":"CUSTOM"}],initData: {"cart":null,"checkout":null,"customer":null,"productVariants":[{"id":"31927893622835","image":{"src":"\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteotetukansi.jpg?v=1588077390"},"price":{"amount":0.0,"currencyCode":"EUR"},"product":{"id":"4517818269747","title":"EU-perusteos, 2. uudistettu laitos","untranslatedTitle":"EU-perusteos, 2. uudistettu laitos","url":"\/products\/eu-perusteos-2-uudistettu-laitos","vendor":"UM julkaisupalvelut","type":""},"sku":"ET-100047-FI","title":"Default Title","untranslatedTitle":"Default Title"}]},},function pageEvents(webPixelsManagerAPI) {webPixelsManagerAPI.publish("page_viewed");webPixelsManagerAPI.publish("product_viewed", {"productVariant":{"id":"31927893622835","image":{"src":"\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteotetukansi.jpg?v=1588077390"},"price":{"amount":0.0,"currencyCode":"EUR"},"product":{"id":"4517818269747","title":"EU-perusteos, 2. uudistettu laitos","untranslatedTitle":"EU-perusteos, 2. uudistettu laitos","url":"\/products\/eu-perusteos-2-uudistettu-laitos","vendor":"UM julkaisupalvelut","type":""},"sku":"ET-100047-FI","title":"Default Title","untranslatedTitle":"Default Title"}});},"https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn","browser","0.0.404","a9733732w152bc0c4p2b177b68md647b1e6",["web_pixels_async_pixel_refactor","web_pixels_visitor_api","web_pixels_manager_performance_improvement"]);</script> <script>window.ShopifyAnalytics = window.ShopifyAnalytics || {}; window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; window.ShopifyAnalytics.meta.currency = 'EUR'; var meta = {"product":{"id":4517818269747,"gid":"gid:\/\/shopify\/Product\/4517818269747","vendor":"UM julkaisupalvelut","type":"","variants":[{"id":31927893622835,"price":0,"name":"EU-perusteos, 2. uudistettu laitos","public_title":null,"sku":"ET-100047-FI"}]},"page":{"pageType":"product","resourceType":"product","resourceId":4517818269747}}; for (var attr in meta) { window.ShopifyAnalytics.meta[attr] = meta[attr]; }</script> <script>window.ShopifyAnalytics.merchantGoogleAnalytics = function() { }; </script> <script class="analytics">(function () { var customDocumentWrite = function(content) { var jquery = null; if (window.jQuery) { jquery = window.jQuery; } else if (window.Checkout && window.Checkout.$) { jquery = window.Checkout.$; } if (jquery) { jquery('body').append(content); } }; var hasLoggedConversion = function(token) { if (token) { return document.cookie.indexOf('loggedConversion=' + token) !== -1; } return false; } var setCookieIfConversion = function(token) { if (token) { var twoMonthsFromNow = new Date(Date.now()); twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; } } var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; if (trekkie.integrations) { return; } trekkie.methods = [ 'identify', 'page', 'ready', 'track', 'trackForm', 'trackLink' ]; trekkie.factory = function(method) { return function() { var args = Array.prototype.slice.call(arguments); args.unshift(method); trekkie.push(args); return trekkie; }; }; for (var i = 0; i < trekkie.methods.length; i++) { var key = trekkie.methods[i]; trekkie[key] = trekkie.factory(key); } trekkie.load = function(config) { trekkie.config = config || {}; trekkie.config.initialDocumentCookie = document.cookie; var first = document.getElementsByTagName('script')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.onerror = function(e) { var scriptFallback = document.createElement('script'); scriptFallback.type = 'text/javascript'; scriptFallback.onerror = function(error) { var Monorail = { produce: function produce(monorailDomain, schemaId, payload) { var currentMs = new Date().getTime(); var event = { schema_id: schemaId, payload: payload, metadata: { event_created_at_ms: currentMs, event_sent_at_ms: currentMs } }; return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); }, sendRequest: function sendRequest(endpointUrl, payload) { // Try the sendBeacon API if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { var blobData = new window.Blob([payload], { type: 'text/plain' }); if (window.navigator.sendBeacon(endpointUrl, blobData)) { return true; } // sendBeacon was not successful } // XHR beacon var xhr = new XMLHttpRequest(); try { xhr.open('POST', endpointUrl); xhr.setRequestHeader('Content-Type', 'text/plain'); xhr.send(payload); } catch (e) { console.log(e); } return false; }, isIos12: function isIos12() { return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; } }; Monorail.produce('monorail-edge.shopifysvc.com', 'trekkie_storefront_load_errors/1.1', {shop_id: 25394872371, theme_id: 79529541683, app_name: "storefront", context_url: window.location.href, source_url: "//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/s/trekkie.storefront.f33399a7b9d8c1007209860fbdd63bb24633ae9f.min.js"}); }; scriptFallback.async = true; scriptFallback.src = '//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/s/trekkie.storefront.f33399a7b9d8c1007209860fbdd63bb24633ae9f.min.js'; first.parentNode.insertBefore(scriptFallback, first); }; script.async = true; script.src = '//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/s/trekkie.storefront.f33399a7b9d8c1007209860fbdd63bb24633ae9f.min.js'; first.parentNode.insertBefore(script, first); }; trekkie.load( {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":25394872371,"isMerchantRequest":null,"themeId":79529541683,"themeCityHash":"5684472440737999689","contentLanguage":"fi","currency":"EUR"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain"},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer"}} ); var loaded = false; trekkie.ready(function() { if (loaded) return; loaded = true; window.ShopifyAnalytics.lib = window.trekkie; var originalDocumentWrite = document.write; document.write = customDocumentWrite; try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; document.write = originalDocumentWrite; window.ShopifyAnalytics.lib.page(null,{"pageType":"product","resourceType":"product","resourceId":4517818269747}); var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) var token = match? match[1]: undefined; if (!hasLoggedConversion(token)) { setCookieIfConversion(token); window.ShopifyAnalytics.lib.track("Viewed Product",{"currency":"EUR","variantId":31927893622835,"productId":4517818269747,"productGid":"gid:\/\/shopify\/Product\/4517818269747","name":"EU-perusteos, 2. uudistettu laitos","price":"0.00","sku":"ET-100047-FI","brand":"UM julkaisupalvelut","variant":null,"category":"","nonInteraction":true}); window.ShopifyAnalytics.lib.track("monorail:\/\/trekkie_storefront_viewed_product\/1.1",{"currency":"EUR","variantId":31927893622835,"productId":4517818269747,"productGid":"gid:\/\/shopify\/Product\/4517818269747","name":"EU-perusteos, 2. uudistettu laitos","price":"0.00","sku":"ET-100047-FI","brand":"UM julkaisupalvelut","variant":null,"category":"","nonInteraction":true,"referer":"https:\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/products\/eu-perusteos-2-uudistettu-laitos"}); } }); var eventsListenerScript = document.createElement('script'); eventsListenerScript.async = true; eventsListenerScript.src = "//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/shopifycloud/shopify/assets/shop_events_listener-a7c63dba65ccddc484f77541dc8ca437e60e1e9e297fe1c3faebf6523a0ede9b.js"; document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); })();</script> <script class="boomerang"> (function () { if (window.BOOMR && (window.BOOMR.version || window.BOOMR.snippetExecuted)) { return; } window.BOOMR = window.BOOMR || {}; window.BOOMR.snippetStart = new Date().getTime(); window.BOOMR.snippetExecuted = true; window.BOOMR.snippetVersion = 12; window.BOOMR.application = "storefront-renderer"; window.BOOMR.themeName = "Minimal"; window.BOOMR.themeVersion = "11.6.5"; window.BOOMR.shopId = 25394872371; window.BOOMR.themeId = 79529541683; window.BOOMR.renderRegion = "gcp-europe-west4"; window.BOOMR.url = "https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/shopifycloud/boomerang/shopify-boomerang-1.0.0.min.js"; var where = document.currentScript || document.getElementsByTagName("script")[0]; var parentNode = where.parentNode; var promoted = false; var LOADER_TIMEOUT = 3000; function promote() { if (promoted) { return; } var script = document.createElement("script"); script.id = "boomr-scr-as"; script.src = window.BOOMR.url; script.async = true; parentNode.appendChild(script); promoted = true; } function iframeLoader(wasFallback) { promoted = true; var dom, bootstrap, iframe, iframeStyle; var doc = document; var win = window; window.BOOMR.snippetMethod = wasFallback ? "if" : "i"; bootstrap = function(parent, scriptId) { var script = doc.createElement("script"); script.id = scriptId || "boomr-if-as"; script.src = window.BOOMR.url; BOOMR_lstart = new Date().getTime(); parent = parent || doc.body; parent.appendChild(script); }; if (!window.addEventListener && window.attachEvent && navigator.userAgent.match(/MSIE [67]./)) { window.BOOMR.snippetMethod = "s"; bootstrap(parentNode, "boomr-async"); return; } iframe = document.createElement("IFRAME"); iframe.src = "about:blank"; iframe.title = ""; iframe.role = "presentation"; iframe.loading = "eager"; iframeStyle = (iframe.frameElement || iframe).style; iframeStyle.width = 0; iframeStyle.height = 0; iframeStyle.border = 0; iframeStyle.display = "none"; parentNode.appendChild(iframe); try { win = iframe.contentWindow; doc = win.document.open(); } catch (e) { dom = document.domain; iframe.src = "javascript:var d=document.open();d.domain='" + dom + "';void(0);"; win = iframe.contentWindow; doc = win.document.open(); } if (dom) { doc._boomrl = function() { this.domain = dom; bootstrap(); }; doc.write("<body onload='document._boomrl();'>"); } else { win._boomrl = function() { bootstrap(); }; if (win.addEventListener) { win.addEventListener("load", win._boomrl, false); } else if (win.attachEvent) { win.attachEvent("onload", win._boomrl); } } doc.close(); } var link = document.createElement("link"); if (link.relList && typeof link.relList.supports === "function" && link.relList.supports("preload") && ("as" in link)) { window.BOOMR.snippetMethod = "p"; link.href = window.BOOMR.url; link.rel = "preload"; link.as = "script"; link.addEventListener("load", promote); link.addEventListener("error", function() { iframeLoader(true); }); setTimeout(function() { if (!promoted) { iframeLoader(true); } }, LOADER_TIMEOUT); BOOMR_lstart = new Date().getTime(); parentNode.appendChild(link); } else { iframeLoader(false); } function boomerangSaveLoadTime(e) { window.BOOMR_onload = (e && e.timeStamp) || new Date().getTime(); } if (window.addEventListener) { window.addEventListener("load", boomerangSaveLoadTime, false); } else if (window.attachEvent) { window.attachEvent("onload", boomerangSaveLoadTime); } if (document.addEventListener) { document.addEventListener("onBoomerangLoaded", function(e) { e.detail.BOOMR.init({ ResourceTiming: { enabled: true, trackedResourceTypes: ["script", "img", "css"] }, }); e.detail.BOOMR.t_end = new Date().getTime(); }); } else if (document.attachEvent) { document.attachEvent("onpropertychange", function(e) { if (!e) e=event; if (e.propertyName === "onBoomerangLoaded") { e.detail.BOOMR.init({ ResourceTiming: { enabled: true, trackedResourceTypes: ["script", "img", "css"] }, }); e.detail.BOOMR.t_end = new Date().getTime(); } }); } })();</script> </head> <body id="eu-perusteos-2-uudistettu-laitos" class="template-product"> <a href="#main-content" class="skip-to-content-link">Siirry suoraan sisältöön</a> <div id="shopify-section-header" class="shopify-section"><style> .logo__image-wrapper { max-width: 260px; } /*================= If logo is above navigation ================== */ .site-nav { border-top: 1px solid #bebebe; border-bottom: 1px solid #bebebe; margin-top: 30px; } /*============ If logo is on the same line as navigation ============ */ </style> <nav class="visually-hidden" aria-label="Liiku sivulla seuraavien linkkien avulla"> <a href="#AccessibleNav">Siirry navigaatioon</a> <a href="#main-content">Siirry sisältöön </a><a href="#footer">Siirry sivun alatunnisteeseen</a> </nav> <div data-section-id="header" data-section-type="header-section"> <div class="header-bar"> <div class="wrapper medium-down--hide"> <div class="post-large--display-table"> <div class="header-bar__left post-large--display-table-cell"> <div class="header-bar__module header-bar__message"> Ulkoministeriön julkaisujen verkkokauppa </div> </div> <div class="header-bar__right post-large--display-table-cell"> <div class="header-bar__module"><nav class="ly-custom-768" aria-label="valitse kieli"></nav></div> <span class="header-bar__sep" aria-hidden="true"></span> <ul class="header-bar__module header-bar__module--list"> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/account/login" id="customer_login_link">UM-Kirjautuminen</a> </li> </ul> <div class="header-bar__module"> <span class="header-bar__sep" aria-hidden="true"></span> <a href="/web/20231121174249/https://julkaisut.um.fi/cart" class="cart-page-link"> <span class="icon icon-cart header-bar__cart-icon" aria-hidden="true"></span> Ostoskori <span class="cart-count header-bar__cart-count hidden-count">0</span> </a> </div> <div class="header-bar__module header-bar__search"> <form action="/web/20231121174249/https://julkaisut.um.fi/search" method="get" class="header-bar__search-form clearfix" role="search"> <button type="submit" class="btn btn--search icon-fallback-text header-bar__search-submit"> <span class="icon icon-search" aria-hidden="true"></span> <span class="fallback-text">Hae</span> </button> <input type="search" name="q" value="" aria-label="Hae" class="header-bar__search-input" placeholder="Hae"> </form> </div> </div> </div> </div> <div class="wrapper post-large--hide announcement-bar--mobile"> <span>Ulkoministeriön julkaisujen verkkokauppa</span> </div> <div class="wrapper post-large--hide"> <button type="button" class="mobile-nav-trigger" id="MobileNavTrigger" aria-controls="MobileNav" aria-expanded="false"> <span class="icon icon-hamburger" aria-hidden="true"></span> Valikko </button> <a href="/web/20231121174249/https://julkaisut.um.fi/cart" class="cart-page-link mobile-cart-page-link"> <span class="icon icon-cart header-bar__cart-icon" aria-hidden="true"></span> Ostoskori <span class="cart-count hidden-count">0</span> </a> </div> <nav role="navigation"> <ul id="MobileNav" class="mobile-nav post-large--hide"> <li class="mobile-nav__link"> <a href="/web/20231121174249/https://julkaisut.um.fi/" class="mobile-nav"> Etusivu </a> </li> <li class="mobile-nav__link" aria-haspopup="true"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kehitysviestinta" class="mobile-nav__sublist-trigger" aria-controls="MobileNav-Parent-2" aria-expanded="false"> Kehitysviestintä <span class="icon-fallback-text mobile-nav__sublist-expand" aria-hidden="true"> <span class="icon icon-plus" aria-hidden="true"></span> <span class="fallback-text">+</span> </span> <span class="icon-fallback-text mobile-nav__sublist-contract" aria-hidden="true"> <span class="icon icon-minus" aria-hidden="true"></span> <span class="fallback-text">-</span> </span> </a> <ul id="MobileNav-Parent-2" class="mobile-nav__sublist"> <li class="mobile-nav__sublist-link "> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kehitysviestinta" class="site-nav__link">Kaikki <span class="visually-hidden">Kehitysviestintä</span></a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/globaalikasvatus"> Globaalikasvatus </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kehityspolitiikka"> Kehityspolitiikka </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kehityslehti"> Kehitys-Utveckling-lehti </a> </li> </ul> </li> <li class="mobile-nav__link" aria-haspopup="true"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/eurooppatiedotus" class="mobile-nav__sublist-trigger" aria-controls="MobileNav-Parent-3" aria-expanded="false"> Eurooppatiedotus <span class="icon-fallback-text mobile-nav__sublist-expand" aria-hidden="true"> <span class="icon icon-plus" aria-hidden="true"></span> <span class="fallback-text">+</span> </span> <span class="icon-fallback-text mobile-nav__sublist-contract" aria-hidden="true"> <span class="icon icon-minus" aria-hidden="true"></span> <span class="fallback-text">-</span> </span> </a> <ul id="MobileNav-Parent-3" class="mobile-nav__sublist"> <li class="mobile-nav__sublist-link "> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/eurooppatiedotus" class="site-nav__link">Kaikki <span class="visually-hidden">Eurooppatiedotus</span></a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kirjat-ja-esitteet"> Kirjat ja esitteet </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/muut-julkaisut"> Muut julkaisut </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/arkisto"> Arkisto </a> </li> </ul> </li> <li class="mobile-nav__link"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/ulko-ja-turvallisuuspolitiikka" class="mobile-nav"> Ulko- ja turvallisuuspolitiikka </a> </li> <li class="mobile-nav__link"> <a href="/web/20231121174249/https://julkaisut.um.fi/account/login" id="mobile_customer_login_link">UM-Kirjautuminen</a> </li> <li class="mobile-nav__link"> <div class="header-bar__module header-bar__search"> <form action="/web/20231121174249/https://julkaisut.um.fi/search" method="get" class="header-bar__search-form clearfix" role="search"> <button type="submit" class="btn btn--search icon-fallback-text header-bar__search-submit"> <span class="icon icon-search" aria-hidden="true"></span> <span class="fallback-text">Hae</span> </button> <input type="search" name="q" value="" aria-label="Hae" class="header-bar__search-input" placeholder="Hae"> </form> </div> </li> <li class="mobile-nav__link text-center"> <div class="header-bar__module header-bar__ly-switcher"> <nav class="ly-custom-0" aria-label="valitse kieli"></nav> </div> </li> </ul> </nav> </div> <header class="site-header" role="banner"> <div class="wrapper"> <div class="grid--full"> <div class="grid__item"> <div class="h1 site-header__logo" itemscope itemtype="http://schema.org/Organization"> <noscript> <span class="logo__image-wrapper"> <img src="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/files/UM-julkaisupalvelut-logo-740x200_260x.png?v=1613591426" alt="UM julkaisupalvelut"/> </span> </noscript> <span class="logo__image-wrapper supports-js"><a href="/web/20231121174249/https://julkaisut.um.fi/" itemprop="url" style="padding-top:27.02702702702703%;"> <span class="visually-hidden">Siirry etusivulle</span> <img class="logo__image lazyload" src="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/files/UM-julkaisupalvelut-logo-740x200_1x1.png?v=1613591426" data-src="//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/shop/files/UM-julkaisupalvelut-logo-740x200_{width}x.png?v=1613591426" data-widths="[120, 180, 360, 540, 720, 900, 1080, 1296, 1512, 1728, 1944, 2048]" data-aspectratio="3.7" data-sizes="auto" alt="" itemprop="logo"></a></span> </div> </div> </div> <div class="grid--full medium-down--hide"> <div class="grid__item"> <nav> <ul class="site-nav" id="AccessibleNav"> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/" class="site-nav__link" data-meganav-type="child"> Etusivu </a> </li> <li class="site-nav--has-dropdown " aria-haspopup="true"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kehitysviestinta" class="site-nav__link" data-meganav-type="parent" aria-controls="MenuParent-2" aria-expanded="false"> Kehitysviestintä <span class="icon icon-arrow-down" aria-hidden="true"></span> </a> <ul id="MenuParent-2" class="site-nav__dropdown " data-meganav-dropdown> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/globaalikasvatus" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Globaalikasvatus </a> </li> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kehityspolitiikka" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Kehityspolitiikka </a> </li> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kehityslehti" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Kehitys-Utveckling-lehti </a> </li> </ul> </li> <li class="site-nav--has-dropdown " aria-haspopup="true"> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/eurooppatiedotus" class="site-nav__link" data-meganav-type="parent" aria-controls="MenuParent-3" aria-expanded="false"> Eurooppatiedotus <span class="icon icon-arrow-down" aria-hidden="true"></span> </a> <ul id="MenuParent-3" class="site-nav__dropdown " data-meganav-dropdown> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/kirjat-ja-esitteet" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Kirjat ja esitteet </a> </li> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/muut-julkaisut" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Muut julkaisut </a> </li> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/arkisto" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Arkisto </a> </li> </ul> </li> <li> <a href="/web/20231121174249/https://julkaisut.um.fi/collections/ulko-ja-turvallisuuspolitiikka" class="site-nav__link" data-meganav-type="child"> Ulko- ja turvallisuuspolitiikka </a> </li> </ul> </nav> </div> </div> </div> </header> </div> </div> <main class="wrapper main-content" role="main" id="main-content"> <div class="grid"> <div class="grid__item"> <div id="shopify-section-product-template" class="shopify-section"> <div itemscope itemtype="http://schema.org/Product" id="ProductSection" data-section-id="product-template" data-section-type="product-template" data-image-zoom-type="lightbox" data-show-extra-tab="false" data-extra-tab-content="" data-enable-history-state="true"> <style> @media screen and (min-width: 769px){ .single-option-selector, .quantity-selector { min-width: 50%; } } </style> <meta itemprop="url" content="https://web.archive.org/web/20231121174249/https://julkaisut.um.fi/products/eu-perusteos-2-uudistettu-laitos"> <meta itemprop="image" content="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/products/EU-perusteotetukansi_grande.jpg?v=1588077390"> <div class="section-header section-header--breadcrumb"> <nav class="breadcrumb" role="navigation" aria-label="Murupolku"> <a href="/web/20231121174249/https://julkaisut.um.fi/" title="Takaisin etusivulle">Koti</a> <span aria-hidden="true" class="breadcrumb__sep">&rsaquo;</span> <span>EU-perusteos, 2. uudistettu laitos</span> </nav> </div> <div class="product-single"> <div class="grid product-single__hero"> <div class="grid__item post-large--one-half"> <div class="grid"> <div class="grid__item four-fifths product-single__photos" id="ProductPhoto"> <style> #ProductImage-14127147450419 { max-width: 629px; max-height: 913px; } #ProductImageWrapper-14127147450419 { max-width: 629px; } </style> <div id="ProductImageWrapper-14127147450419" class="product-single__image-wrapper supports-js zoom-lightbox" data-image-id="14127147450419"> <div style="padding-top:145.1510333863275%;"> <img id="ProductImage-14127147450419" class="product-single__image lazyload" src="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/products/EU-perusteotetukansi_300x300.jpg?v=1588077390" data-src="//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/shop/products/EU-perusteotetukansi_{width}x.jpg?v=1588077390" data-widths="[180, 370, 540, 740, 900, 1080, 1296, 1512, 1728, 2048]" data-aspectratio="0.6889375684556407" data-sizes="auto" alt="Tuotekuva EU-perusteos, 2. uudistettu laitos"> </div> </div> <style> #ProductImage-14127147483187 { max-width: 662px; max-height: 916px; } #ProductImageWrapper-14127147483187 { max-width: 662px; } </style> <div id="ProductImageWrapper-14127147483187" class="product-single__image-wrapper supports-js hide zoom-lightbox" data-image-id="14127147483187"> <div style="padding-top:138.36858006042297%;"> <img id="ProductImage-14127147483187" class="product-single__image lazyload lazypreload" data-src="//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/shop/products/EU-perusteostakakansi_{width}x.jpg?v=1588077390" data-widths="[180, 370, 540, 740, 900, 1080, 1296, 1512, 1728, 2048]" data-aspectratio="0.722707423580786" data-sizes="auto" alt="Tuotekuva EU-perusteos, 2. uudistettu laitos"> </div> </div> <noscript> <img src="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/products/EU-perusteotetukansi_1024x1024@2x.jpg?v=1588077390" alt=""> </noscript> </div> <div class="grid__item one-fifth"> <ul class="grid product-single__thumbnails" id="ProductThumbs"> <li class="grid__item"> <a data-image-id="14127147450419" href="//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/shop/products/EU-perusteotetukansi_1024x1024.jpg?v=1588077390" class="product-single__thumbnail"> <img src="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/products/EU-perusteotetukansi_grande.jpg?v=1588077390" alt="Lataa kuva Galleria-katseluun, tuotekuva 1"> </a> </li> <li class="grid__item"> <a data-image-id="14127147483187" href="//web.archive.org/web/20231121174249/https://julkaisut.um.fi/cdn/shop/products/EU-perusteostakakansi_1024x1024.jpg?v=1588077390" class="product-single__thumbnail"> <img src="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/products/EU-perusteostakakansi_grande.jpg?v=1588077390" alt="Lataa kuva Galleria-katseluun, tuotekuva 2"> </a> </li> </ul> </div> </div> <ul class="gallery hidden"> <li data-image-id="14127147450419" class="gallery__item" data-mfp-src="//julkaisut.um.fi/cdn/shop/products/EU-perusteotetukansi_1024x1024@2x.jpg?v=1588077390"></li> <li data-image-id="14127147483187" class="gallery__item" data-mfp-src="//julkaisut.um.fi/cdn/shop/products/EU-perusteostakakansi_1024x1024@2x.jpg?v=1588077390"></li> </ul> </div> <div class="grid__item post-large--one-half"> <h1 class="product-single__title" itemprop="name">EU-perusteos, 2. uudistettu laitos</h1> <div class="product-description rte" itemprop="description"> <div id="mailtoikkunatoPopupModal" style="z-index: 1; display: none;"> <div id="mailtoikkunacontentModalMailTo"> <div id="mailtoikkunapopupTo"></div> <div id="mailtoikkunamodalPopup">What do you want to do ?</div> <a id="mailtoikkunacreateOpenButtonAppEmail">New mail</a><button id="mailtoikkunaemailButton">Copy</button><textarea id="mailtoikkunaclipboardToArea"></textarea> </div> </div> Miten Suomesta tuli Euroopan unionin jäsen?<br>Millaista valtaa on mepeillä?<br>Onko subsidiariteettiperiaate jotain syötävää?<br>Kuinka EU:hun pääsee töihin?<br>Millaisten ongelmien ratkaisemiseen unionin pitää keskittyä lähivuosina?<br>Entä mitä hyötyä EU:sta on juuri sinulle?<br><br>Näihin ja lukuisiin muihin EU:n toimintaa koskeviin kysymyksiin löydät vastauksen tästä kirjasta.<br> </div> <div itemprop="offers" itemscope itemtype="http://schema.org/Offer"> <meta itemprop="priceCurrency" content="EUR"> <link itemprop="availability" href="http://schema.org/InStock"> <form method="post" action="/web/20231121174249/https://julkaisut.um.fi/cart/add" id="product_form_4517818269747" accept-charset="UTF-8" class="product-form--wide product-form--um" enctype="multipart/form-data"><input type="hidden" name="form_type" value="product"/><input type="hidden" name="utf8" value="✓"/> <select name="id" id="ProductSelect-product-template" class="product-single__variants"> <option selected="selected" data-sku="ET-100047-FI" value="31927893622835">Default Title - €0,00 EUR</option> </select> <div class="product-single__quantity"> <label for="Quantity">Määrä</label> <input type="number" id="Quantity" name="quantity" value="1" min="1" class="quantity-selector"> </div> <button type="submit" name="add" id="AddToCart" class="btn btn--wide"> <span id="AddToCartText">Lisää ostoskoriin</span> </button> <input type="hidden" id="et" name="properties[Osasto]" value="Eurooppatiedotus"/> <input type="hidden" id="hyväksyntäraja" name="properties[Tilausraja]" value="20"/> <p class="availability-string"> <span class="availability good">Saatavilla painettuna versiona</span> </p> <hr> <div class="download-links"> <a href="https://web.archive.org/web/20231121174249/https://cdn.accentuate.io/4517818269747/11692919193651/EU-perusteos_Brexit-laitos_PDF-ekirja_Kaikki_linkit-v1595329724839.pdf" class="btn--link" target="_blank" hreflang="fi"><i class="polaris-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20"><path d="M9.293 13.707l-3-3a.999.999 0 1 1 1.414-1.414L9 10.586V3a1 1 0 1 1 2 0v7.586l1.293-1.293a.999.999 0 1 1 1.414 1.414l-3 3a.999.999 0 0 1-1.414 0zM17 16a1 1 0 1 1 0 2H3a1 1 0 1 1 0-2h14z" fill="#212B36"/></svg> </i> Lataa PDF-Versio (<span aria-label="Tiedostokoko">8,76 MB</span>)</a> <a href="https://web.archive.org/web/20231121174249/https://kirja.elisa.fi/ekirja/eu-perusteos-0" class="btn--link" target="_blank" hreflang="fi"><i class="polaris-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20"><path d="M6.534 18a4.507 4.507 0 0 1-3.208-1.329 4.54 4.54 0 0 1 0-6.414l1.966-1.964a.999.999 0 1 1 1.414 1.414L4.74 11.671a2.54 2.54 0 0 0 0 3.586c.961.959 2.631.958 3.587 0l1.966-1.964a1 1 0 1 1 1.415 1.414l-1.966 1.964A4.503 4.503 0 0 1 6.534 18zm7.467-6a.999.999 0 0 1-.707-1.707l1.966-1.964a2.54 2.54 0 0 0 0-3.586c-.961-.959-2.631-.957-3.587 0L9.707 6.707a1 1 0 1 1-1.415-1.414l1.966-1.964A4.503 4.503 0 0 1 13.466 2c1.211 0 2.351.472 3.208 1.329a4.541 4.541 0 0 1 0 6.414l-1.966 1.964a.997.997 0 0 1-.707.293zm-6.002 1a.999.999 0 0 1-.707-1.707l4.001-4a1 1 0 1 1 1.415 1.414l-4.001 4a1 1 0 0 1-.708.293z" fill="#212B36"/></svg> </i> Lue E-Julkaisuna</a> </div> <input type="hidden" name="product-id" value="4517818269747"/></form> <!-- description before --> <div class="product-metafields"> <div class="grid-container"> <div class="grid-item meta-title"> <p class="product-single__lineitem"> SKU:   </p> </div> <div class="grid-item"> <p class="product-single__lineitem"> ET-100047-FI </p> </div> <div class="grid-item"> <p class="product-single__lineitem"> </p> </div> <div class="grid-item meta-title"> <p class="product-single__lineitem"> Julkaisuvuosi:  </p> </div> <div class="grid-item"><p class="product-single__lineitem"> 2020 </p> </div> <div class="grid-item"> <p class="product-single__lineitem"> </p> </div> <div class="grid-item meta-title"> <p class="product-single__lineitem"> Julkaisija:  </p> </div> <div class="grid-item"><p class="product-single__lineitem"> Eurooppatiedotus </p> </div> <div class="grid-item"> <p class="product-single__lineitem"> </p> </div> <div class="grid-item meta-title"> <p class="product-single__lineitem"> Kirjoittaja:  </p> </div> <div class="grid-item"><p class="product-single__lineitem"> Heli Satuli </p> </div> <div class="grid-item"> <p class="product-single__lineitem"> </p> </div> <div class="grid-item meta-title"> <p class="product-single__lineitem"> ISBN:  </p> </div> <div class="grid-item"> <p class="product-single__lineitem"> 978-952-281-658-0 (print) </p> </div> <div class="grid-item"> <p class="product-single__lineitem"> </p> </div> <div class="grid-item meta-title"> <p class="product-single__lineitem"> Kieli: </p> </div> <div class="grid-item"><p class="product-single__lineitem"> SUOMI </p></div> </div> </div> </div> </div> </div> </div> </div> <script type="application/json" id="ProductJson-product-template"> {"id":4517818269747,"title":"EU-perusteos, 2. uudistettu laitos","handle":"eu-perusteos-2-uudistettu-laitos","description":"\u003cdiv id=\"mailtoikkunatoPopupModal\" style=\"z-index: 1; display: none;\"\u003e\n\u003cdiv id=\"mailtoikkunacontentModalMailTo\"\u003e\n\u003cdiv id=\"mailtoikkunapopupTo\"\u003e\u003c\/div\u003e\n\u003cdiv id=\"mailtoikkunamodalPopup\"\u003eWhat do you want to do ?\u003c\/div\u003e\n\u003ca id=\"mailtoikkunacreateOpenButtonAppEmail\"\u003eNew mail\u003c\/a\u003e\u003cbutton id=\"mailtoikkunaemailButton\"\u003eCopy\u003c\/button\u003e\u003ctextarea id=\"mailtoikkunaclipboardToArea\"\u003e\u003c\/textarea\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\nMiten Suomesta tuli Euroopan unionin jäsen?\u003cbr\u003eMillaista valtaa on mepeillä?\u003cbr\u003eOnko subsidiariteettiperiaate jotain syötävää?\u003cbr\u003eKuinka EU:hun pääsee töihin?\u003cbr\u003eMillaisten ongelmien ratkaisemiseen unionin pitää keskittyä lähivuosina?\u003cbr\u003eEntä mitä hyötyä EU:sta on juuri sinulle?\u003cbr\u003e\u003cbr\u003eNäihin ja lukuisiin muihin EU:n toimintaa koskeviin kysymyksiin löydät vastauksen tästä kirjasta.\u003cbr\u003e","published_at":"2020-05-08T15:10:33+03:00","created_at":"2020-04-28T15:36:29+03:00","vendor":"UM julkaisupalvelut","type":"","tags":["alert:400","ET","eurooppatiedotus","hyväksyntäraja:20","kirjat ja esitteet","language:fi","producttype:e-kirja","producttype:fyysinen","producttype:pdf"],"price":0,"price_min":0,"price_max":0,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":31927893622835,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"ET-100047-FI","requires_shipping":true,"taxable":false,"featured_image":null,"available":true,"name":"EU-perusteos, 2. uudistettu laitos","public_title":null,"options":["Default Title"],"price":0,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"978-952-281-658-0 (print)"}],"images":["\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteotetukansi.jpg?v=1588077390","\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteostakakansi.jpg?v=1588077390"],"featured_image":"\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteotetukansi.jpg?v=1588077390","options":["Title"],"media":[{"alt":null,"id":6298399866931,"position":1,"preview_image":{"aspect_ratio":0.689,"height":913,"width":629,"src":"\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteotetukansi.jpg?v=1588077390"},"aspect_ratio":0.689,"height":913,"media_type":"image","src":"\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteotetukansi.jpg?v=1588077390","width":629},{"alt":null,"id":6298399899699,"position":2,"preview_image":{"aspect_ratio":0.723,"height":916,"width":662,"src":"\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteostakakansi.jpg?v=1588077390"},"aspect_ratio":0.723,"height":916,"media_type":"image","src":"\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi\/cdn\/shop\/products\/EU-perusteostakakansi.jpg?v=1588077390","width":662}],"content":"\u003cdiv id=\"mailtoikkunatoPopupModal\" style=\"z-index: 1; display: none;\"\u003e\n\u003cdiv id=\"mailtoikkunacontentModalMailTo\"\u003e\n\u003cdiv id=\"mailtoikkunapopupTo\"\u003e\u003c\/div\u003e\n\u003cdiv id=\"mailtoikkunamodalPopup\"\u003eWhat do you want to do ?\u003c\/div\u003e\n\u003ca id=\"mailtoikkunacreateOpenButtonAppEmail\"\u003eNew mail\u003c\/a\u003e\u003cbutton id=\"mailtoikkunaemailButton\"\u003eCopy\u003c\/button\u003e\u003ctextarea id=\"mailtoikkunaclipboardToArea\"\u003e\u003c\/textarea\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\nMiten Suomesta tuli Euroopan unionin jäsen?\u003cbr\u003eMillaista valtaa on mepeillä?\u003cbr\u003eOnko subsidiariteettiperiaate jotain syötävää?\u003cbr\u003eKuinka EU:hun pääsee töihin?\u003cbr\u003eMillaisten ongelmien ratkaisemiseen unionin pitää keskittyä lähivuosina?\u003cbr\u003eEntä mitä hyötyä EU:sta on juuri sinulle?\u003cbr\u003e\u003cbr\u003eNäihin ja lukuisiin muihin EU:n toimintaa koskeviin kysymyksiin löydät vastauksen tästä kirjasta.\u003cbr\u003e"} </script> </div> <div id="shopify-section-product-recommendations" class="shopify-section"> <hr class="hr--clear hr--small"><div data-product-id="4517818269747" data-section-id="product-recommendations" data-section-type="product-recommendations"></div> </div><script data-locksmith> var load = function () { if (document.querySelectorAll('.locksmith-manual-trigger').length > 0) { Locksmith.ping(); } Locksmith.util.on('submit', 'locksmith-resource-form', function (event) { event.preventDefault(); var data = Locksmith.util.serializeForm(event.target); Locksmith.postResource(data, { spinner: false, container: 'locksmith-content' }); }); Locksmith.util.on('click', 'locksmith-manual-trigger', function (event) { event.preventDefault(); Locksmith.postResource({}, { spinner: true, container: document }); }); Locksmith.submitPasscode = function (passcode) { Locksmith.postResource( { passcode: passcode }, { spinner: false, container: 'locksmith-content' } ); }; }; if (typeof Locksmith !== 'undefined') { load(); } else { window.addEventListener('load', load); } </script> </div> </div> </main> <div id="shopify-section-footer" class="shopify-section"><footer class="site-footer small--text-center" role="contentinfo" id="footer"> <div class="wrapper"> <div class="grid-uniform"> <div class="grid__item post-large--one-third medium--one-third"> <div class="logo-image"> <a href="https://web.archive.org/web/20231121174249/https://um.fi/etusivu" target="_blank"> <img class="footer-logo-image" src="//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/files/UM_tunnus_valkoinen_150_150x.png?v=1613591427" alt="UM julkaisupalvelut"> </a> </div> </div> <div class="grid__item post-large--one-third medium--one-third"> <h3 class="h4">Pikalinkit</h3> <ul class="site-footer__links"> <li><a href="/web/20231121174249/https://julkaisut.um.fi/search">Haku</a></li> <li><a href="https://web.archive.org/web/20231121174249/https://um.fi/tietosuoja">Tietosuojakäytäntömme</a></li> <li><a href="/web/20231121174249/https://julkaisut.um.fi/pages/saavutettavuusseloste">Saavutettavuusseloste</a></li> </ul> </div> <div class="grid__item post-large--one-third medium--one-third"> <h3 class="h4">Ota yhteyttä</h3> <div class="rte"><p>Kehitysviestintä: VIE-30@gov.fi</p><p>Eurooppatiedotus: eurooppatiedotus.um@gov.fi</p><p>Tekniset ongelmat: hankintaneuvonta.um@gov.fi</p></div> </div> </div> <hr class="hr--small hr--clear"> <div class="grid"> <div class="grid__item text-center"> <p class="site-footer__links">Tekijänoikeus &copy; 2023, <a href="/web/20231121174249/https://julkaisut.um.fi/" title="">UM julkaisupalvelut</a>. Shopify-verkkokaupat</p> </div> </div> </div> </footer> </div> <script src="//web.archive.org/web/20231121174249js_/https://julkaisut.um.fi/cdn/shopifycloud/shopify/assets/themes_support/option_selection-86cdd286ddf3be7e25d68b9fc5965d7798a3ff6228ff79af67b3f4e41d6a34be.js"></script> <ul hidden> <li id="a11y-refresh-page-message">vaihtoehdon valinta päivittää koko sivun</li> </ul> <script src="//web.archive.org/web/20231121174249js_/https://julkaisut.um.fi/cdn/shop/t/2/assets/theme.js?v=91880697166963594201610524510"></script> <!-- Matomo --> <script> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://web.archive.org/web/20231121174249/https://seuranta.finland.fi/piwik/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '105']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <noscript><p><img src="https://web.archive.org/web/20231121174249im_/https://seuranta.finland.fi/piwik/matomo.php?idsite=105&amp;rec=1" style="border:0;" alt=""/></p></noscript> <!-- End Matomo Code --> <!-- langify-v2-scripts-begin --> <script> var langify = langify || {}; /** * * * @class LyHelper */ class LyHelper { constructor() { return { ajax: function(params) { return LyHelper.ajax(params); }, isIE: function() { return LyHelper.isIE(); }, extractImageObject: function(val) { return LyHelper.extractImageObject(val); }, getCurrentLanguage: function() { return LyHelper.getCurrentLanguage(); }, getCookie: function(name) { return LyHelper.getCookie(name); }, setCookie: function(name, value, days) { return LyHelper.setCookie(name, value, days); }, getVersion: function() { return LyHelper.getVersion(); }, isOutOfViewport: function(elem) { return LyHelper.isOutOfViewport(elem); }, isDomainFeatureEnabled: function() { return LyHelper.isDomainFeatureEnabled(); }, getVal: function(str) { return LyHelper.getVal(str); }, inIframe: function() { return LyHelper.inIframe(); }, shopifyAPI: function() { return LyHelper.shopifyAPI(); }, loadScript: function(url, callback) { return LyHelper.loadScript(url, callback); }, localizationRedirect: function(type, code, additionalFields, additionalParams, domain) { return LyHelper.localizationRedirect(type, code, additionalFields, additionalParams, domain); }, changeCurrency: function(code) { return LyHelper.changeCurrency(code); }, log: function(title, data, type) { return LyHelper.log(title, data, type); }, } } static ajax(params) { var data = params.data; fetch(params.url, { method: params.method, headers: { 'Content-Type': 'application/json', }, body: (data && params.method === 'POST') ? JSON.stringify(data) : null, }) .then(response => response.json()) .then(data => { params.success(data); }) .catch((error) => { console.error('Error:', error); }); } static isIE() { var ua = navigator.userAgent; var is_ie = ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1; return is_ie; } static extractImageObject(val) { if(!val || val == '') return false; var val = val; // Handle src-sets if(val.search(/([0-9]+w?h?x?,)/gi) > -1) { val = val.split(/([0-9]+w?h?x?,)/gi)[0]; } var hostBegin = val.indexOf('//') ? val.indexOf('//') : 0; var hostEnd = val.lastIndexOf('/') + 1; var host = val.substring(hostBegin, hostEnd); var afterHost = val.substring(hostEnd, val.length); var url = val; var file = ''; var name = ''; var type = ''; afterHost = afterHost.substring(0, (afterHost.indexOf("#") == -1) ? afterHost.length : afterHost.indexOf("#")); afterHost = afterHost.substring(0, (afterHost.indexOf("?") == -1) ? afterHost.length : afterHost.indexOf("?")); name = afterHost.replace(/(_[0-9]+x[0-9]*|_{width}x|_{size})?(_crop_(top|center|bottom|left|right))?(@[0-9]*x)?(\.progressive)?\.(png\.jpg|jpe?g|png|gif|webp)/gi, ""); if(afterHost.search(/(\.png\.jpg|\.jpg\.jpg)/gi) > -1) { type = afterHost.substring(afterHost.search(/(\.png\.jpg|\.jpg\.jpg)/gi)+1, afterHost.length); } else { type = afterHost.substring(afterHost.lastIndexOf('.')+1, afterHost.length); } file = afterHost.replace(/(_[0-9]+x[0-9]*|_{width}x|_{size})?(_crop_(top|center|bottom|left|right))?(@[0-9]*x)?(\.progressive)?\.(png\.jpg|jpe?g|png|gif|webp)/gi, '.'+type); return { host: host, name: name, type: type, file: file } } static getCurrentLanguage() { return window.langify.locale.iso_code; } static setLanguage(code) { } static getCookie(name) { var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); if(v) return v[2]; else return null; } static setCookie(name, value, days) { var d = new Date; d.setTime(d.getTime() + 24*60*60*1000*days); document.cookie = name + "=" + value + ";path=/;expires=" + d.toGMTString(); } static getVersion() { return 2; } static isOutOfViewport (elem) { var bounding = elem.getBoundingClientRect(); var out = {}; out.top = bounding.top < 0; out.left = bounding.left < 0; out.bottom = Math.ceil(bounding.bottom) >= (window.innerHeight || document.documentElement.clientHeight); out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth); out.any = out.top || out.left || out.bottom || out.right; out.inViewport = bounding.x > 0 && bounding.y > 0; return out; } static isDomainFeatureEnabled() { return window.langify.locale.domain_feature_enabled; } static getVal(str) { var v = window.location.search.match(new RegExp('(?:[?&]'+str+'=)([^&]+)')); return v ? v[1] : null; } static inIframe() { try { return window.self !== window.top; } catch (e) { return true; } } static shopifyAPI() { var root_url = window.langify.locale.root_url != '/' ? window.langify.locale.root_url : ''; return { attributeToString: function(attribute) { if((typeof attribute) !== 'string') { attribute += ''; if(attribute === 'undefined') {attribute = '';} } return attribute.trim(); }, getCart: function(callback) { LyHelper.ajax({ method: 'GET', url: root_url+'/cart.js', success: function (cart, textStatus) { if((typeof callback) === 'function') { callback(cart); } } }); }, updateCartNote: function(note, callback) { var params = { method: 'POST', url: root_url+'/cart/update.js', data: 'note=' + this.attributeToString(note), dataType: 'json', success: function(cart) {if((typeof callback) === 'function') {callback(cart);}}, error: this.onError }; LyHelper.ajax(params); }, updateCartAttributes: function(attributes, callback) { var params = { method: 'POST', url: root_url+'/cart/update.js', data: {"attributes": attributes}, dataType: 'json', success: function(cart) { if((typeof callback) === 'function') { callback(cart); } }, error: this.onError }; LyHelper.ajax(params); }, onError: function(XMLHttpRequest, textStatus) { } } } static loadScript(url, callback) { var script = document.createElement('script'); script.type = 'text/javascript'; if(script.readyState) { script.onreadystatechange = function () { if(script.readyState == 'loaded' || script.readyState == 'complete') { script.onreadystatechange = null; callback(); } }; } else { script.onload = function () { callback(); }; } script.src = url; document.getElementsByTagName('head')[0].appendChild(script); } static localizationRedirect(type, code, additionalFields, additionalParams, domain) { if(type !== 'country_code' && type !== 'language_code') { return false; } if(!additionalParams) { var additionalParams = ''; } if(domain) { window.location.href = domain; return true; } var params = [ { name: type, value: code }, { name: 'return_to', value: window.location.pathname + window.location.search + additionalParams + window.location.hash }, { name: 'form_type', value: 'localization' }, { name: '_method', value: 'put' } ]; if(additionalFields) { for(var i=0; i<additionalFields.length; i++) { params.push(additionalFields[i]); } } const form = document.createElement('form'); form.method = 'POST'; form.action = '/localization'; params.forEach(function(param) { const field = document.createElement('input'); field.type = 'hidden'; field.name = param['name']; field.value = param['value']; form.appendChild(field); }); document.body.appendChild(form); form.submit(); } static changeCurrency(code) { const params = [ { name: 'currency_code', value: code }, { name: 'return_to', value: window.location.pathname + window.location.search + window.location.hash }, { name: 'form_type', value: 'localization' }, { name: '_method', value: 'put' } ]; const form = document.createElement('form'); form.method = 'POST'; form.action = '/localization'; params.forEach(function(param) { const field = document.createElement('input'); field.type = 'hidden'; field.name = param['name']; field.value = param['value']; form.appendChild(field); }); document.body.appendChild(form); form.submit(); } static log(title, data, type) { if(langify.settings.debug) { if(!data) { var data = ''; } var css = 'color: green; font-weight: bold;'; if(type === 'error') { css = 'color: red; font-weight: bold;'; } console.log(`%c ${title}: \n`, css, data); } } }; /** * * * @class TranslationObserver */ class TranslationObserver { constructor() { LyHelper.log('TranslationObserver instantiation') } init() { if(langify.settings.observe && !LyHelper.isIE()) { var langifyObserver = this.langifyObserverCore(); langifyObserver.init(); // HOTFIX: translation observer sometimes refuses to trigger on page load_ langifyObserver.triggerCustomContents(); langify.api = { observer: { start: langifyObserver.init, stop: langifyObserver.stopObserver, trigger: langifyObserver.triggerCustomContents } }; } return this; } langifyObserverCore() { var observedNodes = []; var intersectionObs = null; var mutationCount = 0; var mutationObs = null; var mutationObsConfig = { characterData: true, characterDataOldValue: true, attributes: true, attributeOldValue: true, childList: true, subtree: true, }; var customContents_html = {}; var customContents_text = {}; var customContents_attr = {}; function init() { if(langify.settings.observe) { spreadCustomContents(); if (window.MutationObserver) { if (langify.settings.lazyload && window.IntersectionObserver) { startIntersectionObserver(); } else { startMutationObserver(null); } } else { startMutationEvents(); } } } // Intersection Observer function startIntersectionObserver() { intersectionObs = new IntersectionObserver(callbackIntersectionChange); var elementNodes = document.getElementsByClassName('shopify-section'); Array.prototype.slice.call(elementNodes).forEach(function(node) { intersectionObs.observe(node); }); } function callbackIntersectionChange(intersections) { intersections.forEach(function(intersection) { var target = intersection.target; var targetIsIntersecting = Boolean(target.getAttribute('ly-is-intersecting') === "true" ? true : false); if(typeof targetIsIntersecting == 'undefined' || targetIsIntersecting == null) { target.setAttribute('ly-is-intersecting', intersection.isIntersecting); targetIsIntersecting = intersection.isIntersecting; } // On Screen if(targetIsIntersecting == false && intersection.isIntersecting == true) { if(!target.getAttribute('ly-is-observing')) { startMutationObserver(target); intersectionObs.unobserve(target); // As the mutation observer didn't see the "add" of the elememts, trigger the initial translation manually var elementNodes = getNodesUnder(target, 'SHOW_ELEMENT'); var textNodes = getNodesUnder(target, 'SHOW_TEXT'); var nodes = elementNodes.concat(textNodes); nodes.forEach(function(node) { translate(node, 'mutation -> childList'); }); } } // Off Screen //else if(targetIsIntersecting == true && intersection.isIntersecting == false) { // stopMutationObserver(target); //} target.setAttribute('ly-is-intersecting', intersection.isIntersecting); }); } // Mutation Observer function startMutationObserver(observerTarget) { if (!observerTarget) { var target = document.documentElement || document.body; // main window } else { if (observerTarget.nodeName === 'IFRAME') { try { var target = observerTarget.contentDocument || observerTarget.contentWindow.document; } catch { return false; } } else { var target = observerTarget; } } mutationObs = new MutationObserver(callbackDomChange); mutationObs.observe(target, mutationObsConfig); observedNodes.push(target); try { target.setAttribute('ly-is-observing', 'true'); } catch(e) {} } function stopMutationObserver(target) { if(observedNodes.indexOf(target) > -1) { observedNodes.splice(observedNodes.indexOf(target), 1); } var mutations = mutationObs.takeRecords(); mutationObs.disconnect(); observedNodes.forEach(node => { mutationObs.observe(node, mutationObsConfig); }); try { target.removeAttribute('ly-is-observing'); } catch(e) {} } function callbackDomChange(mutations, mutationObs) { for (var i = 0, length = mutations.length; i < length; i++) { var mutation = mutations[i]; var target = mutation.target; // Links-Hook if (mutation.type === 'attributes' && (mutation.attributeName === 'href' || mutation.attributeName === 'action')) { var target = mutation.target; translateLink(target.getAttribute(mutation.attributeName), target); } // Images-Hook else if (mutation.type === 'attributes' && (mutation.attributeName === 'src' || mutation.attributeName === 'data-src' || mutation.attributeName === 'srcset' || mutation.attributeName === 'data-srcset')) { translateImage(target, mutation.attributeName); } else if (mutation.type === 'attributes' && mutation.attributeName === 'style') { translateCssImage(target); } // Subtree Events else if (mutation.type === 'childList') { // Added Nodes if(mutation.addedNodes.length > 0) { var elementNodes = getNodesUnder(mutation.target, 'SHOW_ELEMENT'); var textNodes = getNodesUnder(mutation.target, 'SHOW_TEXT'); var nodes = elementNodes.concat(textNodes); nodes.forEach(function(node) { translate(node, 'mutation -> childList'); }); } } // CharacterData Events else if (mutation.type === 'characterData') { var target = mutation.target; translate(target, 'mutation -> characterData'); } } } function translate(node, info) { if((node.nodeType === 1 && node.hasAttribute('data-ly-locked')) || (node.nodeType === 3 && node.parentNode && node.parentNode.hasAttribute('data-ly-locked'))) { return; } // CC-Hook if (node.nodeName !== 'SCRIPT' && node.nodeName !== 'STYLE') { if (node.nodeType === 3) { translateTextNode(node, info); } translateNodeAttrs(node); } // Links-Hook if (node.nodeName === 'A' || node.nodeName === 'FORM') { if(node.hasAttribute('href')) var attrName = 'href'; else var attrName = 'action'; var url = node.getAttribute(attrName); translateLink(url, node); } // Images-Hook if (node.nodeName === 'IMG' || node.nodeName === 'SOURCE') { translateImage(node, ['src', 'data-src', 'srcset', 'data-srcset']); } if (node.attributes && node.getAttribute('style')) { translateCssImage(node); } // Iframe Observation if (node.nodeName === 'IFRAME') { // Todo: handle srcdoc iframe content observing if (node.getAttribute('ly-is-observing') == null && node.getAttribute('src') == null && !node.hasAttribute('srcdoc')) { node.setAttribute('ly-is-observing', 'true'); startMutationObserver(node); } } } function translateNodeAttrs(node) { if (node.attributes && node.getAttribute('placeholder')) { var src = node.getAttribute('placeholder').trim().replace(/(\r\n|\n|\r)/gim,"").replace(/\s+/g," ").toLowerCase(); if(customContents_text[src] && node.getAttribute('placeholder') !== customContents_text[src]) { node.setAttribute('placeholder', customContents_text[src]); } } } function translateTextNode(node, info) { if(langify.settings.observeCustomContents === false || !node.textContent || node.textContent.trim().length === 0) { return; } var src = node.textContent.trim().replace(/(\r\n|\n|\r)/gim,"").replace(/\s+/g," ").toLowerCase(); if(customContents_text[src] && node.textContent !== customContents_text[src]) { var newContent = node.textContent.replace(node.textContent.trim(), customContents_text[src]); if (newContent != node.textContent) { if(!node.parentNode.hasAttribute('data-ly-mutation-count') || parseInt(node.parentNode.getAttribute('data-ly-mutation-count')) < langify.settings.maxMutations) { var count = node.parentNode.hasAttribute('data-ly-mutation-count') ? parseInt(node.parentNode.getAttribute('data-ly-mutation-count')) : 0; node.parentNode.setAttribute('data-ly-mutation-count', count+1); node.textContent = newContent; mutationCount = mutationCount + 1; LyHelper.log('REPLACED (TEXT)', { oldValue: src, newValue: customContents_text[src], mutationCount, }, 'success' ); var event = new CustomEvent('langify.observer.aftertranslatetext', { bubbles: true, detail: { target: node, original: src, translation: customContents_text[src] } }); node.dispatchEvent(event); } } } } function translateLink(url, node) { if(langify.settings.observeLinks === false || isLocalizationForm(node) || node.hasAttribute('data-ly-locked') || !url || (url.indexOf('mailto:') !== -1 || url.indexOf('javascript:') !== -1 || url.indexOf('tel:') !== -1 || url.indexOf('file:') !== -1 || url.indexOf('ftp:') !== -1 || url.indexOf('sms:') !== -1 || url.indexOf('market:') !== -1 || url.indexOf('fax:') !== -1 || url.indexOf('callto:') !== -1 || url.indexOf('ts3server:') !== -1)) { return; } var isLocalized = ( url.indexOf('/'+ langify.locale.iso_code +'/') === 0 || url === '/'+ langify.locale.iso_code || url.indexOf('/'+ langify.locale.iso_code.toLowerCase() +'/') === 0 || url === '/'+ langify.locale.iso_code.toLowerCase() || url.indexOf('/'+ langify.locale.iso_code.toLowerCase().substring(0,2) +'/') === 0 || url === '/'+ langify.locale.iso_code.toLowerCase().substring(0,2) ); var cleanUrl = url.replace(langify.locale.shop_url, ''); var re = new RegExp(`\/\\b${langify.locale.iso_code.replace('-', '\-')}\\b\/`, 'gi'); var link = cleanUrl.replace(re, '/'); var isUrlAbsolute = (link.indexOf('://') > 0 || link.indexOf('//') === 0); var blacklist = ['#', '/'+ langify.locale.iso_code +'#'].concat(langify.settings.linksBlacklist); var isUrlBlacklisted = blacklist.find(x => url.indexOf(x) === 0); if(!isLocalized && !isUrlAbsolute && !isUrlBlacklisted && langify.locale.root_url != '/') { if(node.hasAttribute('href')) var attrName = 'href'; else var attrName = 'action'; if(link === '/' || link == langify.locale.root_url) link = ''; var newLink = langify.locale.root_url + link; var timeStamp = Math.floor(Date.now()); if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { node.setAttribute('data-ly-processed', timeStamp); node.setAttribute(attrName, newLink); if(node.hasAttribute('data-'+attrName)) node.setAttribute('data-'+attrName, newLink); mutationCount = mutationCount + 1; LyHelper.log('REPLACED (LINK)', { attrName, oldValue: url, newValue: newLink, mutationCount, }, 'success' ); var event = new CustomEvent('langify.observer.aftertranslatelink', { bubbles: true, detail: { target: node, attribute: attrName, original: url, translation: newLink } }); node.dispatchEvent(event); } } } function translateImage(node, attr) { if(langify.settings.observeImages === false || node.hasAttribute('data-ly-locked') || Object.keys(customContents_image).length === 0) { return } var attrs = []; if(typeof attr === 'string') attrs.push(attr); else if(typeof attr === 'object') attrs = attr; var timeStamp = Math.floor(Date.now()); if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { node.setAttribute('data-ly-processed', timeStamp); attrs.forEach(function(attr) { if(node.hasAttribute(attr)) { var imgObject = LyHelper.extractImageObject(node.getAttribute(attr)); var imgKey = imgObject ? imgObject.file.toLowerCase() : ''; if(customContents_image[imgKey]) { // Replace var oldValue = node.getAttribute(attr); var translation = node.getAttribute(attr); translation = translation.replace(new RegExp(imgObject.host, 'g'), customContents_image[imgKey].host); translation = translation.replace(new RegExp(imgObject.name, 'g'), customContents_image[imgKey].name); translation = translation.replace(new RegExp(imgObject.type, 'g'), customContents_image[imgKey].type); // China Hook if(node.getAttribute(attr).indexOf('cdn.shopifycdn.net') >= 0) { translation = translation.replace(new RegExp('cdn.shopify.com', 'g'), 'cdn.shopifycdn.net'); } if(node.getAttribute(attr) != translation) { node.setAttribute(attr, translation); mutationCount = mutationCount + 1; LyHelper.log('REPLACED (IMAGE)', { attrName: attr, oldValue: oldValue, newValue: translation, mutationCount, }, 'success'); var event = new CustomEvent('langify.observer.aftertranslateimage', { bubbles: true, detail: { target: node, attribute: attr, original: oldValue, translation: translation } }); node.dispatchEvent(event); } } } }); } } function translateCssImage(node) { if(langify.settings.observeImages === false || node.hasAttribute('data-ly-locked') || Object.keys(customContents_image).length === 0 || !node.getAttribute('style')) { return } var imgMatches = node.getAttribute('style').match(/url\(("|')?(.*)("|')?\)/gi); if(imgMatches !== null) { var imgSource = imgMatches[0].replace(/url\(("|')?|("|')?\)/, ''); var imgObject = LyHelper.extractImageObject(imgSource); var imgKey = imgObject ? imgObject.file.toLowerCase() : ''; var attr = 'style'; if(customContents_image[imgKey]) { // Replace var translation = node.getAttribute(attr); translation = translation.replace(new RegExp(imgObject.host, 'g'), customContents_image[imgKey].host); translation = translation.replace(new RegExp(imgObject.name, 'g'), customContents_image[imgKey].name); translation = translation.replace(new RegExp(imgObject.type, 'g'), customContents_image[imgKey].type); // China Hook if(node.getAttribute(attr).indexOf('cdn.shopifycdn.net') >= 0) { translation = translation.replace(new RegExp('cdn.shopify.com', 'g'), 'cdn.shopifycdn.net'); } if(node.getAttribute(attr) != translation) { var timeStamp = Math.floor(Date.now()); if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { node.setAttribute('data-ly-processed', timeStamp); node.setAttribute(attr, translation); mutationCount = mutationCount + 1; } } } } } function findAndLocalizeLinks(target, parent) { if(target.parentNode && parent) var allLinks = target.parentElement.querySelectorAll('[href],[action]'); else var allLinks = target.querySelectorAll('[href],[action]'); allLinks.forEach(link => { if(link.hasAttribute('href')) var attrName = 'href'; else var attrName = 'action'; var url = link.getAttribute(attrName); translateLink(url, link); }); } function isLocalizationForm(node) { if(node.querySelector('input[name="form_type"][value="localization"]')){ return true; } return false; } function getNodesUnder(el, show){ var n, a=[], walk=document.createTreeWalker(el, NodeFilter[show] , null, false); while(n=walk.nextNode()) a.push(n); return a; } function spreadCustomContents() { var getFileName = function(url) { if(!url || url == '') return; url = url.substring(0, (url.indexOf("#") == -1) ? url.length : url.indexOf("#")); url = url.substring(0, (url.indexOf("?") == -1) ? url.length : url.indexOf("?")); url = url.substring(url.lastIndexOf("/") + 1, url.length); url = url.replace(/(_[0-9]+x[0-9]*|_{width}x)?(_crop_(top|center|bottom|left|right))?(@[0-9]*x)?(\.progressive)?\.(jpe?g|png|gif|webp)/gi, ""); return '/' + url; } Object.entries(customContents).forEach(function(entry) { //if(/<\/?[a-z][\s\S]*>/i.test(entry[0])) customContents_html[entry[0]] = entry[1]; //else if(/(http(s?):)?([/|.|\w|\s|-])*\.(?:jpe?g|gif|png)/.test(entry[0])) customContents_image[getFileName(entry[0])] = getFileName(entry[1]); if(/(http(s?):)?([/|.|\w|\s|-])*\.(?:jpe?g|gif|png|webp)/.test(entry[0])) customContents_image[LyHelper.extractImageObject(entry[0]).file] = LyHelper.extractImageObject(entry[1]); else customContents_text[entry[0]] = entry[1]; }); LyHelper.log('CUSTOM CONTENTS:', {customContents, customContents_text, customContents_image}, 'info') } // Polyfill for old browsers function startMutationEvents() { var target = document.querySelector('body'); target.addEventListener("DOMAttrModified", function (event) { if(event.attrName === 'href' || event.attrName === 'action') { if(event.prevValue != event.newValue) { translateLink(event.newValue, event.target); } } }, false); target.addEventListener("DOMSubtreeModified", function (event) { //findAndLocalizeLinks(event.target, false); //matchCustomContent(event.target); }, false); } function triggerCustomContents() { var rootnode = document.getElementsByTagName('body')[0] var walker = document.createTreeWalker(rootnode, NodeFilter.SHOW_ALL, null, false) while (walker.nextNode()) { //LyHelper.log(walker.currentNode.tagName) translate(walker.currentNode, null); } } function stopObserver() { mutationObs.takeRecords(); mutationObs.disconnect(); } //init(); return { init: init, triggerCustomContents: triggerCustomContents, stopObserver: stopObserver, } }; } /** * * * @class Switcher */ class Switcher { constructor(switcherSettings) { LyHelper.log('Switcher instantiation'); this.lyForceOff = location.search.split('ly-force-off=')[1]; this.switcherElements = Array.prototype.slice.call(document.getElementsByClassName('ly-switcher-wrapper')); } init() { // Initial cart.attributes update LyHelper.shopifyAPI().getCart(function (cart) { var currentLanguage = langify.locale.iso_code; if(!cart.attributes.language || cart.attributes.language != currentLanguage) { LyHelper.shopifyAPI().updateCartAttributes({"language": currentLanguage}, function(data){}); } }); if(langify.locale.languages.length === 1) { console.info(`%c LANGIFY INFO:\n`, 'font-weight: bold;', 'The language switcher is hidden! This can have one of the following reasons: \n * All additional languages are disabled in the "Langify -> Dashboard -> Languages" section. \n * If you are using different domains for your additional languages, ensure that "Cross Domain Links" are enabled inside the "Langify -> Dashboard -> Switcher Configurator -> Domains" section.'); return false; } this.setCustomPosition(); this.initCustomDropdown(); this.bindCountrySwitchers(); this.bindCurrencySwitchers(); this.bindLanguageSwitchers(); var event = new CustomEvent('langify.switcher.initialized', { bubbles: true, detail: {} }); } initCustomDropdown() { // Custom Dropdown var root = this; var switcher = document.getElementsByClassName('ly-custom-dropdown-switcher'); for(var a = 0; a < switcher.length; a++) { switcher[a].classList.toggle('ly-is-open'); var isOut = LyHelper.isOutOfViewport(switcher[a]); if(isOut.bottom && isOut.inViewport) { switcher[a].classList.add('ly-is-dropup'); var arrows = switcher[a].querySelectorAll('.ly-arrow'); for(var b = 0; b < arrows.length; b++) { arrows[b].classList.add('ly-arrow-up'); } } switcher[a].classList.toggle('ly-is-open'); switcher[a].onclick = function(event) { root.toggleSwitcherOpen(this); } } document.addEventListener('click', function(event) { if(!event.target.closest('.ly-custom-dropdown-switcher')) { var openSwitchers = document.querySelectorAll('.ly-custom-dropdown-switcher.ly-is-open') for(var i = 0; i < openSwitchers.length; i++) { openSwitchers[i].classList.remove('ly-is-open'); } } }); } bindLanguageSwitchers() { var root = this; var links = document.getElementsByClassName('ly-languages-switcher-link'); for(var l = 0; l < links.length; l++) { links[l].addEventListener('click', function(event) { event.preventDefault(); if(LyHelper.isDomainFeatureEnabled() && this.getAttribute('href') !== '#') { var domain = this.getAttribute('href'); } LyHelper.setCookie('ly-lang-selected', this.getAttribute('data-language-code'), 365); LyHelper.localizationRedirect('language_code', this.getAttribute('data-language-code'), null, null, domain); }); } // Native select event handling var nativeLangifySelects = document.querySelectorAll('select.ly-languages-switcher'); for(var i = 0; i < nativeLangifySelects.length; i++) { nativeLangifySelects[i].onchange = function() { event.preventDefault(); if(LyHelper.isDomainFeatureEnabled() && this[this.selectedIndex].getAttribute('data-domain') !== '#') { var domain = this[this.selectedIndex].getAttribute('data-domain'); } LyHelper.setCookie('ly-lang-selected', this[this.selectedIndex].getAttribute('data-language-code'), 365); LyHelper.localizationRedirect('language_code', this[this.selectedIndex].getAttribute('data-language-code'), null, null, domain); }; } } bindCountrySwitchers() { var countrySelectSwitcher = document.querySelectorAll('select.ly-country-switcher'); var countryCustomSwitcher = document.querySelectorAll('div.ly-country-switcher a'); for(var i=0; i<countryCustomSwitcher.length; i++) { countryCustomSwitcher[i].addEventListener('click', function(e) { LyHelper.localizationRedirect('country_code', this.getAttribute('data-country-code')); }); } for(var a=0; a<countrySelectSwitcher.length; a++) { countrySelectSwitcher[a].addEventListener('change', function(){ LyHelper.localizationRedirect('country_code', this[this.selectedIndex].getAttribute('data-country-code')); }); } } bindCurrencySwitchers() { var currencySelectSwitcher = document.querySelectorAll('select.ly-currency-switcher'); var currencyCustomSwitcher = document.querySelectorAll('div.ly-currency-switcher a'); for(var i=0; i<currencyCustomSwitcher.length; i++) { currencyCustomSwitcher[i].addEventListener('click', function(e) { LyHelper.changeCurrency(this.getAttribute('data-currency-code')); }); } for(var a=0; a<currencySelectSwitcher.length; a++) { currencySelectSwitcher[a].addEventListener('change', function(){ LyHelper.changeCurrency(this[this.selectedIndex].getAttribute('data-currency-code')); }); } } setCustomPosition() { for(var i = 0; i < this.switcherElements.length; i++) { if(this.lyForceOff !== 'true') { if(langify.locale.languages.length <= 1) { this.switcherElements[i].querySelector('.ly-languages-switcher').classList.add('ly-hide'); } this.switcherElements[i].classList.remove('ly-hide'); } if(this.switcherElements[i].classList.contains('ly-custom') && (document.getElementById('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint')) || document.getElementsByClassName('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint')).length )) { var targets = Array.from(document.getElementsByClassName('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint'))); var target = document.getElementById('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint')); if(target) targets.push(target); for(var c = 0; c < targets.length; c++) { var clone = this.switcherElements[i].cloneNode(true); targets[c].innerHTML = clone.outerHTML; } this.switcherElements[i].classList.add('ly-hide'); } } } toggleSwitcherOpen(e) { var target = e; if(!target.classList.contains('ly-is-open')) { var openSwitchers = document.querySelectorAll('.ly-custom-dropdown-switcher.ly-is-open') for(var i = 0; i < openSwitchers.length; i++) { openSwitchers[i].classList.remove('ly-is-open'); } target.getElementsByClassName('ly-custom-dropdown-current')[0].setAttribute('aria-expanded', 'true'); } else { target.getElementsByClassName('ly-custom-dropdown-current')[0].setAttribute('aria-expanded', 'false'); } target.classList.toggle('ly-is-open'); var isOut = LyHelper.isOutOfViewport(target); if(isOut.bottom) { target.classList.add('ly-is-dropup'); } } togglePopupOpen(e) { e.closest('.ly-popup-switcher').classList.toggle('ly-is-open'); } _getCountryCodeFromHreflang(language_code) { var hreflangTags = document.querySelectorAll('link[hreflang]'); var languageDomains = {}; var countryCode = false; for(var i = 0; i < hreflangTags.length; i++) { if(hreflangTags[i].getAttribute('hreflang').indexOf(language_code) === 0) { if(!languageDomains[hreflangTags[i].getAttribute('href')]) { languageDomains[hreflangTags[i].getAttribute('href')] = hreflangTags[i]; } } } if(Object.keys(languageDomains).length > 0) { countryCode = Object.values(languageDomains)[0].getAttribute('hreflang'); countryCode = countryCode.split('-'); if(countryCode[1]) { countryCode = countryCode[1] } else { } } return countryCode; } } /** * * * @class LanguageDetection */ class LanguageDetection { constructor() { this.hreflangList = null; LyHelper.log('LanguageDetection instantiation'); } init() { if(LyHelper.inIframe()) return null; var currentLang = langify.locale.iso_code.toLowerCase(); //var localizationData = this.getLocalizationData(); this.hreflangList = this.getHreflangList(); var userLang = navigator.language || navigator.userLanguage; userLang = userLang.toLowerCase(); var bot = /bot|google|baidu|bing|msn|duckduckbot|teoma|slurp|yandex|Chrome-Lighthouse/i.test(navigator.userAgent); var blockedRoutes = window.lyBlockedRoutesList || []; var blockedRoute = blockedRoutes.find(x => window.location.pathname.indexOf(x) === 0); var is404 = document.getElementsByClassName('template-404').length; if(LyHelper.getVal('redirected') === 'true') { LyHelper.setCookie('ly-lang-selected', currentLang, 365); var _href = window.location.href; history.replaceState(null, '', _href.replace(/(\?|&)(redirected=true)/i, '')); return null; } if(!is404 && !bot && !blockedRoute && LyHelper.getVal('ly-lang-detect') !== 'off') { if(userLang && !LyHelper.getCookie('ly-lang-selected')) { var hasMatch = this.matchHreflangList(userLang); if(currentLang !== this._hreflangToLanguageCode(hasMatch)) { if(hasMatch) { this.redirectMatched(userLang); } else if (!hasMatch && langify.settings.switcher.languageDetectionDefault) { // Redirect to default language this.redirectMatched(langify.settings.switcher.languageDetectionDefault); } } } else { if(LyHelper.getCookie('ly-lang-selected') && LyHelper.getCookie('ly-lang-selected') !== currentLang) { // Only save cookie when the domain feature is active if(LyHelper.isDomainFeatureEnabled()) { LyHelper.setCookie('ly-lang-selected', currentLang, 365); } this.redirectMatched(LyHelper.getCookie('ly-lang-selected')); } } } this._geolocationAppSupport(); } redirectMatched(userLang) { var match = this.matchHreflangList(userLang); if(match) { this.redirectHref(match.href, match.lang); } return match; } matchHreflangList(userLang) { var matchedHreflang = false; var browserLang = userLang; // Find candidates var candidates = this.hreflangList.filter(item => item.lang === browserLang); if(candidates.length === 0) { browserLang = userLang.toLowerCase(); candidates = this.hreflangList.filter(item => item.lang.toLowerCase().indexOf(browserLang) === 0); } if(candidates.length === 0) { browserLang = userLang.toLowerCase().substring(0, 2); candidates = this.hreflangList.filter(item => item.lang.toLowerCase().indexOf(browserLang) === 0); } // Handle candidates if(candidates.length === 1) { return({href: candidates[0].href, lang: browserLang}); } else if(candidates.length > 1) { var preferedCandidate = candidates.find(item => item.href.indexOf(window.location.host) >= 0) if(preferedCandidate) { return({href: preferedCandidate.href, lang: browserLang}); } else { return({href: candidates[0].href, lang: browserLang}); } } return false; } redirectHref(href, userLang) { var queryString = window.location.search; if(queryString === '') { queryString = '?redirected=true'; } else { queryString += '&redirected=true'; } window.location.replace(href + queryString); } getHreflangList() { var hreflangTags = document.querySelectorAll('link[hreflang]'); var hreflangList = []; var countryCode = false; // Cross Domain Links option if(LyHelper.isDomainFeatureEnabled()) { for(var i = 0; i < langify.locale.languages.length; i++) { hreflangList.push({ href: 'https://' + langify.locale.languages[i].domain + window.location.pathname + window.location.search + window.location.hash, lang: langify.locale.languages[i].iso_code, }); } } for(var i = 0; i < hreflangTags.length; i++) { var hreflang = hreflangTags[i].getAttribute('hreflang').toLowerCase(); hreflang = hreflang.replace('zh-hans', 'zh-cn').replace('zh-hant', 'zh-tw'); // Chinese special cases hreflangList.push({ href: hreflangTags[i].getAttribute('href'), lang: hreflang }); } return hreflangList; } _langToHreflang(userLang) { var hreflang = ''; this.hreflangList.map(function(item) { if(item.lang === userLang) { hreflang = userLang; } }); if(hreflang === '') { this.hreflangList.map(function(item) { var browserLang = userLang.toLowerCase(); if(item.lang.toLowerCase().indexOf(browserLang) === 0) { hreflang = browserLang; } else if(item.lang.toLowerCase().indexOf(browserLang.substring(0, 2)) === 0) { hreflang = browserLang.substring(0, 2); } }); } return hreflang || userLang; } _hreflangToLanguageCode(hreflangTag) { if(!hreflangTag || !hreflangTag.lang) return false; var languageCode = false; langify.locale.languages.forEach(function(item) { if(item.iso_code.toLowerCase() === hreflangTag.lang.toLowerCase()) { languageCode = item.iso_code; } }); if(!languageCode) { langify.locale.languages.forEach(function(item) { if(item.iso_code.toLowerCase() === hreflangTag.lang.substring(0, 2).toLowerCase()) { languageCode = item.iso_code; } }); } return languageCode; } _geolocationAppSupport() { var target = document.querySelector('body'); var config = { childList: true, subtree: true }; var geolocationObserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { var target = mutation.target.getElementsByClassName('locale-bar__form'); if(target[0]) { target[0].onsubmit = function() { var locale_code = target[0].elements['locale_code'].value; var selector = target[0].getElementsByClassName('locale-bar__selector'); if(selector.length >= 1) { locale_code = selector[0].options[selector[0].selectedIndex].value; } LyHelper.setCookie('ly-lang-selected', locale_code, 365); }; } var selectors = mutation.target.getElementsByClassName('locale-selectors__selector'); if(selectors.length > 0) { for(var selector of selectors) { if(selector.getAttribute('name') === 'locale_code') { selector.onchange = function() { var locale_code = selector.options[selector.selectedIndex].value; LyHelper.setCookie('ly-lang-selected', locale_code, 365); }; } } } } }); }); geolocationObserver.observe(target, config); setTimeout(function() { geolocationObserver.disconnect(); }, 10000); } } /** * * * @class Recommendation */ class Recommendation extends LanguageDetection { constructor() { super(); LyHelper.log('Recommendation instantiation'); } init() { this.hreflangList = this.getHreflangList(); var userLang = navigator.language || navigator.userLanguage; userLang = userLang.toLowerCase(); var recommendation = this.matchHreflangList(userLang); var recommendationLanguageCode = this._hreflangToLanguageCode(recommendation); if(recommendationLanguageCode && recommendationLanguageCode !== langify.locale.iso_code && !LyHelper.getCookie('ly-lang-selected')) { this.recommended_language_code = recommendationLanguageCode; this.recommended_country_code = null; this.recommended_currency_code = null; this._translateStrings(recommendationLanguageCode); this._bindings(); } else { return false; } } _translateStrings(languageCode) { var recommendationElement = document.querySelectorAll('.ly-recommendation')[0]; var strings = langify.settings.switcher.recommendation_strings[languageCode]; var recommendationStr = 'Looks like your browser is set to [[language]]. Change the language?'; var buttonStr = 'Change'; var matchedLanguageCode = this._langToHreflang(languageCode).toLowerCase(); var languageStr = langify.settings.switcher.languages.find(x => x.iso_code.toLowerCase() === matchedLanguageCode) ? langify.settings.switcher.languages.find(x => x.iso_code.toLowerCase() === matchedLanguageCode).name : languageCode.toUpperCase(); if(strings) { recommendationStr = strings.recommendation ? strings.recommendation : recommendationStr; buttonStr = strings.button ? strings.button : buttonStr; languageStr = strings.language ? strings.language : languageStr; } var newCode = recommendationElement.innerHTML; newCode = newCode.replaceAll('[[recommendation]]', recommendationStr).replaceAll('[[button]]', buttonStr).replaceAll('[[language]]', languageStr); recommendationElement.innerHTML = newCode; } _bindings() { var _this = this; var lyForceOff = location.search.split('ly-force-off=')[1]; var recommendationElement = document.querySelectorAll('.ly-recommendation')[0]; var form = recommendationElement.querySelectorAll('.ly-recommendation-form')[0]; var links = recommendationElement.getElementsByClassName('ly-custom-dropdown-list-element'); var customDropdown = recommendationElement.querySelectorAll('.ly-custom-dropdown-switcher'); var nativeSelects = recommendationElement.getElementsByClassName('ly-native-select'); form.addEventListener('submit', function(e) { e.preventDefault(); if(_this.recommended_country_code || _this.recommended_currency_code) { // When a country or currency is involved, use old redirection var additionalFields = []; if(_this.recommended_country_code) { additionalFields.push({ name: 'country_code', value: _this.recommended_country_code }); } if(_this.recommended_currency_code) { additionalFields.push({ name: 'currency_code', value: _this.recommended_currency_code }); } LyHelper.setCookie('ly-lang-selected', _this.recommended_language_code, 365); LyHelper.localizationRedirect('language_code', _this.recommended_language_code, additionalFields); } else { //...or use new hreflang redirection _this.redirectMatched(_this.recommended_language_code); } }); // Overwrite switchers for(var l = 0; l < links.length; l++) { links[l].addEventListener('click', function(event) { event.preventDefault(); // When clicked from within a custom dropdown var parentCustomDropdown = event.currentTarget.closest('.ly-custom-dropdown-switcher'); if(parentCustomDropdown) { _this._selectCustomDropdownEntry(parentCustomDropdown, this); } else { _this.recommended_language_code = this.getAttribute('data-language-code'); } }); } for(var i = 0; i < nativeSelects.length; i++) { nativeSelects[i].onchange = _this._selectNativeDropdownEntry.bind(this); if(nativeSelects[i].classList.contains('ly-languages-switcher')) { nativeSelects[i].value = _this.recommended_language_code; } } for(var i = 0; i < customDropdown.length; i++) { if(recommendationElement.className.indexOf('bottom') > -1) { customDropdown[i].classList.add('ly-is-dropup'); } if(customDropdown[i].classList.contains('ly-languages-switcher')) { _this._selectCustomDropdownEntry(customDropdown[i], customDropdown[i].querySelector('.ly-custom-dropdown-list a[data-language-code="'+ _this.recommended_language_code +'"]')); } } if(!lyForceOff) { recommendationElement.classList.add('ly-is-open'); } } _selectNativeDropdownEntry(event) { event.preventDefault(); var element = event.currentTarget; var _this = this; if(element[element.selectedIndex].hasAttribute('data-language-code')) { _this.recommended_language_code = element[element.selectedIndex].getAttribute('data-language-code'); } if(element[element.selectedIndex].hasAttribute('data-country-code')) { _this.recommended_country_code = element[element.selectedIndex].getAttribute('data-country-code'); } if(element[element.selectedIndex].hasAttribute('data-currency-code')) { _this.recommended_currency_code = element[element.selectedIndex].getAttribute('data-currency-code'); } } _selectCustomDropdownEntry(element, entry) { if(!entry) return; var _this = this; var currentElem = element.querySelector('.ly-custom-dropdown-current'); var currentIcon = currentElem.querySelector('.ly-icon'); var currentLabel = currentElem.querySelector('span'); var valueToSelect = ''; if(entry.hasAttribute('data-language-code')) { _this.recommended_language_code = entry.getAttribute('data-language-code'); valueToSelect = _this.recommended_language_code; } if(entry.hasAttribute('data-country-code')) { _this.recommended_country_code = entry.getAttribute('data-country-code'); valueToSelect = _this.recommended_country_code; } if(entry.hasAttribute('data-currency-code')) { _this.recommended_currency_code = entry.getAttribute('data-currency-code'); valueToSelect = _this.recommended_currency_code; } if(entry.hasAttribute('data-country-code') && entry.hasAttribute('data-currency-code')) { valueToSelect = _this.recommended_country_code + '-' + _this.recommended_currency_code; } if(element.querySelector('.ly-custom-dropdown-list li.current')) { element.querySelector('.ly-custom-dropdown-list li.current').classList.remove('current'); element.querySelector('.ly-custom-dropdown-list li[key="'+ valueToSelect +'"]').classList.add('current'); } if(element.querySelector('.ly-custom-dropdown-list li.current span')) currentLabel.innerHTML = element.querySelector('.ly-custom-dropdown-list li.current span').innerHTML; if(element.querySelector('.ly-custom-dropdown-list li.current .ly-icon')) currentIcon.classList = element.querySelector('.ly-custom-dropdown-list li.current .ly-icon').classList; } toggleOpen(e) { e.closest('.ly-recommendation').classList.toggle('ly-is-open'); if(!e.closest('.ly-recommendation').classList.contains('ly-is-open')) { LyHelper.setCookie('ly-lang-selected', this.recommended_language_code, 365); } } } /** * * * @class Langify */ class Langify { constructor(settings, locale) { LyHelper.log('Langify instantiation') var translationObserver = new TranslationObserver().init(); langify.helper = new LyHelper(); LyHelper.log(langify.helper); var lyForceOff = location.search.split('ly-force-off=')[1]; if(lyForceOff === 'true') { document.getElementById('preview-bar-iframe').classList.add('ly-hide'); return false; } if(settings.theme && ((settings.theme.loadJquery && settings.theme.loadJquery === true) || typeof settings.theme.loadJquery === 'undefined')) { if(typeof jQuery === 'undefined') { LyHelper.loadScript('//web.archive.org/web/20231121174249/https://cdn.jsdelivr.net/jquery/1.9.1/jquery.min.js', function() {}); } } //document.addEventListener("DOMContentLoaded", function() { langify.switcher = new Switcher(); langify.switcher.init(); if(settings.switcher) { if(settings.switcher.recommendation && settings.switcher.recommendation_enabled) { langify.recommendation = new Recommendation(); langify.recommendation.init(); } else { if(settings.switcher.languageDetection) { langify.languageDetection = new LanguageDetection(); langify.languageDetection.init(); } } } //}); } } // Polyfills (function(){var t;null==window.MutationObserver&&(t=function(){function t(t){this.callBack=t}return t.prototype.observe=function(t,n){return this.element=t,this.interval=setInterval((e=this,function(){var t;if((t=e.element.innerHTML)!==e.oldHtml)return e.oldHtml=t,e.callBack.apply(null)}),200);var e},t.prototype.disconnect=function(){return window.clearInterval(this.interval)},t}(),window.MutationObserver=t)}).call(this); !function(){"use strict";if("object"==typeof window)if("IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype)"isIntersecting"in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,"isIntersecting",{get:function(){return this.intersectionRatio>0}});else{var t=function(t){for(var e=window.document,o=i(e);o;)o=i(e=o.ownerDocument);return e}(),e=[],o=null,n=null;s.prototype.THROTTLE_TIMEOUT=100,s.prototype.POLL_INTERVAL=null,s.prototype.USE_MUTATION_OBSERVER=!0,s._setupCrossOriginUpdater=function(){return o||(o=function(t,o){n=t&&o?l(t,o):{top:0,bottom:0,left:0,right:0,width:0,height:0},e.forEach(function(t){t._checkForIntersections()})}),o},s._resetCrossOriginUpdater=function(){o=null,n=null},s.prototype.observe=function(t){if(!this._observationTargets.some(function(e){return e.element==t})){if(!t||1!=t.nodeType)throw new Error("target must be an Element");this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(t.ownerDocument),this._checkForIntersections()}},s.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._unmonitorIntersections(t.ownerDocument),0==this._observationTargets.length&&this._unregisterInstance()},s.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorAllIntersections(),this._unregisterInstance()},s.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},s.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,o){if("number"!=typeof t||isNaN(t)||t<0||t>1)throw new Error("threshold must be a number between 0 and 1 inclusively");return t!==o[e-1]})},s.prototype._parseRootMargin=function(t){var e=(t||"0px").split(/\s+/).map(function(t){var e=/^(-?\d*\.?\d+)(px|%)$/.exec(t);if(!e)throw new Error("rootMargin must be specified in pixels or percent");return{value:parseFloat(e[1]),unit:e[2]}});return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},s.prototype._monitorIntersections=function(e){var o=e.defaultView;if(o&&-1==this._monitoringDocuments.indexOf(e)){var n=this._checkForIntersections,r=null,s=null;this.POLL_INTERVAL?r=o.setInterval(n,this.POLL_INTERVAL):(h(o,"resize",n,!0),h(e,"scroll",n,!0),this.USE_MUTATION_OBSERVER&&"MutationObserver"in o&&(s=new o.MutationObserver(n)).observe(e,{attributes:!0,childList:!0,characterData:!0,subtree:!0})),this._monitoringDocuments.push(e),this._monitoringUnsubscribes.push(function(){var t=e.defaultView;t&&(r&&t.clearInterval(r),c(t,"resize",n,!0)),c(e,"scroll",n,!0),s&&s.disconnect()});var u=this.root&&(this.root.ownerDocument||this.root)||t;if(e!=u){var a=i(e);a&&this._monitorIntersections(a.ownerDocument)}}},s.prototype._unmonitorIntersections=function(e){var o=this._monitoringDocuments.indexOf(e);if(-1!=o){var n=this.root&&(this.root.ownerDocument||this.root)||t;if(!this._observationTargets.some(function(t){var o=t.element.ownerDocument;if(o==e)return!0;for(;o&&o!=n;){var r=i(o);if((o=r&&r.ownerDocument)==e)return!0}return!1})){var r=this._monitoringUnsubscribes[o];if(this._monitoringDocuments.splice(o,1),this._monitoringUnsubscribes.splice(o,1),r(),e!=n){var s=i(e);s&&this._unmonitorIntersections(s.ownerDocument)}}}},s.prototype._unmonitorAllIntersections=function(){var t=this._monitoringUnsubscribes.slice(0);this._monitoringDocuments.length=0,this._monitoringUnsubscribes.length=0;for(var e=0;e<t.length;e++)t[e]()},s.prototype._checkForIntersections=function(){if(this.root||!o||n){var t=this._rootIsInDom(),e=t?this._getRootRect():{top:0,bottom:0,left:0,right:0,width:0,height:0};this._observationTargets.forEach(function(n){var i=n.element,s=u(i),h=this._rootContainsTarget(i),c=n.entry,a=t&&h&&this._computeTargetAndRootIntersection(i,s,e),l=null;this._rootContainsTarget(i)?o&&!this.root||(l=e):l={top:0,bottom:0,left:0,right:0,width:0,height:0};var f=n.entry=new r({time:window.performance&&performance.now&&performance.now(),target:i,boundingClientRect:s,rootBounds:l,intersectionRect:a});c?t&&h?this._hasCrossedThreshold(c,f)&&this._queuedEntries.push(f):c&&c.isIntersecting&&this._queuedEntries.push(f):this._queuedEntries.push(f)},this),this._queuedEntries.length&&this._callback(this.takeRecords(),this)}},s.prototype._computeTargetAndRootIntersection=function(e,i,r){if("none"!=window.getComputedStyle(e).display){for(var s,h,c,a,f,d,g,m,v=i,_=p(e),b=!1;!b&&_;){var w=null,y=1==_.nodeType?window.getComputedStyle(_):{};if("none"==y.display)return null;if(_==this.root||9==_.nodeType)if(b=!0,_==this.root||_==t)o&&!this.root?!n||0==n.width&&0==n.height?(_=null,w=null,v=null):w=n:w=r;else{var I=p(_),E=I&&u(I),T=I&&this._computeTargetAndRootIntersection(I,E,r);E&&T?(_=I,w=l(E,T)):(_=null,v=null)}else{var R=_.ownerDocument;_!=R.body&&_!=R.documentElement&&"visible"!=y.overflow&&(w=u(_))}if(w&&(s=w,h=v,c=void 0,a=void 0,f=void 0,d=void 0,g=void 0,m=void 0,c=Math.max(s.top,h.top),a=Math.min(s.bottom,h.bottom),f=Math.max(s.left,h.left),d=Math.min(s.right,h.right),m=a-c,v=(g=d-f)>=0&&m>=0&&{top:c,bottom:a,left:f,right:d,width:g,height:m}||null),!v)break;_=_&&p(_)}return v}},s.prototype._getRootRect=function(){var e;if(this.root&&!d(this.root))e=u(this.root);else{var o=d(this.root)?this.root:t,n=o.documentElement,i=o.body;e={top:0,left:0,right:n.clientWidth||i.clientWidth,width:n.clientWidth||i.clientWidth,bottom:n.clientHeight||i.clientHeight,height:n.clientHeight||i.clientHeight}}return this._expandRectByRootMargin(e)},s.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,o){return"px"==e.unit?e.value:e.value*(o%2?t.width:t.height)/100}),o={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return o.width=o.right-o.left,o.height=o.bottom-o.top,o},s.prototype._hasCrossedThreshold=function(t,e){var o=t&&t.isIntersecting?t.intersectionRatio||0:-1,n=e.isIntersecting?e.intersectionRatio||0:-1;if(o!==n)for(var i=0;i<this.thresholds.length;i++){var r=this.thresholds[i];if(r==o||r==n||r<o!=r<n)return!0}},s.prototype._rootIsInDom=function(){return!this.root||f(t,this.root)},s.prototype._rootContainsTarget=function(e){var o=this.root&&(this.root.ownerDocument||this.root)||t;return f(o,e)&&(!this.root||o==e.ownerDocument)},s.prototype._registerInstance=function(){e.indexOf(this)<0&&e.push(this)},s.prototype._unregisterInstance=function(){var t=e.indexOf(this);-1!=t&&e.splice(t,1)},window.IntersectionObserver=s,window.IntersectionObserverEntry=r}function i(t){try{return t.defaultView&&t.defaultView.frameElement||null}catch(t){return null}}function r(t){this.time=t.time,this.target=t.target,this.rootBounds=a(t.rootBounds),this.boundingClientRect=a(t.boundingClientRect),this.intersectionRect=a(t.intersectionRect||{top:0,bottom:0,left:0,right:0,width:0,height:0}),this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,o=e.width*e.height,n=this.intersectionRect,i=n.width*n.height;this.intersectionRatio=o?Number((i/o).toFixed(4)):this.isIntersecting?1:0}function s(t,e){var o,n,i,r=e||{};if("function"!=typeof t)throw new Error("callback must be a function");if(r.root&&1!=r.root.nodeType&&9!=r.root.nodeType)throw new Error("root must be a Document or Element");this._checkForIntersections=(o=this._checkForIntersections.bind(this),n=this.THROTTLE_TIMEOUT,i=null,function(){i||(i=setTimeout(function(){o(),i=null},n))}),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(r.rootMargin),this.thresholds=this._initThresholds(r.threshold),this.root=r.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(" "),this._monitoringDocuments=[],this._monitoringUnsubscribes=[]}function h(t,e,o,n){"function"==typeof t.addEventListener?t.addEventListener(e,o,n||!1):"function"==typeof t.attachEvent&&t.attachEvent("on"+e,o)}function c(t,e,o,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,o,n||!1):"function"==typeof t.detatchEvent&&t.detatchEvent("on"+e,o)}function u(t){var e;try{e=t.getBoundingClientRect()}catch(t){}return e?(e.width&&e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):{top:0,bottom:0,left:0,right:0,width:0,height:0}}function a(t){return!t||"x"in t?t:{top:t.top,y:t.top,bottom:t.bottom,left:t.left,x:t.left,right:t.right,width:t.width,height:t.height}}function l(t,e){var o=e.top-t.top,n=e.left-t.left;return{top:o,left:n,height:e.height,width:e.width,bottom:o+e.height,right:n+e.width}}function f(t,e){for(var o=e;o;){if(o==t)return!0;o=p(o)}return!1}function p(e){var o=e.parentNode;return 9==e.nodeType&&e!=t?i(e):(o&&o.assignedSlot&&(o=o.assignedSlot.parentNode),o&&11==o.nodeType&&o.host?o.host:o)}function d(t){return t&&9===t.nodeType}}(); !function(){if("function"==typeof window.CustomEvent)return!1;window.CustomEvent=function(n,t){t=t||{bubbles:!1,cancelable:!1,detail:null};var e=document.createEvent("CustomEvent");return e.initCustomEvent(n,t.bubbles,t.cancelable,t.detail),e}}(); var langify = window.langify || {}; var customContents = {}; var customContents_image = {}; var langifySettingsOverwrites = {}; var defaultSettings = { debug: false, // BOOL : Enable/disable console logs observe: true, // BOOL : Enable/disable the entire mutation observer (off switch) observeLinks: false, observeImages: true, observeCustomContents: true, maxMutations: 5, timeout: 100, // INT : Milliseconds to wait after a mutation, before the next mutation event will be allowed for the element linksBlacklist: [], }; if(langify.settings) { langifySettingsOverwrites = Object.assign({}, langify.settings); langify.settings = Object.assign(defaultSettings, langify.settings); } else { langify.settings = defaultSettings; } langify.settings.theme = null; langify.settings.switcher = {"version":"2.0.2","customCSS":"","languageDetection":false,"languageDetectionDefault":"fi","breakpoints":[{"key":0,"label":"0px","config":{"type":"links","corner":"bottom_right","position":"custom","show_flags":false,"show_label":true,"show_custom_name":true,"show_name":false,"show_iso_code":false,"round_icons":false,"is_dark":false,"is_transparent":false,"arrow_size":100,"arrow_width":3,"arrow_filled":false,"dropdown_open":false,"h_space":0,"v_space":0,"text_color":"#ffffff","arrow_color":"#000","bg_color":"rgba(255, 255, 255, 0)","fontsize":16,"switcherLabel":"show_custom_name","rectangle_icons":false,"switcherIcons":false}},{"key":768,"label":"920px","config":{"type":"links","corner":"bottom_right","position":"custom","show_flags":false,"show_label":true,"show_custom_name":true,"show_name":false,"show_iso_code":false,"round_icons":false,"is_dark":false,"is_transparent":true,"arrow_size":50,"arrow_width":2,"arrow_filled":false,"dropdown_open":false,"h_space":0,"v_space":0,"text_color":"#ffffff","arrow_color":"#000","bg_color":"rgba(255, 255, 255, 0)","fontsize":14,"switcherLabel":"show_custom_name","rectangle_icons":false,"switcherIcons":false}}],"languages":[{"iso_code":"fi","root_url":"\/","name":"Suomi","primary":true,"domain":false,"published":true,"custom_name":false},{"iso_code":"en","root_url":"\/en","name":"English","primary":false,"domain":false,"published":true,"custom_name":false},{"iso_code":"sv","root_url":"\/sv","name":"Svenska","primary":false,"domain":false,"published":true,"custom_name":false}]}; langify.locale = langify.locale || { primary: true, iso_code: "fi", root_url: "\/", language_id: "ly90821", shop_url: "https:\/\/web.archive.org\/web\/20231121174249\/https:\/\/julkaisut.um.fi", domain_feature_enabled: null, languages: [{ iso_code: "fi", root_url: "\/", domain: null, },{ iso_code: "en", root_url: "\/en", domain: null, },{ iso_code: "sv", root_url: "\/sv", domain: null, },],}; // Disable link correction ALWAYS on languages with mapped domains if(langify.locale.root_url == '/') { langify.settings.observeLinks = false; } window.addEventListener('DOMContentLoaded', function() { langify.helper = new LyHelper(); // Custom Contents Section // Images Section var langifyInstance = new Langify(langify.settings, langify.locale); }); </script> <div data-breakpoint="0" class="ly-switcher-wrapper ly-breakpoint-1 custom ly-custom ly-hide" style="font-size: 16px; "><div aria-label="Selected language: Suomi" aria-description="Language selector" data-breakpoint="0" class="ly-languages-switcher ly-links ly-bright-theme" style="color: #ffffff;"><a href="#" data-language-code="fi" data-ly-locked="true" class="ly-languages-switcher-link current_lang" style=" background: rgba(255, 255, 255, 0); color: #ffffff; " tabindex="-1"><span class="ly-inner-text">Suomi</span></a><a href="#" data-language-code="en" data-ly-locked="true" class="ly-languages-switcher-link" style=" background: rgba(255, 255, 255, 0); color: #ffffff; " tabindex="-1"><span class="ly-inner-text">Englanti</span></a><a href="#" data-language-code="sv" data-ly-locked="true" class="ly-languages-switcher-link" style=" background: rgba(255, 255, 255, 0); color: #ffffff; " tabindex="-1"><span class="ly-inner-text">Ruotsi</span></a></div></div> <div data-breakpoint="768" class="ly-switcher-wrapper ly-breakpoint-2 custom ly-custom ly-is-transparent ly-hide" style="font-size: 14px; "><div aria-label="Selected language: Suomi" aria-description="Language selector" data-breakpoint="768" class="ly-languages-switcher ly-links ly-bright-theme" style="color: #ffffff;"><a href="#" data-language-code="fi" data-ly-locked="true" class="ly-languages-switcher-link current_lang" style=" color: #ffffff; " tabindex="-1"><span class="ly-inner-text">Suomi</span></a><a href="#" data-language-code="en" data-ly-locked="true" class="ly-languages-switcher-link" style=" color: #ffffff; " tabindex="-1"><span class="ly-inner-text">Englanti</span></a><a href="#" data-language-code="sv" data-ly-locked="true" class="ly-languages-switcher-link" style=" color: #ffffff; " tabindex="-1"><span class="ly-inner-text">Ruotsi</span></a></div></div> <style>.ly-languages-switcher ul > li[key="fi"] { order: -1 !important; } .ly-popup-modal .ly-popup-modal-content ul > li[key="fi"], .ly-languages-switcher.ly-links a[data-language-code="fi"] { order: 1 !important; }.ly-languages-switcher ul > li[key="en"] { order: -2 !important; } .ly-popup-modal .ly-popup-modal-content ul > li[key="en"], .ly-languages-switcher.ly-links a[data-language-code="en"] { order: 2 !important; }.ly-languages-switcher ul > li[key="sv"] { order: -3 !important; } .ly-popup-modal .ly-popup-modal-content ul > li[key="sv"], .ly-languages-switcher.ly-links a[data-language-code="sv"] { order: 3 !important; } .ly-flag-icon-fi { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-fi.svg?v=80049267796748435321599034465'); } .ly-flag-icon-en { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-en.svg?v=168749326791323067301599034471'); } .ly-flag-icon-sv { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-sv.svg?v=72445224395125252121599034467'); } .ly-breakpoint-1 { display: none; } @media (min-width:0px) and (max-width: 767px ) { .ly-breakpoint-1 { display: inline-block; } .ly-recommendation .ly-banner-content, .ly-recommendation .ly-popup-modal-content { font-size: px !important; color: !important; background: !important; border-radius: px !important; border-width: px !important; border-color: !important; } .ly-recommendation-form button[type="submit"] { font-size: px !important; color: !important; background: !important; } } .ly-breakpoint-1 .ly-flag-icon-fi { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-fi.svg?v=80049267796748435321599034465') !important; } .ly-breakpoint-1 .ly-flag-icon-en { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-en.svg?v=168749326791323067301599034471') !important; } .ly-breakpoint-1 .ly-flag-icon-sv { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-sv.svg?v=72445224395125252121599034467') !important; } .ly-breakpoint-2 { display: none; } @media (min-width:768px) { .ly-breakpoint-2 { display: inline-block; } .ly-recommendation .ly-banner-content, .ly-recommendation .ly-popup-modal-content { font-size: px !important; color: !important; background: !important; border-radius: px !important; border-width: px !important; border-color: !important; } .ly-recommendation-form button[type="submit"] { font-size: px !important; color: !important; background: !important; } } .ly-breakpoint-2 .ly-flag-icon-fi { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-fi.svg?v=80049267796748435321599034465') !important; } .ly-breakpoint-2 .ly-flag-icon-en { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-en.svg?v=168749326791323067301599034471') !important; } .ly-breakpoint-2 .ly-flag-icon-sv { background-image: url('//web.archive.org/web/20231121174249im_/https://julkaisut.um.fi/cdn/shop/t/2/assets/ly-icon-sv.svg?v=72445224395125252121599034467') !important; } .ly-switcher-wrapper { } .ly-switcher-wrapper.fixed { position: fixed; z-index: 1000; } .ly-switcher-wrapper.absolute { position: absolute; z-index: 1000; } .ly-switcher-wrapper.fixed.top_left, .ly-switcher-wrapper.absolute.top_left { top: 0; left: 0; } .ly-switcher-wrapper.fixed.top_right, .ly-switcher-wrapper.absolute.top_right { top: 0; right: 0; } .ly-switcher-wrapper.fixed.bottom_left, .ly-switcher-wrapper.absolute.bottom_left { bottom: 0; left: 0; } .ly-switcher-wrapper.fixed.bottom_right, .ly-switcher-wrapper.absolute.bottom_right { bottom: 0; right: 0; } .ly-switcher-wrapper .shopify-currency-form { display: inline-block; } .ly-currency-switcher { font-size: 1em; } .ly-inner-text { margin: 0 0.2em; white-space: nowrap; } .ly-flag-icon { background-size: contain; background-position: 50%; background-repeat: no-repeat; position: relative; display: inline-block; width: 1.33333333em; line-height: 1em; } .ly-flag-icon:before { content: ''; display: inline-block; } .ly-flag-icon.ly-flag-squared { width: 1em; } .ly-flag-icon.ly-flag-rounded { width: 1em; border-radius: 50%; } .ly-languages-switcher { white-space: nowrap; list-style-type: none; display: flex; font-size: 1em; } .ly-languages-switcher-link { margin: 0 0.2em; cursor: pointer; white-space: nowrap; text-decoration: none; display: inline-block; } .ly-languages-switcher.ly-list { margin: 0; padding: 0; display: block; } .ly-languages-switcher.ly-native-select { } .ly-icon { margin: 0 0.2em; } .ly-arrow { display: inline-block; position: relative; vertical-align: middle; direction: ltr !important; -webkit-transition: transform 0.25s; -moz-transition: transform 0.25s; transition: transform 0.25s; margin: 0 0.2em; } .ly-custom-dropdown-switcher.ly-is-open .ly-arrow { transform: rotate(180deg); } .ly-custom-dropdown-switcher.ly-arrow.ly-arrow-up { transform: rotate(180deg); } .ly-custom-dropdown-switcher.ly-is-open .ly-arrow.ly-arrow-up { transform: rotate(0deg); } .ly-custom-dropdown-switcher { text-align: left; display: inline-block; position: relative; user-select: none; cursor: pointer; } .ly-custom-dropdown-current { display: block; vertical-align: middle; } .ly-custom-dropdown-current-inner { display: inline-block; vertical-align: middle; } .ly-custom-dropdown-current-inner-image { margin-right: 0.25em; } .ly-custom-dropdown-current-inner-text { margin: 0 0.2em; } .ly-custom-dropdown-list { display: none !important; list-style: none; position: absolute; left: 0; padding: inherit !important; padding: 0 !important; margin: 0; z-index: 99999; text-align: left; width: 100%; font-size: 1em; } .ly-custom-dropdown-list-element { color: inherit !important; display: block; } .ly-custom-dropdown-list > li { margin: 0 !important; display: block; } .ly-custom-dropdown-list-element-left { margin-right: 0.5em; } .ly-custom-dropdown-list-element-right { text-align: left; } .ly-custom-dropdown-list-element-left, .ly-custom-dropdown-list-element-right { vertical-align: middle; } .ly-custom-dropdown-switcher .ly-languages-switcher-link { margin: 0; } .ly-languages-switcher-dropdown { display: inline-block; } .ly-languages-links-switcher { display: inline-block; } .ly-languages-links-switcher > .ly-languages-link { /*margin-right: 0.5em;*/ padding: inherit !important; color: inherit !important; } .ly-custom-dropdown-list-element { /*padding: inherit !important;*/ text-decoration: none; } .ly-is-uppercase { text-transform: uppercase; } .ly-is-transparent.ly-links, .ly-is-transparent.ly-list, .ly-is-transparent.ly-currency-switcher, .ly-is-transparent.ly-custom-dropdown-switcher, .ly-is-transparent.ly-custom-dropdown-switcher .ly-custom-dropdown-list { background: transparent !important; } .ly-arrow-up { transform: rotateZ(180deg); } .ly-custom-dropdown-switcher .ly-custom-dropdown-list li.current{ display: none; } .ly-custom-dropdown-switcher.ly-is-open .ly-custom-dropdown-list { display: flex !important; min-width: 100%; width: 100%; flex-direction: column-reverse; right: 0; left: auto; overflow: auto; max-height: 350px; max-height: 50vh; } .ly-is-dropup .ly-custom-dropdown-list { bottom: 100%; } .ly-hide { display: none !important; } body.ly-force-off #preview-bar-iframe, body.ly-force-off .ly-languages-switcher { display: none !important; } .ly-close { position: absolute; opacity: 0.3; right: 0; top: 0; width: 3em; height: 3em; display: inline-block !important; background: rbga(0,0,0,0); padding: 1em; } .ly-close:hover { opacity: 1; } .ly-close .inner { transform: translateX(-50%); position: relative; width: 100%; height: 100%; display: inline-block; } .ly-close .inner:before, .ly-close .inner:after { position: absolute; left: 1em; content: ' '; height: 1em; width: 2px; background-color: #333; } .ly-close .inner:before { transform: rotate(45deg); } .ly-close .inner:after { transform: rotate(-45deg); } .ly-popup-switcher {} .ly-popup-switcher .ly-popup-current { cursor: pointer; background: transparent; } .ly-popup-switcher .ly-popup-modal { position: fixed; z-index: 1000; top: 0; left: 0; width: 100%; height: 100%; display: none; justify-content: center; align-items: center; } .ly-popup-switcher.ly-is-open .ly-popup-modal { display: flex; } .ly-popup-switcher .ly-popup-modal-backdrop { position: fixed; width: 100%; height: 100%; z-index: 0; top: 0; left: 0; background:rgba(0, 0, 0, 0.38); cursor: pointer; } .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content { padding: 1em; position: absolute; z-index: 1000; } .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul { padding: 0; margin: 12px 0 0 0; list-style: none; display: flex; flex-direction: column; } .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul .ly-languages-switcher-link { margin: 0; border: solid 1px; padding: 1em; display: block; min-width: 225px; margin-top: 1em; } .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul .ly-languages-switcher-link.current_lang { display: none; } /* Recommendation */ .ly-recommendation { display: none; } .ly-recommendation.ly-is-open { display: inline-block; } .ly-recommendation form { display: inline-block; } .ly-recommendation .ly-arrow, .ly-arrow.recommendation { display: none; } .ly-recommendation .ly-arrow.recommendation { display: inline-block; } .ly-recommendation .ly-switcher-wrapper { font-size: 1em !important; } .ly-recommendation .ly-popup-modal .ly-popup-switcher .ly-popup-modal .ly-popup-modal-backdrop { display: none; } .ly-recommendation-form button[type="submit"] { cursor: pointer; } /* Recommendation Banner */ .ly-recommendation .ly-banner { position: fixed; z-index: 100000; width: 100%; } .ly-recommendation .ly-banner .ly-banner-content { width: 100%; padding: 1em 30px 1em 1em; box-shadow: 0 0 20px rgba(0,0,0,.25); } .ly-recommendation .ly-banner.top { top: 0; } .ly-recommendation .ly-banner.bottom { bottom: 0; } .ly-recommendation .ly-banner .ly-banner-content .ly-switcher-wrapper { position: relative !important; margin: 0 !important; display: inline-block !important; } .ly-recommendation .ly-banner .ly-recommendation-form button[type="submit"] { margin-left: 10px; } /* Recommendation Popup */ .ly-recommendation .ly-popup-modal { position: fixed; z-index: 10000; } .ly-recommendation .ly-popup-modal .ly-switcher-wrapper { position: relative !important; margin: 0 !important; display: inline-block !important; } .ly-recommendation .ly-popup-modal-backdrop { position: fixed; width: 100%; height: 100%; z-index: 1000; top: 0; left: 0; background:rgba(0, 0, 0, 0.38); } .ly-recommendation .ly-popup-modal .ly-popup-modal-content { padding: 1em 30px 1em 1em; } .ly-recommendation .ly-popup-modal .ly-popup-modal-content .ly-languages-switcher { position: relative !important; margin: 0 !important; } .ly-recommendation .ly-popup-modal .ly-popup-modal-content h3 { margin: 0 2em 1em 0; font-size: inherit; position: relative; } .ly-recommendation .ly-popup-modal.top_left { top: 0; left: 0; margin-right: 0 !important; margin-bottom: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important;} .ly-recommendation .ly-popup-modal.top_center { top: 0; left: 50%; transform: translateX(-50%); margin-right: 0 !important; margin-bottom: 0 !important; margin-left: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important; padding-left: 0 !important;} .ly-recommendation .ly-popup-modal.top_right { top: 0; right: 0; margin-left: 0 !important; margin-bottom: 0 !important; padding-left: 0 !important; padding-bottom: 0 !important; } .ly-recommendation .ly-popup-modal.center_center { top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%); margin: 0 !important; padding: 0 !important; } .ly-recommendation .ly-popup-modal.bottom_left { bottom: 0; left: 0; margin-right: 0 !important; margin-top: 0 !important; padding-right: 0 !important; padding-top: 0 !important; } .ly-recommendation .ly-popup-modal.bottom_center { bottom: 0; left: 50%; transform: translateX(-50%); margin-right: 0 !important; margin-left: 0 !important; margin-top: 0 !important; padding-right: 0 !important; padding-left: 0 !important; padding-top: 0 !important; } .ly-recommendation .ly-popup-modal.bottom_right { bottom: 0; right: 0; margin-left: 0 !important; margin-top: 0 !important; padding-left: 0 !important; padding-top: 0 !important; } </style><!-- langify-v2-scripts-end --></body> </html> <!-- FILE ARCHIVED ON 17:42:49 Nov 21, 2023 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 12:32:04 Nov 28, 2024. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.552 exclusion.robots: 0.025 exclusion.robots.policy: 0.016 esindex: 0.01 cdx.remote: 9.657 LoadShardBlock: 193.475 (3) PetaboxLoader3.datanode: 133.773 (4) PetaboxLoader3.resolve: 90.706 (2) load_resource: 98.89 -->

Pages: 1 2 3 4 5 6 7 8 9 10