CINXE.COM

Muut julkaisut – 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/collections/muut-julkaisut","20230616073254","https://web.archive.org/","web","/_static/", "1686900774"); </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":"v2175","locked":false,"initialized":true,"scope":"collection","access_granted":true,"access_denied":false,"requires_customer":false,"manual_lock":false,"server_lock":false,"has_timeout":false,"server_rendered":null,"hide_resource":false,"hide_links_to_resource":false,"transparent":true,"locks":{"all":[],"opened":[]},"keys":[],"keys_signature":"a01a4dfcdb1d084dcaa180fa67ab0844ddcf9982986155db462e143cf2df5360","state":{"template":"collection","theme":79529541683,"product":null,"collection":"muut-julkaisut","page":null,"blog":null,"article":null,"app":null},"now":1686900774,"path":"\/collections\/muut-julkaisut","locale_root_url":"\/","canonical_url":"https:\/\/web.archive.org\/web\/20230616073254\/https:\/\/julkaisut.um.fi\/collections\/muut-julkaisut","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\":\"v2175\",\"locked\":false,\"initialized\":true,\"scope\":\"collection\",\"access_granted\":true,\"access_denied\":false,\"requires_customer\":false,\"manual_lock\":false,\"server_lock\":false,\"has_timeout\":false,\"server_rendered\":null,\"hide_resource\":false,\"hide_links_to_resource\":false,\"transparent\":true,\"locks\":{\"all\":[],\"opened\":[]},\"keys\":[],\"keys_signature\":\"a01a4dfcdb1d084dcaa180fa67ab0844ddcf9982986155db462e143cf2df5360\",\"state\":{\"template\":\"collection\",\"theme\":79529541683,\"product\":null,\"collection\":\"muut-julkaisut\",\"page\":null,\"blog\":null,\"article\":null,\"app\":null},\"now\":1686900774,\"path\":\"\\\/collections\\\/muut-julkaisut\",\"locale_root_url\":\"\\\/\",\"canonical_url\":\"https:\\\/\\\/julkaisut.um.fi\\\/collections\\\/muut-julkaisut\",\"customer_id\":null,\"customer_id_signature\":\"a01a4dfcdb1d084dcaa180fa67ab0844ddcf9982986155db462e143cf2df5360\",\"cart\":null}\u003c\/script\u003e";Locksmith.jsonTagSignature="8831f3257c9b776f3160e221be90f1447dd1047e808fd9b3c95e1b1fd87a6e5b"</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/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/files/UM_merkki_32x32.png?v=1613573629" type="image/png"/> <!-- Title and description ================================================== --> <title> Muut julkaisut &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/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut"> <meta name="twitter:card" content="summary_large_image"> <!-- Helpers ================================================== --> <link rel="canonical" href="https://web.archive.org/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#003773"> <!-- CSS ================================================== --> <link href="//web.archive.org/web/20230616073254cs_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/timber.scss.css?v=124607879368800232131669032221" rel="stylesheet" type="text/css" media="all"/> <link href="//web.archive.org/web/20230616073254cs_/https://cdn.shopify.com/s/files/1/0253/9487/2371/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" type="application/atom+xml" title="Feed" href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut.atom"/> <link rel="alternate" hreflang="x-default" href="https://web.archive.org/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut"> <link rel="alternate" hreflang="fi-FI" href="https://web.archive.org/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut"> <link rel="alternate" hreflang="en-FI" href="https://web.archive.org/web/20230616073254/https://julkaisut.um.fi/en/collections/muut-julkaisut"> <link rel="alternate" hreflang="sv-FI" href="https://web.archive.org/web/20230616073254/https://julkaisut.um.fi/sv/collections/muut-julkaisut"> <link rel="alternate" type="application/json+oembed" href="https://web.archive.org/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut.oembed"> <script> (function() { var scripts = ["https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/runtime.baseline.fi.95a6d1f0b67252d43d0e.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/checkout-web-packages~Information~NoAddressLocation~Payment~PostPurchase~Review~Shipping~ShopPay~Sho~cf13f96e.baseline.fi.8d3a709bcf8c04f77ed7.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/Information~Payment~ShopPay.baseline.fi.ef252719713d62a94eb3.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/Information~Payment.baseline.fi.ca4d87879436db013ba1.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/Information.baseline.fi.31e79c5e99d5e5c748b0.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/checkout-web-ui~app.baseline.fi.26a0342d355a675e2801.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/vendors~app.baseline.fi.c789ad9065435d39f475.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/checkout-web-packages~app.baseline.fi.315ee99826bf151b4cdf.js", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/app.baseline.fi.8cddacae6f9d5fc1d6f1.js"]; var styles = ["https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/checkout-web-ui~app.baseline.fi.ba7746e3965877991bae.css", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/vendors~app.baseline.fi.954db6995929b6f1f646.css", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/app.baseline.fi.dd733f21b66b59afc26d.css", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/Information~Payment~ShopPay.baseline.fi.9f248e42bf2a8151ea27.css", "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/checkout-web/assets/Information.baseline.fi.6d08f77e3a864d9cf367.css"]; function prefetch(url, as, callback) { var link = document.createElement('link'); if (link.relList.supports('prefetch')) { link.rel = 'prefetch'; link.fetchPriority = 'low'; link.as = as; link.href = url; link.onload = link.onerror = callback; document.head.appendChild(link); } else { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onloadend = callback; xhr.send(); } } function prefetchAssets() { var resources = [].concat( scripts.map(function(url) { return [url, 'script']; }), styles.map(function(url) { return [url, 'style']; }) ); var index = 0; (function next() { var res = resources[index++]; if (res) prefetch(res[0], res[1], next); })(); } addEventListener('load', prefetchAssets); })(); </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\/20230616073254\/https:\/\/cdn.shopify.com\/shopifycloud\/payment-sheet\/assets\/latest\/spb.fi.js?v=2","dynamic_checkout_cart_url":"https:\/\/web.archive.org\/web\/20230616073254\/https:\/\/cdn.shopify.com\/shopifycloud\/payment-sheet\/assets\/latest\/dynamic-checkout-cart.fi.js?v=2","locale":"fi","optimusEnabled":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 = "cdn.shopify.com"; 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":10800,"reqid":"eefcb1d2-f9ef-45d4-8c0b-e069b718c2bf","pageurl":"julkaisut.um.fi\/collections\/muut-julkaisut","u":"78d46c83846d","p":"collection","rtyp":"collection","rid":159750848563};</script> <script>window.ShopifyPaypalV4VisibilityTracking = true;</script> <script>!function(o){o.addEventListener("DOMContentLoaded",function(){window.Shopify=window.Shopify||{},window.Shopify.recaptchaV3=window.Shopify.recaptchaV3||{siteKey:"6LcCR2cUAAAAANS1Gpq_mDIJ2pQuJphsSQaUEuc9"};var t=['form[action*="/contact"] input[name="form_type"][value="contact"]','form[action*="/comments"] input[name="form_type"][value="new_comment"]','form[action*="/account"] input[name="form_type"][value="customer_login"]','form[action*="/account"] input[name="form_type"][value="recover_customer_password"]','form[action*="/account"] input[name="form_type"][value="create_customer"]','form[action*="/contact"] input[name="form_type"][value="customer"]'].join(",");function n(e){e=e.target;null==e||null!=(e=function e(t,n){if(null==t.parentElement)return null;if("FORM"!=t.parentElement.tagName)return e(t.parentElement,n);for(var o=t.parentElement.action,r=0;r<n.length;r++)if(-1!==o.indexOf(n[r]))return t.parentElement;return null}(e,["/contact","/comments","/account"]))&&null!=e.querySelector(t)&&((e=o.createElement("script")).setAttribute("src","https://web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/storefront-recaptcha-v3/v0.6/index.js"),o.body.appendChild(e),o.removeEventListener("focus",n,!0),o.removeEventListener("change",n,!0),o.removeEventListener("click",n,!0))}o.addEventListener("click",n,!0),o.addEventListener("change",n,!0),o.addEventListener("focus",n,!0)})}(document);</script> <script integrity="" data-source-attribution="shopify.loadfeatures" defer="defer" src="//web.archive.org/web/20230616073254js_/https://cdn.shopify.com/shopifycloud/shopify/assets/storefront/load_feature-3f13ad638dda6342084642726e80965205d5b82d761805d0f0b2850313bc1fdf.js" crossorigin="anonymous"></script> <script integrity="" data-source-attribution="shopify.dynamic-checkout" defer="defer" src="//web.archive.org/web/20230616073254js_/https://cdn.shopify.com/shopifycloud/shopify/assets/storefront/features-87e8399988880142f2c62771b9d8f2ff6c290b3ff745dd426eb0dfe0db9d1dae.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/20230616073254js_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/jquery-2.2.3.min.js?v=58211863146907186831574167365"></script> <script src="//web.archive.org/web/20230616073254js_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/lazysizes.min.js?v=155223123402716617051574167366" async="async"></script> <meta property="og:image" content="https://web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/files/UM-julkaisupalvelut-logo-740x200.png?height=628&amp;pad_color=ffffff&amp;v=1613591426&amp;width=1200"/> <meta property="og:image:secure_url" content="https://cdn.shopify.com/s/files/1/0253/9487/2371/files/UM-julkaisupalvelut-logo-740x200.png?height=628&amp;pad_color=ffffff&amp;v=1613591426&amp;width=1200"/> <meta property="og:image:width" content="1200"/> <meta property="og:image:height" content="628"/> <link href="https://web.archive.org/web/20230616073254/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: "collection"};window.navigator.sendBeacon("https://web.archive.org/web/20230616073254/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="evids-setup"> (function () {let t,e;function n(){t={page_viewed:{},collection_viewed:{},product_viewed:{},product_variant_viewed:{},search_submitted:{},product_added_to_cart:{},checkout_started:{},checkout_completed:{},payment_info_submitted:{},session_started:{}},e={wpm:{},trekkie:{}}}function o(t){return`${t||"sh"}-${function(){const t="xxxx-4xxx-xxxx-xxxxxxxxxxxx";let e="";try{const n=window.crypto,o=new Uint16Array(31);n.getRandomValues(o);let r=0;e=t.replace(/[x]/g,(t=>{const e=o[r]%16;return r++,("x"===t?e:3&e|8).toString(16)})).toUpperCase()}catch(n){e=t.replace(/[x]/g,(t=>{const e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})).toUpperCase()}return`${function(){let t=0,e=0;t=(new Date).getTime()>>>0;try{e=performance.now()>>>0}catch(t){e=0}const n=Math.abs(t+e).toString(16).toLowerCase();return"00000000".substr(0,8-n.length)+n}()}-${e}`}()}`}function r(n,r){if(!t[n]||"trekkie"!==(null==r?void 0:r.analyticsFramework)&&"wpm"!==(null==r?void 0:r.analyticsFramework))return o("shu");const i="string"==typeof(c=r.cacheKey)&&c?c:"default";var c;const a=function(t,n,o){const r=e[n];return void 0===r[t]&&(r[t]={}),void 0===r[t][o]?r[t][o]=0:r[t][o]+=1,r[t][o]}(n,r.analyticsFramework,i);return function(e,n,r){const i=t[e];if(void 0===i[r]){const t=o();i[r]=[t]}else if(void 0===i[r][n]){const t=o();i[r].push(t)}return i[r][n]}(n,a,i)}function i(){window.Shopify=window.Shopify||{},n(),window.Shopify.evids=(t,e)=>r(t,e)}i();})(); </script> <script id="web-pixels-manager-setup">(function e(e,n,a,t,o,r,i){var s=i||[],l=null!==e;l&&(window.Shopify=window.Shopify||{},window.Shopify.analytics=window.Shopify.analytics||{},window.Shopify.analytics.replayQueue=[],window.Shopify.analytics.publish=function(e,n,a){window.Shopify.analytics.replayQueue.push([e,n,a])});var d=function(){var e="legacy",n="unknown",a=null,t=navigator.userAgent.match(/(Firefox|Chrome)\/(\d+)/i),o=navigator.userAgent.match(/(Edg)\/(\d+)/i),r=navigator.userAgent.match(/(Version)\/(\d+)(.+)(Safari)\/(\d+)/i);r?(n="safari",a=parseInt(r[2],10)):o?(n="edge",a=parseInt(o[2],10)):t&&(n=t[1].toLocaleLowerCase(),a=parseInt(t[2],10));var i={chrome:60,firefox:55,safari:11,edge:80}[n];return void 0!==i&&null!==a&&i<=a&&(e="modern"),e}().substring(0,1),c=t.substring(0,1);if(l)try{self.performance.mark("wpm:start")}catch(e){}var p,u,f,w,h,y,m,g,v=[a,s.indexOf("web_pixels_manager_runtime_asset_prefix")>-1?"/wpm":null,"/",c,r,d,".js"].join("");p={src:v,async:!0,onload:function(){if(e){var a=window.webPixelsManager.init(e);n(a),window.Shopify.analytics.replayQueue.forEach((function(e){a.publishCustomEvent(e[0],e[1],e[2])})),window.Shopify.analytics.replayQueue=[],window.Shopify.analytics.publish=a.publishCustomEvent}},onerror:function(){var n=(e.storefrontBaseUrl?e.storefrontBaseUrl.replace(/\/$/,""):self.location.origin)+"/.well-known/shopify/monorail/unstable/produce_batch",a=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:v+" has failed to load"},metadata:{event_created_at_ms:(new Date).getTime()}}]});try{if(self.navigator.sendBeacon.bind(self.navigator)(n,a))return!0}catch(e){}const t=new XMLHttpRequest;try{return t.open("POST",n,!0),t.setRequestHeader("Content-Type","text/plain"),t.send(a),!0}catch(e){console&&console.warn&&console.warn("[Web Pixels Manager] Got an unhandled error while logging a load error.")}return!1}},u=document.createElement("script"),f=p.src,w=p.async||!0,h=p.onload,y=p.onerror,m=document.head,g=document.body,u.async=w,u.src=f,h&&u.addEventListener("load",h),y&&u.addEventListener("error",y),m?m.appendChild(u):g?g.appendChild(u):console.error("Did not find a head or body element to append the script")})({shopId: 25394872371,storefrontBaseUrl: "https://web.archive.org/web/20230616073254/https://julkaisut.um.fi",cdnBaseUrl: "https://web.archive.org/web/20230616073254/https://cdn.shopify.com",surface: "storefront-renderer",enabledBetaFlags: ["web_pixels_use_shop_domain_monorail_endpoint","web_pixels_shopify_pixel_validation","web_pixels_prefetch_assets","web_pixels_manager_runtime_asset_prefix","web_pixels_async_pixel_refactor"],webPixelsConfigList: [{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0544","apiClientId":"shopify-pixel","type":"APP"},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0544","apiClientId":"shopify-pixel","type":"CUSTOM"}],initData: {"cart":null,"checkout":null,"customer":null,"productVariants":[]},},function pageEvents(webPixelsManagerAPI) {webPixelsManagerAPI.publish("page_viewed");webPixelsManagerAPI.publish("collection_viewed", {"collection":{"id":"159750848563","title":"Muut julkaisut","productVariants":[{"id":"40686235123763","image":{"src":"https:\/\/web.archive.org\/web\/20230616073254\/https:\/\/cdn.shopify.com\/s\/files\/1\/0253\/9487\/2371\/products\/Kirjanmerkki_60x210_SUOMI_netti.jpg?v=1657007287"},"price":{"amount":0.0,"currencyCode":"EUR"},"product":{"id":"6763335974963","title":"Euroopan unionin j\u00e4senmaat -kirjanmerkki","untranslatedTitle":"Euroopan unionin j\u00e4senmaat -kirjanmerkki","vendor":"UM julkaisupalvelut","type":""},"sku":"ET-100051-FI","title":"Default Title","untranslatedTitle":"Default Title"},{"id":"44198182453531","image":{"src":"https:\/\/web.archive.org\/web\/20230616073254\/https:\/\/cdn.shopify.com\/s\/files\/1\/0253\/9487\/2371\/products\/Euroopankartta2022.jpg?v=1671535836"},"price":{"amount":0.0,"currencyCode":"EUR"},"product":{"id":"8045903806747","title":"Euroopan kartta (FI)","untranslatedTitle":"Euroopan kartta (FI)","vendor":"UM julkaisupalvelut","type":""},"sku":"ET-100055-FI","title":"Default Title","untranslatedTitle":"Default Title"},{"id":"40686244069427","image":{"src":"https:\/\/web.archive.org\/web\/20230616073254\/https:\/\/cdn.shopify.com\/s\/files\/1\/0253\/9487\/2371\/products\/Kirjanmerkki_60x210_RUOTSI_netti.jpg?v=1657007613"},"price":{"amount":0.0,"currencyCode":"EUR"},"product":{"id":"6763341217843","title":"Europeiska unionens medlemsl\u00e4nder -bokm\u00e4rke","untranslatedTitle":"Europeiska unionens medlemsl\u00e4nder -bokm\u00e4rke","vendor":"UM julkaisupalvelut","type":""},"sku":"ET-100052-SV","title":"Default Title","untranslatedTitle":"Default Title"},{"id":"44198186778907","image":{"src":"https:\/\/web.archive.org\/web\/20230616073254\/https:\/\/cdn.shopify.com\/s\/files\/1\/0253\/9487\/2371\/products\/Europakarta2022.jpg?v=1671536015"},"price":{"amount":0.0,"currencyCode":"EUR"},"product":{"id":"8045904953627","title":"Europakarta (SV)","untranslatedTitle":"Europakarta (SV)","vendor":"UM julkaisupalvelut","type":""},"sku":"ET-100056-SV","title":"Default Title","untranslatedTitle":"Default Title"}]}});},"https://web.archive.org/web/20230616073254/https://cdn.shopify.com","browser","0.0.312","fe685c3dwce77e4ddp382209acm19f119f6",["web_pixels_use_shop_domain_monorail_endpoint","web_pixels_shopify_pixel_validation","web_pixels_prefetch_assets","web_pixels_manager_runtime_asset_prefix","web_pixels_async_pixel_refactor"]);</script> <script>window.ShopifyAnalytics = window.ShopifyAnalytics || {}; window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; window.ShopifyAnalytics.meta.currency = 'EUR'; var meta = {"products":[{"id":6763335974963,"gid":"gid:\/\/shopify\/Product\/6763335974963","vendor":"UM julkaisupalvelut","type":"","variants":[{"id":40686235123763,"price":0,"name":"Euroopan unionin j盲senmaat -kirjanmerkki","public_title":null,"sku":"ET-100051-FI"}]},{"id":8045903806747,"gid":"gid:\/\/shopify\/Product\/8045903806747","vendor":"UM julkaisupalvelut","type":"","variants":[{"id":44198182453531,"price":0,"name":"Euroopan kartta (FI)","public_title":null,"sku":"ET-100055-FI"}]},{"id":6763341217843,"gid":"gid:\/\/shopify\/Product\/6763341217843","vendor":"UM julkaisupalvelut","type":"","variants":[{"id":40686244069427,"price":0,"name":"Europeiska unionens medlemsl盲nder -bokm盲rke","public_title":null,"sku":"ET-100052-SV"}]},{"id":8045904953627,"gid":"gid:\/\/shopify\/Product\/8045904953627","vendor":"UM julkaisupalvelut","type":"","variants":[{"id":44198186778907,"price":0,"name":"Europakarta (SV)","public_title":null,"sku":"ET-100056-SV"}]}],"page":{"pageType":"collection","resourceType":"collection","resourceId":159750848563}}; 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: "https://web.archive.org/web/20230616073254/https://cdn.shopify.com/s/trekkie.storefront.cf139497084ea98179887e6dfce71546a0485294.min.js"}); }; scriptFallback.async = true; scriptFallback.src = 'https://web.archive.org/web/20230616073254/https://cdn.shopify.com/s/trekkie.storefront.cf139497084ea98179887e6dfce71546a0485294.min.js'; first.parentNode.insertBefore(scriptFallback, first); }; script.async = true; script.src = 'https://web.archive.org/web/20230616073254/https://cdn.shopify.com/s/trekkie.storefront.cf139497084ea98179887e6dfce71546a0485294.min.js'; first.parentNode.insertBefore(script, first); }; trekkie.load( {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":25394872371,"isMerchantRequest":null,"themeId":79529541683,"themeCityHash":"1013630396827743084","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":"collection","resourceType":"collection","resourceId":159750848563}); 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 Category",{"currency":"EUR","category":"Collection: muut-julkaisut","collectionName":"muut-julkaisut","collectionId":159750848563,"nonInteraction":true}); } }); var eventsListenerScript = document.createElement('script'); eventsListenerScript.async = true; eventsListenerScript.src = "//web.archive.org/web/20230616073254/https://cdn.shopify.com/shopifycloud/shopify/assets/shop_events_listener-65cd0ba3fcd81a1df33f2510ec5bcf8c0e0958653b50e3965ec972dd638ee13f.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/20230616073254/https://cdn.shopify.com/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="muut-julkaisut" class="template-collection"> <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="#product-filters">Siirry tuoterajauksiin</a> <a href="#product-list">Siirry tuotelistaukseen</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/20230616073254/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/20230616073254/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/20230616073254/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/20230616073254/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/20230616073254/https://julkaisut.um.fi/" class="mobile-nav"> Etusivu </a> </li> <li class="mobile-nav__link" aria-haspopup="true"> <a href="/web/20230616073254/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/20230616073254/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/20230616073254/https://julkaisut.um.fi/collections/globaalikasvatus"> Globaalikasvatus </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/kehityspolitiikka"> Kehityspolitiikka </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/kehityslehti"> Kehitys-Utveckling-lehti </a> </li> </ul> </li> <li class="mobile-nav__link" aria-haspopup="true"> <a href="/web/20230616073254/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/20230616073254/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/20230616073254/https://julkaisut.um.fi/collections/kirjat-ja-esitteet"> Kirjat ja esitteet </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut" aria-current="page"> Muut julkaisut </a> </li> <li class="mobile-nav__sublist-link"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/arkisto"> Arkisto </a> </li> </ul> </li> <li class="mobile-nav__link"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/ulko-ja-turvallisuuspolitiikka" class="mobile-nav"> Ulko- ja turvallisuuspolitiikka </a> </li> <li class="mobile-nav__link"> <a href="/web/20230616073254/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/20230616073254/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/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/files/UM-julkaisupalvelut-logo-740x200_260x.png?v=1613591426" alt="UM julkaisupalvelut"/> </span> </noscript> <span class="logo__image-wrapper supports-js"><a href="/web/20230616073254/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/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/files/UM-julkaisupalvelut-logo-740x200_1x1.png?v=1613591426" data-src="//web.archive.org/web/20230616073254/https://cdn.shopify.com/s/files/1/0253/9487/2371/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/20230616073254/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/20230616073254/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/20230616073254/https://julkaisut.um.fi/collections/globaalikasvatus" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Globaalikasvatus </a> </li> <li> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/kehityspolitiikka" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Kehityspolitiikka </a> </li> <li> <a href="/web/20230616073254/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/20230616073254/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/20230616073254/https://julkaisut.um.fi/collections/kirjat-ja-esitteet" class="site-nav__link" data-meganav-type="child" tabindex="-1"> Kirjat ja esitteet </a> </li> <li class="site-nav--active"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut" class="site-nav__link" data-meganav-type="child" aria-current="page" tabindex="-1"> Muut julkaisut </a> </li> <li> <a href="/web/20230616073254/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/20230616073254/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-collection-template" class="shopify-section"> <div id="CollectionSection" data-section-id="collection-template" data-section-type="collection-template" data-sort-enabled="true" data-tags-enabled="true"> <div class="section-header section-header--breadcrumb"> <nav class="breadcrumb" role="navigation" aria-label="Murupolku"> <a href="/web/20230616073254/https://julkaisut.um.fi/" title="Takaisin etusivulle">Koti</a> <span aria-hidden="true" class="breadcrumb__sep">&rsaquo;</span> <span>Muut julkaisut</span> </nav> </div> <header class="section-header section-header--large"> <h1 class="section-header__title section-header__title--left">Muut julkaisut<span class="visually-hidden"> &ndash; UM julkaisupalvelut</span></h1> <div class="section-header__link--right"> <div class="form-horizontal"> <label for="SortBy">Lajittele:</label> <select name="sort_by" id="SortBy" class="btn--tertiary" aria-describedby="a11y-refresh-page-message"> <option value="manual">Esittelyss盲</option> <option value="best-selling">Eniten myydyt</option> <option value="title-ascending">Aakkosj盲rjestyksess盲 A鈥揨</option> <option value="title-descending">Aakkosj盲rjestyksess盲 Z鈥揂</option> <option value="created-ascending">P盲iv盲m盲盲r盲 vanhimmasta uusimpaan</option> <option value="created-descending">P盲iv盲m盲盲r盲 uusimmasta vanhimpaan</option> </select> </div> </div> </header> <div class="grid-uniform"> <div class="grid__item one-whole large--one-fifth"> <div class="collection-tags--filters"> <h2 class="visually-hidden" id="product-filters">Tuoterajaus</h2> <div class="tag-group"> <h3 class="h5">Kieliversio</h3> <div class="tags-filtering" aria-describedby="a11y-refresh-page-message"> <span class="single-tag"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/language-fi" aria-label="Tarkenna hakua tuotteisiin, jotka vastaavat tunnistetta SUOMI">SUOMI</a> </span> <span class="single-tag"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/language-sv" aria-label="Tarkenna hakua tuotteisiin, jotka vastaavat tunnistetta RUOTSI">RUOTSI</a> </span> </div> </div> <div class="tag-group"> <h3 class="h5">Tuotemuoto</h3> <div class="tags-filtering" aria-describedby="a11y-refresh-page-message"> <span class="single-tag"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/producttype-pdf" aria-label="Tarkenna hakua tuotteisiin, jotka vastaavat tunnistetta PDF">PDF</a> </span> <span class="single-tag"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/producttype-fyysinen" aria-label="Tarkenna hakua tuotteisiin, jotka vastaavat tunnistetta FYYSINEN">FYYSINEN</a> </span> </div> </div> <div class="tag-group"> <h3 class="h5">Kategoria</h3> <div class="tags-filtering" aria-describedby="a11y-refresh-page-message"> <span class="single-tag"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/muut-julkaisut" aria-label="Tarkenna hakua tuotteisiin, jotka vastaavat tunnistetta MUUT JULKAISUT">MUUT JULKAISUT</a> </span> </div> </div> </div> </div> <div class="grid__item one-whole large--four-fifths"> <h2 class="visually-hidden" id="product-list">Tuotelistaus</h2> <ul class="grid"> <li class="grid__item wide--one-fifth large--one-quarter medium--one-half small--one-whole"> <div class=" sold-out"> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/products/euroopan-unionin-jasenmaat-kirjanmerkki" class="grid-link"> <div class="grid-link__image grid-link__image--loading grid-link__image-sold-out grid-link__image--product" data-image-wrapper> <span class="badge badge--sold-out"> <span class="badge__text badge__text--small">Ei saatavilla painettuna</span> </span> <div class="grid-link__image-centered"> <style> #ProductImage-29164412960819 { max-width: 137.2258064516129px; max-height: 480px; } #ProductImageWrapper-29164412960819 { max-width: 137.2258064516129px; } </style> <div id="ProductImageWrapper-29164412960819" class="product__img-wrapper supports-js"> <div style="padding-top:349.78843441466853%;"> <img id="ProductImage-29164412960819" alt="" src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Kirjanmerkki_60x210_SUOMI_netti_1x1.jpg?v=1657007287" class="product__img lazyload" data-src="//web.archive.org/web/20230616073254/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Kirjanmerkki_60x210_SUOMI_netti_{width}x.jpg?v=1657007287" data-widths="[150, 220, 360, 470, 600, 750, 940, 1080, 1296, 1512, 1728, 2048]" data-aspectratio="0.28588709677419355" data-sizes="auto" data-image> </div> </div> <noscript> <img src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Kirjanmerkki_60x210_SUOMI_netti_large.jpg?v=1657007287" alt="" class="product__img"> </noscript> </div> </div> <p class="grid-link__title">Euroopan unionin j盲senmaat -kirjanmerkki</p> <p class="grid-link__title grid-link__languages" aria-label="Tuote saatavilla kielell盲"> <span class="country country-fi"> SUOMI </span> </p> </a> </div> </li> <li class="grid__item wide--one-fifth large--one-quarter medium--one-half small--one-whole"> <div class=""> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/products/euroopan-kartta-fi-1" class="grid-link"> <div class="grid-link__image grid-link__image--loading grid-link__image-sold-out grid-link__image--product" data-image-wrapper> <div class="badges-wrapper"> <span class="badge badge--square"> <span class="badge__text badge__text--small" aria-label="Tuote saatavilla muodossa PDF">PDF</span> </span> </div> <div class="grid-link__image-centered"> <style> #ProductImage-40073607512347 { max-width: 335px; max-height: 242.68312358825426px; } #ProductImageWrapper-40073607512347 { max-width: 335px; } </style> <div id="ProductImageWrapper-40073607512347" class="product__img-wrapper supports-js"> <div style="padding-top:72.44272345918037%;"> <img id="ProductImage-40073607512347" alt="" src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Euroopankartta2022_1x1.jpg?v=1671535836" class="product__img lazyload" data-src="//web.archive.org/web/20230616073254/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Euroopankartta2022_{width}x.jpg?v=1671535836" data-widths="[150, 220, 360, 470, 600, 750, 940, 1080, 1296, 1512, 1728, 2048]" data-aspectratio="1.380400890868597" data-sizes="auto" data-image> </div> </div> <noscript> <img src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Euroopankartta2022_large.jpg?v=1671535836" alt="" class="product__img"> </noscript> </div> </div> <p class="grid-link__title">Euroopan kartta (FI)</p> <p class="grid-link__title grid-link__languages" aria-label="Tuote saatavilla kielell盲"> <span class="country country-fi"> SUOMI </span> </p> </a> </div> </li> <li class="grid__item wide--one-fifth large--one-quarter medium--one-half small--one-whole"> <div class=""> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/products/europeiska-unionens-medlemslander-bokmarke" class="grid-link"> <div class="grid-link__image grid-link__image--loading grid-link__image-sold-out grid-link__image--product" data-image-wrapper> <div class="grid-link__image-centered"> <style> #ProductImage-29164435275827 { max-width: 137.2258064516129px; max-height: 480px; } #ProductImageWrapper-29164435275827 { max-width: 137.2258064516129px; } </style> <div id="ProductImageWrapper-29164435275827" class="product__img-wrapper supports-js"> <div style="padding-top:349.78843441466853%;"> <img id="ProductImage-29164435275827" alt="" src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Kirjanmerkki_60x210_RUOTSI_netti_1x1.jpg?v=1657007613" class="product__img lazyload" data-src="//web.archive.org/web/20230616073254/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Kirjanmerkki_60x210_RUOTSI_netti_{width}x.jpg?v=1657007613" data-widths="[150, 220, 360, 470, 600, 750, 940, 1080, 1296, 1512, 1728, 2048]" data-aspectratio="0.28588709677419355" data-sizes="auto" data-image> </div> </div> <noscript> <img src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Kirjanmerkki_60x210_RUOTSI_netti_large.jpg?v=1657007613" alt="" class="product__img"> </noscript> </div> </div> <p class="grid-link__title" lang="sv">Europeiska unionens medlemsl盲nder -bokm盲rke</p> <p class="grid-link__title grid-link__languages" aria-label="Tuote saatavilla kielell盲"> <span class="country country-sv"> RUOTSI </span> </p> </a> </div> </li> <li class="grid__item wide--one-fifth large--one-quarter medium--one-half small--one-whole"> <div class=""> <a href="/web/20230616073254/https://julkaisut.um.fi/collections/muut-julkaisut/products/europakarta-sv" class="grid-link"> <div class="grid-link__image grid-link__image--loading grid-link__image-sold-out grid-link__image--product" data-image-wrapper> <div class="badges-wrapper"> <span class="badge badge--square"> <span class="badge__text badge__text--small" aria-label="Tuote saatavilla muodossa PDF">PDF</span> </span> </div> <div class="grid-link__image-centered"> <style> #ProductImage-40073613312283 { max-width: 335px; max-height: 242.68312358825426px; } #ProductImageWrapper-40073613312283 { max-width: 335px; } </style> <div id="ProductImageWrapper-40073613312283" class="product__img-wrapper supports-js"> <div style="padding-top:72.44272345918037%;"> <img id="ProductImage-40073613312283" alt="" src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Europakarta2022_1x1.jpg?v=1671536015" class="product__img lazyload" data-src="//web.archive.org/web/20230616073254/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Europakarta2022_{width}x.jpg?v=1671536015" data-widths="[150, 220, 360, 470, 600, 750, 940, 1080, 1296, 1512, 1728, 2048]" data-aspectratio="1.380400890868597" data-sizes="auto" data-image> </div> </div> <noscript> <img src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/products/Europakarta2022_large.jpg?v=1671536015" alt="" class="product__img"> </noscript> </div> </div> <p class="grid-link__title" lang="sv">Europakarta (SV)</p> <p class="grid-link__title grid-link__languages" aria-label="Tuote saatavilla kielell盲"> <span class="country country-sv"> RUOTSI </span> </p> </a> </div> </li> </ul> </div> </div> </div> </div> <script> // Override default values of shop.strings for each template. // Alternate product templates can change values of // theme.productStrings = { sortBy: 'best-selling' } </script> <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/20230616073254/https://um.fi/etusivu" target="_blank"> <img class="footer-logo-image" src="//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/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/20230616073254/https://julkaisut.um.fi/search">Haku</a></li> <li><a href="https://web.archive.org/web/20230616073254/https://um.fi/tietosuoja">Tietosuojak盲yt盲nt枚mme</a></li> <li><a href="/web/20230616073254/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@formin.fi</p><p>Eurooppatiedotus: eurooppatiedotus@formin.fi</p><p>Tekniset ongelmat: hankintaneuvonta.um@formin.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/20230616073254/https://julkaisut.um.fi/" title="">UM julkaisupalvelut</a>. Shopify-verkkokaupat</p> </div> </div> </div> </footer> </div> <ul hidden> <li id="a11y-refresh-page-message">vaihtoehdon valinta p盲ivitt盲盲 koko sivun</li> </ul> <script src="//web.archive.org/web/20230616073254js_/https://cdn.shopify.com/s/files/1/0253/9487/2371/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/20230616073254/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/20230616073254im_/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/20230616073254/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\/20230616073254\/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/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/ly-icon-fi.svg?v=80049267796748435321599034465'); } .ly-flag-icon-en { background-image: url('//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/ly-icon-en.svg?v=168749326791323067301599034471'); } .ly-flag-icon-sv { background-image: url('//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/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/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/ly-icon-fi.svg?v=80049267796748435321599034465') !important; } .ly-breakpoint-1 .ly-flag-icon-en { background-image: url('//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/ly-icon-en.svg?v=168749326791323067301599034471') !important; } .ly-breakpoint-1 .ly-flag-icon-sv { background-image: url('//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/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/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/ly-icon-fi.svg?v=80049267796748435321599034465') !important; } .ly-breakpoint-2 .ly-flag-icon-en { background-image: url('//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/t/2/assets/ly-icon-en.svg?v=168749326791323067301599034471') !important; } .ly-breakpoint-2 .ly-flag-icon-sv { background-image: url('//web.archive.org/web/20230616073254im_/https://cdn.shopify.com/s/files/1/0253/9487/2371/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 07:32:54 Jun 16, 2023 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 14:44:29 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.497 exclusion.robots: 0.035 exclusion.robots.policy: 0.025 esindex: 0.01 cdx.remote: 3.563 LoadShardBlock: 578.353 (3) PetaboxLoader3.resolve: 3447.248 (4) PetaboxLoader3.datanode: 243.972 (5) load_resource: 3148.406 loaddict: 32.156 -->

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