{"id":232,"date":"2024-12-03T16:30:33","date_gmt":"2024-12-03T16:30:33","guid":{"rendered":"https:\/\/tadanoworld.com\/asia\/?page_id=232"},"modified":"2024-12-19T16:25:11","modified_gmt":"2024-12-19T16:25:11","slug":"happy-holidays-from-tadano","status":"publish","type":"page","link":"https:\/\/tadanoworld.com\/asia\/en\/happy-holidays-from-tadano\/","title":{"rendered":"Happy Holidays From Tadano"},"content":{"rendered":"<div id=\"snow\">\n    <\/div>\n\n    <style type=\"text\/css\">\n        #snow {\n            display: block;\n            position: fixed;\n            left: 0;\n            top: 0;\n            right: 0;\n            bottom: 0;\n            pointer-events: none;\n        }\n    <\/style>\n\n    <script type=\"text\/javascript\">\n\n    class ShaderProgram {\n\n        constructor( holder, options = {} ) {\n\n        options = Object.assign( {\n            antialias: false,\n            depthTest: false,\n            mousemove: false,\n            autosize: true,\n            msaa: 0,\n            vertex: `\n            precision highp float;\n\n            attribute vec4 a_position;\n            attribute vec4 a_color;\n\n            uniform float u_time;\n            uniform vec2 u_resolution;\n            uniform vec2 u_mousemove;\n            uniform mat4 u_projection;\n\n            varying vec4 v_color;\n\n            void main() {\n\n                gl_Position = u_projection * a_position;\n                gl_PointSize = (10.0 \/ gl_Position.w) * 100.0;\n\n                v_color = a_color;\n\n            }`,\n            fragment: `\n            precision highp float;\n\n            uniform sampler2D u_texture;\n            uniform int u_hasTexture;\n\n            varying vec4 v_color;\n\n            void main() {\n\n                if ( u_hasTexture == 1 ) {\n\n                gl_FragColor = v_color * texture2D(u_texture, gl_PointCoord);\n\n                } else {\n\n                gl_FragColor = v_color;\n\n                }\n\n            }`,\n            uniforms: {},\n            buffers: {},\n            camera: {},\n            texture: null,\n            onUpdate: ( () => {} ),\n            onResize: ( () => {} ),\n        }, options )\n\n        const uniforms = Object.assign( {\n            time: { type: 'float', value: 0 },\n            hasTexture: { type: 'int', value: 0 },\n            resolution: { type: 'vec2', value: [ 0, 0 ] },\n            mousemove: { type: 'vec2', value: [ 0, 0 ] },\n            projection: { type: 'mat4', value: [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] },\n        }, options.uniforms )\n\n        const buffers = Object.assign( {\n            position: { size: 3, data: [] },\n            color: { size: 4, data: [] },\n        }, options.buffers )\n\n        const camera = Object.assign( {\n            fov: 60,\n            near: 1,\n            far: 10000,\n            aspect: 1,\n            z: 100,\n            perspective: true,\n        }, options.camera )\n\n        const canvas = document.createElement( 'canvas' )\n        const gl = canvas.getContext( 'webgl', { antialias: options.antialias } )\n\n        if ( ! gl ) return false\n\n        this.count = 0\n        this.gl = gl\n        this.canvas = canvas\n        this.camera = camera\n        this.holder = holder\n        this.msaa = options.msaa\n        this.onUpdate = options.onUpdate\n        this.onResize = options.onResize\n        this.data = {}\n\n        holder.appendChild( canvas )\n\n        this.createProgram( options.vertex, options.fragment )\n\n        this.createBuffers( buffers )\n        this.createUniforms( uniforms )\n\n        this.updateBuffers()\n        this.updateUniforms()\n\n        this.createTexture( options.texture )\n\n        gl.enable( gl.BLEND )\n        gl.enable( gl.CULL_FACE )\n        gl.blendFunc( gl.SRC_ALPHA, gl.ONE )\n        gl[ options.depthTest ? 'enable' : 'disable' ]( gl.DEPTH_TEST )\n\n        if ( options.autosize )\n            window.addEventListener( 'resize', e => this.resize( e ), false )\n        if ( options.mousemove )\n            window.addEventListener( 'mousemove', e => this.mousemove( e ), false )\n\n        this.resize()\n\n        this.update = this.update.bind( this )\n        this.time = { start: performance.now(), old: performance.now() }\n        this.update()\n\n        }\n\n        mousemove( e ) {\n\n        let x = e.pageX \/ this.width * 2 - 1\n        let y = e.pageY \/ this.height * 2 - 1\n\n        this.uniforms.mousemove = [ x, y ]\n\n        }\n\n        resize( e ) {\n\n        const holder = this.holder\n        const canvas = this.canvas\n        const gl = this.gl\n\n        const width = this.width = holder.offsetWidth\n        const height = this.height = holder.offsetHeight\n        const aspect = this.aspect = width \/ height\n        const dpi = this.dpi = Math.max( this.msaa ? 2 : 1, devicePixelRatio )\n\n        canvas.width = width * dpi\n        canvas.height = height * dpi\n        canvas.style.width = width + 'px'\n        canvas.style.height = height + 'px'\n\n        gl.viewport( 0, 0, width * dpi, height * dpi )\n        gl.clearColor( 0, 0, 0, 0 )\n\n        this.uniforms.resolution = [ width, height ]\n        this.uniforms.projection = this.setProjection( aspect )\n\n        this.onResize( width, height, dpi )\n\n        }\n\n        setProjection( aspect ) {\n\n        const camera = this.camera\n\n        if ( camera.perspective ) {\n\n            camera.aspect = aspect\n\n            const fovRad = camera.fov * ( Math.PI \/ 180 )\n            const f = Math.tan( Math.PI * 0.5 - 0.5 * fovRad )\n            const rangeInv = 1.0 \/ ( camera.near - camera.far )\n\n            const matrix = [\n            f \/ camera.aspect, 0, 0, 0,\n            0, f, 0, 0,\n            0, 0, (camera.near + camera.far) * rangeInv, -1,\n            0, 0, camera.near * camera.far * rangeInv * 2, 0\n            ]\n\n            matrix[ 14 ] += camera.z\n            matrix[ 15 ] += camera.z\n\n            return matrix\n\n        } else {\n\n            return [\n            2 \/ this.width, 0, 0, 0,\n            0, -2 \/ this.height, 0, 0,\n            0, 0, 1, 0,\n            -1, 1, 0, 1,\n            ]\n\n        }\n\n        }\n\n        createShader( type, source ) {\n\n        const gl = this.gl\n        const shader = gl.createShader( type )\n\n        gl.shaderSource( shader, source )\n        gl.compileShader( shader )\n\n        if ( gl.getShaderParameter (shader, gl.COMPILE_STATUS ) ) {\n\n            return shader\n\n        } else {\n\n            console.log( gl.getShaderInfoLog( shader ) )\n            gl.deleteShader( shader )\n\n        }\n\n        }\n\n        createProgram( vertex, fragment ) {\n\n        const gl = this.gl\n\n        const vertexShader = this.createShader( gl.VERTEX_SHADER, vertex )\n        const fragmentShader = this.createShader( gl.FRAGMENT_SHADER, fragment )\n\n        const program = gl.createProgram()\n\n        gl.attachShader( program, vertexShader )\n        gl.attachShader( program, fragmentShader )\n        gl.linkProgram( program )\n\n        if ( gl.getProgramParameter( program, gl.LINK_STATUS ) ) {\n\n            gl.useProgram( program )\n            this.program = program\n\n        } else {\n\n            console.log( gl.getProgramInfoLog( program ) )\n            gl.deleteProgram( program )\n\n        }\n\n        }\n\n        createUniforms( data ) {\n\n        const gl = this.gl\n        const uniforms = this.data.uniforms = data\n        const values = this.uniforms = {}\n\n        Object.keys( uniforms ).forEach( name => {\n\n            const uniform = uniforms[ name ]\n\n            uniform.location = gl.getUniformLocation( this.program, 'u_' + name )\n\n            Object.defineProperty( values, name, {\n            set: value => {\n\n                uniforms[ name ].value = value\n                this.setUniform( name, value )\n\n            },\n            get: () => uniforms[ name ].value\n            } )\n\n        } )\n\n        }\n\n        setUniform( name, value ) {\n\n        const gl = this.gl\n        const uniform = this.data.uniforms[ name ]\n\n        uniform.value = value\n\n        switch ( uniform.type ) {\n            case 'int': {\n            gl.uniform1i( uniform.location, value )\n            break\n            }\n            case 'float': {\n            gl.uniform1f( uniform.location, value )\n            break\n            }\n            case 'vec2': {\n            gl.uniform2f( uniform.location, ...value )\n            break\n            }\n            case 'vec3': {\n            gl.uniform3f( uniform.location, ...value )\n            break\n            }\n            case 'vec4': {\n            gl.uniform4f( uniform.location, ...value )\n            break\n            }\n            case 'mat2': {\n            gl.uniformMatrix2fv( uniform.location, false, value )\n            break\n            }\n            case 'mat3': {\n            gl.uniformMatrix3fv( uniform.location, false, value )\n            break\n            }\n            case 'mat4': {\n            gl.uniformMatrix4fv( uniform.location, false, value )\n            break\n            }\n        }\n\n        \/\/ ivec2       : uniform2i,\n        \/\/ ivec3       : uniform3i,\n        \/\/ ivec4       : uniform4i,\n        \/\/ sampler2D   : uniform1i,\n        \/\/ samplerCube : uniform1i,\n        \/\/ bool        : uniform1i,\n        \/\/ bvec2       : uniform2i,\n        \/\/ bvec3       : uniform3i,\n        \/\/ bvec4       : uniform4i,\n\n        }\n\n        updateUniforms() {\n\n        const gl = this.gl\n        const uniforms = this.data.uniforms\n\n        Object.keys( uniforms ).forEach( name => {\n\n            const uniform = uniforms[ name ]\n\n            this.uniforms[ name ] = uniform.value\n\n        } )\n\n        }\n\n        createBuffers( data ) {\n\n        const gl = this.gl\n        const buffers = this.data.buffers = data\n        const values = this.buffers = {}\n\n        Object.keys( buffers ).forEach( name => {\n\n            const buffer = buffers[ name ]\n\n            buffer.buffer = this.createBuffer( 'a_' + name, buffer.size )\n\n            Object.defineProperty( values, name, {\n            set: data => {\n\n                buffers[ name ].data = data\n                this.setBuffer( name, data )\n\n                if ( name == 'position' )\n                this.count = buffers.position.data.length \/ 3\n\n            },\n            get: () => buffers[ name ].data\n            } )\n\n        } )\n\n        }\n\n        createBuffer( name, size ) {\n\n        const gl = this.gl\n        const program = this.program\n\n        const index = gl.getAttribLocation( program, name )\n        const buffer = gl.createBuffer()\n\n        gl.bindBuffer( gl.ARRAY_BUFFER, buffer )\n        gl.enableVertexAttribArray( index )\n        gl.vertexAttribPointer( index, size, gl.FLOAT, false, 0, 0 )\n\n        return buffer\n\n        }\n\n        setBuffer( name, data ) {\n\n        const gl = this.gl\n        const buffers = this.data.buffers\n\n        if ( name == null && ! gl.bindBuffer( gl.ARRAY_BUFFER, null ) ) return\n\n        gl.bindBuffer( gl.ARRAY_BUFFER, buffers[ name ].buffer )\n        gl.bufferData( gl.ARRAY_BUFFER, new Float32Array( data ), gl.STATIC_DRAW )\n\n        }\n\n        updateBuffers() {\n\n        const gl = this.gl\n        const buffers = this.buffers\n\n        Object.keys( buffers ).forEach( name =>\n            buffers[ name ] = buffer.data\n        )\n\n        this.setBuffer( null )\n\n        }\n\n        createTexture( src ) {\n\n        const gl = this.gl\n        const texture = gl.createTexture()\n\n        gl.bindTexture( gl.TEXTURE_2D, texture )\n        gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array( [ 0, 0, 0, 0 ] ) )\n\n        this.texture = texture\n\n        if ( src ) {\n\n            this.uniforms.hasTexture = 1\n            this.loadTexture( src )\n\n        }\n\n        }\n\n        loadTexture( src ) {\n\n        const gl = this.gl\n        const texture = this.texture\n\n        const textureImage = new Image()\n\n        textureImage.onload = () => {\n\n            gl.bindTexture( gl.TEXTURE_2D, texture )\n\n            gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImage )\n\n            gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR )\n            gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR )\n\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n\n            \/\/ gl.generateMipmap( gl.TEXTURE_2D )\n\n        }\n\n        textureImage.src = src\n\n        }\n\n        update() {\n\n        const gl = this.gl\n\n        const now = performance.now()\n        const elapsed = ( now - this.time.start ) \/ 5000\n        const delta = now - this.time.old\n        this.time.old = now\n\n        this.uniforms.time = elapsed\n\n        if ( this.count > 0 ) {\n            gl.clear( gl.COLORBUFFERBIT )\n            gl.drawArrays( gl.POINTS, 0, this.count )\n        }\n\n        this.onUpdate( delta )\n\n        requestAnimationFrame( this.update )\n\n        }\n\n    }\n\n    const snowflake = 'data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGAGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTUtMDctMDNUMTg6NTk6MjIrMDI6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE5LTAxLTEyVDE1OjE0OjQwKzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE5LTAxLTEyVDE1OjE0OjQwKzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIzMzBlMWI0LTk5ZDctNGU2NS05MGQ2LTNmYjFiYmE2ZTE0MCIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjAyNThjNzMxLTQ4ZjQtYTA0MS1hNGFkLTQ4MTA2MTVjY2FlYSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjJjY2VkMTUyLTRjNzAtNDFlZC1hMzcyLWRlOWY4NjgyZTcwMSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MmNjZWQxNTItNGM3MC00MWVkLWEzNzItZGU5Zjg2ODJlNzAxIiBzdEV2dDp3aGVuPSIyMDE1LTA3LTAzVDE4OjU5OjIyKzAyOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YjMzMGUxYjQtOTlkNy00ZTY1LTkwZDYtM2ZiMWJiYTZlMTQwIiBzdEV2dDp3aGVuPSIyMDE5LTAxLTEyVDE1OjE0OjQwKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw\/eHBhY2tldCBlbmQ9InIiPz50mbqsAAAToElEQVR4nOVbW49dR5X+VlXtc2v3Ne52N6bTTnAc0u02GRJQwEhYQkJ5QhmhPPOUl0iBB\/4AP4JfMA95IEIaJEYiQhlesCZMEE1iGxJHIjK21XbSwX1xd5+zd9Va87BrVdfefWwI4xEaUVJpn7PPPnVqfbUu31pVh0QE\/8zN\/KMn8I9uTl+8+uqrAAARgYgghIBer4dnnnkGAPDFL34RANDr9eiJJ55AVVUgIhhjwMwYDAbY3Nyk8+fPP\/DHdnd3ZWtrS6y1ICICACLCtWvXxDmH2dlZXL9+HR988AF6vR5mZmawvb2Nw8NDeO+xt7eHpaUlDAYDTE5O4vvf\/z7OnTuH1157DR9++CGICNvb2zh58iTubG7iwrP\/gvmz61iZG2B5aQG\/+e93MDExgW9\/+9vHAcgbEWFvbw+Tk5O0uLiIEydOyPnz52lychL9fj89BgD7+\/s0MTGh4KT749rU1JRMTU3p22R7y8vL2N3dTWPs7e3JnTt3sLW1BWvtAwF9FK0BQFwUfPLJJ5ibm8Mrr7yiGqCmkgtHZVni4OCAJiYmCAAiEA0AmBlEpGPnDoez1wqMrK2tydraGr333nu4evUqfv\/730tZluh2u405PqqWABgOhwCAnZ0dLCws4Ec\/+hGdOnUqf5ZEhA4ODtDr9chaS51OB\/Pz84QjoRsA6bjOOel0OknY7HMBgL\/85S8yGo1kYWEB1loCIBcuXMCFCxdkfX2dNjY25J133sH9+\/chIo8UhATA5z\/\/eRweHmJxcRHf+973iIioqioURaGTNQBQlqWJq2GYGWVZUq\/XGwcCAVCTkUxg7UDUgtnZWd7e3hZmhrVWkGnH+vo61tfX8eUvfxlvvPGG3Lx5E8vLy8hM6dEA0Ov1MBwO8eKLL+Lpp5\/GRx99hLm5ORXGACAiotnZWROFIQDGGJNee+8hIlQURVqibLUku2pnAEJEZnZ2VoXmDKwExPnz57G8vIxf\/epXuHXrlnz88ccoyxLe+\/+VRiQA7t+\/j+npaaytrREAeuKJJ\/SjXGACQCEEIyLGOWc6nQ6h1gZTVZWJqv6g8MoAwMwiImyt5UxQ7TlIlIMwPT2Nl156SXZ3d+nKlSuoqkq2t7f\/buEbADjncOnSJXrssceAphorABARC8CIiBERKyI2hGCcc0REptPpGGttDhhCCClc5gKKSC50qKqKrbVsjMnvqzbw7u6uMDPNzMzw1NSUXLx4ET\/5yU\/o5s2b8t5772E0GmFycvIz+4gEwNmzZ\/H0008DqD33cDikfr9vNFwDMGVZWmutcc5ZAE5EbDQBS0QqvEF0mAAoCq5NALAxRlqCBmstExEDCLHrZwIgFEUhckRbBQBefvllAYC3334bV65ckY2NDezv738mEBIA3nuMRiOgVmfa39+nbrdL0SsbAKbT6Zi46tZaa4nIEpGN49j4nI2AkYiYLAQmAFQoACwiLCKBiAIRBQA+jqNgMADq9\/v63mZjAABeeOEFvPDCC3Tt2jV5\/fXX5U9\/+hMI+Js4RFoe51yK1c45zM\/P58ITAENExtRL6mIvAHS0i0iXmbsAekTUN8b0AfRFpA+gD2AQez+79gD0RETH6cZrkf1GfjUP6FhbW6Mf\/OAHeOmll6jb7WBrawvAw7lD0oAzZ86gFfeBzNtrZ2Zna2gLEXFRAwpmLuJnyT+ISMQr+ZTc+wcAuvIetUlV8bVFUxNyZxiy9\/l4BAALCwvmu9\/9rpxZWaH\/evs3Mqw8HpbvJQDW19d1xfPeBsEyswVQeO+dtdZZa9NqWWsLAI6IHOoQaVpjHQMgdi8iPgJQReHzbgFU2ULo9\/JQmfMLPPf881j\/0pfk3376H9gyI6ycXnw4ALOzs+lmCIEODg7oxIkThohoOBxSp9MxRGSdczZGA0tEBWpNKIwxHX0dx3XRB+QAAE0foDbviaiKwBVRWO3Wex9ql0MBzbAcsnFzcAFAOkVBFy88hW63J1UIGJf6JwCuXLmC9fV1AIAxBv1+H0QEESEiMsxs1NMTke10OiqkE5GO2rAxJtksERkRMaj9R1sLfJysB1CFEEpjjGqA+hiDWrPK+H3ViFxLc2eZTEHbM6trAIB3331XNOEaC8DCwoK+JCKCc47ia1Lq2+oWtboXRFREALpxzA4Ruegj9FnDzDDGCABmZjbGqPqXOFr5Ml5HqE2uin6mxFGk0V4B4LIsiYh8pO05yBxCECLC4uIiXbp0SbJstgnA3t5e7gTbbrNBf9sgKBCoTSBFBUSugMgTAGiMlizmewClMcYDGMXvlxHUMgpeZgInrhEB9Vm48\/GawuSNGzdodnYWp06dEu89QsitJgMgQ08R1FhOIQTKihgkIoaZrTEm8QARSUCISBf1ihbRri1iGG0BwKjtvxOFdHoVERdC0N8wkVjlpqTFG2nFe5\/P\/\/Tp0+JcLeb169dxeHiI55577jgAjz\/+OFqt7TFyDSBmJiIyquIRgEJVH7UZFDiK3xoZdPICgDOvn6\/2iIg03ObEikSEtAoVgcznKXF+6V6321VtoNXVVezs7DTkSkRoc3OzDUAtde0PGmSCiKgoCiIiik6uZkiRJEWG6IhInWNXRHpE1ENNfnJSNJFdJwBMiMgEgAkiGhCRPt8D0DPGdBVcZi7UxHDcR7XDOLz3+POf\/9yQb5wT1C8pomNbCAHMTDE85TTYoqUJiOaAOpHK9VWjQRE5gM3GyHMKAIAxRqQOS0xE4pxrpMwA2HtvALA68Vwea60sLy+PB+Djjz\/G5z73OZ1UTiqkqiohImFmFEUhRCTGmLzUlTcTBVWTKBBXTBki1U1\/i1E7N\/UVyi5T0RS1xQgza\/1gXBrNcXyOmsg4YpLQsbz3qRLVAGB+fr4tCLz3IiKKtMQQJnEwtb8crBQ6lT\/ESSQHSURKpAT1CodoLho2rSZRugAikjLFzHmGOG6izhlXaZOvJPTJkyePrRYAIBYWGiqvzEmFNcao0ByLGg1NyX8w8w+5eeRa0RWRDhF1Ee0bNY9QX6G9LyI9EenGZ\/NESbsFoKm6EREzGo00cjR8wc7OTgOApAFxdRt1u6IokpqJCHvvWfN2XRGuwwFnK5OnqkkTMmflEHlBZgYBRyGONFTGz5jqBCnPFRwAx8zqcBt+AwBFx50zRgFAw+FQpqenjwNw9+5ddLtdnDhxQifV6MwsRMTGGGHmRkEjqjFHVU3fia9T+IwTUpMw2cRyz60rlhMl1ZqCmQuKeUO09UTTs\/HbJqBNBoNB40YygY2NDezt7Y35Tj0Zay0751hEQqSwqefvY4Ejd1LqM6B5QeyaMjsR0SQq74lRRqKkxKqgZhGmHQa1RjkWhHY+kDTga1\/7mjrCdtUWcSD23jMRBWttyuSIqBIRVVEPwBtjqgyMoGGrsRS1o1M75YzhtWlyyjjj1ajKM7OlukjTSOOJKGe2DSBipEstacCPf\/xjvPnmm405olV0cM6FWMkNAEIIIYhIEJHAzIGIfLRXBScvdXE0k6QRes1UN88xbKYx6jPymoQxxhiKmWrm8Nr1jEbb399vvE8a8Morr2Bubi53hNpUCwxqLQjW2hALGAFHK14BqJi5QqYZCkh8VkFgHK16Hu\/y0Jm\/TnZtjEkFV2amGgP6mwuhmhdoSxrQ6XRw69YtfPjhh+3vNKo41tpUxnLOqVfOe+L0+WfRcWnxI2lF5i8Sr49JzrjKlIKUkyS9Nljj39oSHLdu3UJZlpiammonFzqohiolJKmaE4X0AKpcG3CU4alj03Q2D1mIgqUQqpEk4yH6TEPAfMVzkhaf1Wca9733yFsC4Jvf\/Ga6eePGDSwuLkq3202\/EEKQw8ND7vV6wTmXfIBGgBBCZa11RKQakKe4eVZIOMrwEAE1aDo\/NRENs6nFvcNxPckOQEII4r3XLfvU2u+PbWHdvXsXP\/vZz2R3d7fxAzEfYOeclrG8McZHx1dZa0sAlYhUrUKG9rFmgjHmgiONUocaiEjB5pgWJFDGACHOOXQ6nXYyJwcHB40bSQM0PpZlia9\/\/esgInz66acYDAbS7\/el1+vl5WldIR9XXusBlYJgrS2ZeRR5foFY4oo\/Rzji+GoOwBG3aFSGc0eqYTUDpr2VxiIiVVVJBKABTntXOQGwsbEBoK4MTUxM4Nq1a7DWyurqKvr9fu4LGltaWtcjokRViaiUowqRFk+1LKarwkQUYgKUp98hRo9cEyoc+Z1kJpnwDUGJSLfZj7XLv\/41Ln7jG8cBmJycTDe99xgMBlhZWUG\/34fm4DiqtugkTFTHYK2toqClMSavE+bbZg0AolAujoM6fxI1sWQ6GSBKuJR7sDGGiYhDCJwla+N8BUQERcssEgBxXzA1IsL169fhvcezzz6LmZkZnTRQU01NjnRlQlx93cRQB5gXRY8BEEHLa4XJDESkAlBGv6J8Q\/1OCHWFs60NHBM0oeaxHGEAZ7\/61YacCYCvfOUrjQ9iLAZQcwS9rVctkuS0GEf5uZawx5WqdEWUHCnLUwKWA1ACGBljSmYu0XSMPv42I+4469hVVYlzTjIzEABg7\/Hrt97Cd1588TgA4zYNFIiDgwM5efJkftyFu92u7tLoVpWPk05cHc0ymTo6TaN1T1ALIMeywBhSRwoCjkeJPClLGhALoTrXpPLGGLlw7lxDvgRAe8Mgb4PBIP88IT0cDrkoimCt1ZS0kqPydc7rc9Kjds5RrS0zK\/UFjtih0ulSREaoQ+UIx0NqDkR7w7ThBzY2NrC7u4szTz752QBotYRop9PRukBgZmOtJWOMCSFUmqigWZBIDjSuvgPgjDGavipzy80qlcrRigo4rgFt4dN8RQR5IeQYABcvXnygxLdv38Zrr72GH\/7wh3myxNnWNzvngvfeOOd8FttV7TXuCx1thzf2CzIfoOww3x3OQVBfkK9+mws0vP\/W1pZcv35dTp48ibm5ufEA6GnPdhMRTExMYHJyMs4\/edbGigKgeERGdz8aiUx0qoIsj4j5fHKCUu9Cae0x8QvUkaCt+rkW5IXSvEwuADA3N4fnn38eRVEc2yEmvfHHP\/5xLAAKAhHh3LlzjTMEIQQ3Go3MYDAwAFw8M2BjbE9VHIm7x3HnuMg+y2uFjb2ILBwGHGmAR51yj1DvJ+q9HBzVCjUlvnfvnty4cUO0SLK2tpZkSxqwsrIyVngiSsddx5y5YWOMbjhyzA2AOlevgNrzxqKHZAXUEFmj8oMcAAUhX1HPzJUxplK2GULwqJmor6qKY54iQE3kdnd3OdY35He\/+51cvnwZExMTMMY0AEga0CZCbRC89\/DeY2pqKs\/TDQA6PDw0uolpjLHOOcfMzntvnXPOGFOISBFCKGLG6Jg5rw6bPM9HdogiRgT1GxUze135yBBLLcyo1ohIqKqKO51OKMtS3n\/\/fckLJhcuXDiuAXfu3HkgAABweHiYb5\/lbI76\/T6JCO\/s7ICIMD09jbhzlJe2OdJXZ611xpik+sxsRUTNqyYtzcqzRoQQt9FTPTKEkMryMV1nItJECKPRCH\/4wx\/SHmcbgKQB77777kMBUAR7vR594QtfQLb3ljRBRCiGQ43tNhNU9wotxd0hZrbWWqrLCibXAM0\/NGNMSVCoz+h5730wxngR8cwcnHNp1XHkA0RE+ODgoOH5coefNODnP\/\/5QwGg+GeElZUVefLJJ8fVDYmISP0EM0sIAd1ut6EFEQwTQtBTZCYSKZWfdOs7jpMSHsSSnF5jPpCKJ51Oh9vz8t5ja2urUTMcC4Cex39Y63Q6WFlZQVEUcu\/ePep2uxgMBnmWqBrBzjndUzQAJO7aSqwm6Va60mATQtATH3k0yLM6RvQJ6khRO0dmZv2cEfnGaDSSbreLoihQVRVCCGMPTuZbY38VAGstiqLAaDTC66+\/Lt\/61rf0rzQPqiKnvQU9GxTvKwB65s9E+0x1\/QwEHVMTHXbOcfQFbK1VX5GYX1mWuH37NpaXl2l3d5eXl5cfeGp07F9mHtaICGVZYjAYYGZmRgDQaDSSoijywmQuHEUA8tp\/ewsrnUkOIehefg5AIl5RzVPPs8DsGTlz5oxYa+XevXu4c+dOntHiXJYQfWYA1Jacc7r7Im+++SZWV1fp7NmzOlktn7XBUHJCIQRDddxUUqUHq5MGVFUFAIibtOrUhJnVNDi7z3fv3hURkaWlpWQ6Tz311EPl+cwAjGvRxnS1xjrI1n0ajUbinCNdGf2vQQyFABqHnZMmhBAkaiADkMPDQ4n\/cJPhcIj5+Xl1nvj3n\/4UB\/v7ODEx0ZjQv7788qMFoNPppBj76aefyi9+8QssLS3JpUuXKNt2b+QGg8EgrzNSr9djzQi1jTlqj+hcARz9+cJ7D+ecnDlzJiVABwcH0GNxh\/H\/UOPaIwEgb\/fv38fVq1fbyVVuy5RdtVGkrzQzM\/Mwhyzta\/Y7aZE\/+ugj\/Odbb8n0zAzmTp1CfbJmfHvkADjnMDMzg8ceewzGGNnf38fly5fp9OnTknNwNEEQay2mpqbaf7Bot3alV8a9\/u1vfytXr13D6uoqyrJ86Hz\/euz7O5uivr29jV\/+8peyubmZx\/Njh5xiMjMutz\/WfVXxzs4O7+zsyL1792R\/f78RBRYWFjA5OYm4OXKs5+2Ra0C7OeewsLCA+F+kvKUVGw6H2Nzc1Pxh7DiBGT0iWXr8cbp5+zY+eP99mZ6exsHBAZaWlrC6upqefZjKt1vKBf5Z2\/+ZCfx\/af8DTo8DJZHbJ6cAAAAASUVORK5CYII='\n\n    const holder = document.querySelector( '#snow' )\n    const count = 2000\n\n    let wind = {\n    current: 0,\n    force: 0.1,\n    target: 0.1,\n    min: 0.1,\n    max: 0.20,\n    easing: 0.005\n    }\n\n    const snow = new ShaderProgram( holder, {\n    depthTest: false,\n    texture: snowflake,\n    uniforms: {\n        worldSize: { type: 'vec3', value: [ 0, 0, 0 ] },\n        gravity: { type: 'float', value: 100 },\n        wind:{ type: 'float', value: 0 },\n    },\n    buffers: {\n        size: { size: 1, data: [] },\n        rotation: { size: 3, data: [] },\n        speed: { size: 3, data: [] },\n    },\n    vertex: `\n        precision highp float;\n\n        attribute vec4 a_position;\n        attribute vec4 a_color;\n        attribute vec3 a_rotation;\n        attribute vec3 a_speed;\n        attribute float a_size;\n\n        uniform float u_time;\n        uniform vec2 u_mousemove;\n        uniform vec2 u_resolution;\n        uniform mat4 u_projection;\n        uniform vec3 u_worldSize;\n        uniform float u_gravity;\n        uniform float u_wind;\n\n        varying vec4 v_color;\n        varying float v_rotation;\n\n        void main() {\n\n        v_color = a_color;\n        v_rotation = a_rotation.x + u_time * a_rotation.y;\n\n        vec3 pos = a_position.xyz;\n\n        pos.x = mod(pos.x + u_time + u_wind * a_speed.x, u_worldSize.x * 2.0) - u_worldSize.x;\n        pos.y = mod(pos.y - u_time * a_speed.y * u_gravity, u_worldSize.y * 2.0) - u_worldSize.y;\n\n        pos.x += sin(u_time * a_speed.z) * a_rotation.z;\n        pos.z += cos(u_time * a_speed.z) * a_rotation.z;\n\n        gl_Position = u_projection * vec4( pos.xyz, a_position.w );\n        gl_PointSize = ( a_size \/ gl_Position.w ) * 100.0;\n\n        }`,\n    fragment: `\n        precision highp float;\n\n        uniform sampler2D u_texture;\n\n        varying vec4 v_color;\n        varying float v_rotation;\n\n        void main() {\n\n        vec2 rotated = vec2(\n            cos(v_rotation) * (gl_PointCoord.x - 0.5) + sin(v_rotation) * (gl_PointCoord.y - 0.5) + 0.5,\n            cos(v_rotation) * (gl_PointCoord.y - 0.5) - sin(v_rotation) * (gl_PointCoord.x - 0.5) + 0.5\n        );\n\n        vec4 snowflake = texture2D(u_texture, rotated);\n\n        gl_FragColor = vec4(snowflake.rgb, snowflake.a * v_color.a);\n\n        }`,\n    onResize( w, h, dpi ) {\n        const position = [], color = [], size = [], rotation = [], speed = []\n\n        \/\/ z in range from -80 to 80, camera distance is 100\n        \/\/ max height at z of -80 is 110\n        const height = 110\n        const width = w \/ h * height\n        const depth = 80\n\n        Array.from( { length: w \/ h * count }, snowflake =>  {\n\n        position.push(\n            -width + Math.random() * width * 2,\n            -height + Math.random() * height * 2,\n            Math.random() * depth * 2\n        )\n\n        speed.push(\/\/ 0, 0, 0 )\n            1 + Math.random(),\n            1 + Math.random(),\n            Math.random() * 10\n        ) \/\/ x, y, sinusoid\n\n        rotation.push(\n            Math.random() * 2 * Math.PI,\n            Math.random() * 20,\n            Math.random() * 10\n        ) \/\/ angle, speed, sinusoid\n\n        color.push(\n            1,\n            1,\n            1,\n            0.1 + Math.random() * 0.2\n        )\n\n        size.push(\n            5 * Math.random() * 5 * ( h * dpi \/ 1000 )\n        )\n\n        } )\n\n        this.uniforms.worldSize = [ width, height, depth ]\n\n        this.buffers.position = position\n        this.buffers.color = color\n        this.buffers.rotation = rotation\n        this.buffers.size = size\n        this.buffers.speed = speed\n    },\n    onUpdate( delta ) {\n        wind.force += ( wind.target - wind.force ) * wind.easing\n        wind.current += wind.force * ( delta * 0.2 )\n        this.uniforms.wind = wind.current\n\n        if ( Math.random() > 0.995 ) {\n        wind.target = ( wind.min + Math.random() * ( wind.max - wind.min ) ) * ( Math.random() > 0.5 ? -1 : 1 )\n        }\n\n        \/\/ stats.update()\n    },\n    } )\n    <\/script>\n \n\n\n<h2 class=\"wp-block-heading\"><strong>Wishing You a Wonderful Holiday Season!<\/strong><\/h2>\n\n\n\n<p>As we approach the holiday season, we want to take a moment to send our warmest wishes to all of our valued customers and distributors. This time of year is a perfect opportunity to connect and celebrate the special moments that bring us together.<\/p>\n\n\n\n<p><strong>Share the Joy!<\/strong><\/p>\n\n\n\n<p>We\u2019re proud to embrace the cultural traditions that make this season unique around the world, highlighting Tadano\u2019s diverse global presence. We\u2019ve prepared five special videos to help bring the spirit of the season to life. We can\u2019t wait to share them with you and bring a little extra joy to your holidays! And we\u2019d love to see how you\u2019re celebrating! Join the conversation on social media and share your holiday moments with us.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#holidaysaroundtheglobe\" target=\"_blank\" rel=\"noreferrer noopener\">Celebrations Around The Globe<\/a><\/div>\n<\/div>\n\n\n\n<div class=\"overlay\" id=\"holidaysaroundtheglobe\">\n    <div class=\"overlay-wrapper\">\n        <div class=\"close-overlay\">\n            <div class=\"close-btn\"><\/div>\n        <\/div>\n        <div class=\"container\">\n            \n\n<h1 class=\"wp-block-heading\">Celebrations Around The Globe<\/h1>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p>As <strong>the United States comes alive with the festive spirit<\/strong>, we\u2019re reminded of the cherished moments that define this season\u2014from building gingerbread houses with loved ones to hanging stockings by a crackling fireplace. At Tadano, we\u2019re grateful for every connection and collaboration that has made this year special. Much like the twinkling lights adorning homes and the timeless traditions of popcorn garlands and turkey feasts, your partnership brings warmth and magic to all we do. Thank you for being part of our story, and may your holidays be filled with joy and togetherness.<br><br>\ud83c\udf84 <strong>Watch the video here and join us in celebrating the season with Tadano America!<\/strong> \ud83c\udf84<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><section class=\"video-block\">\n  <div class=\"video-box\">\n        <a aria-labelledby=\"video-txt\" data-fancybox href=\"https:\/\/youtu.be\/UcoH0KUzw0U\" class=\"video\">\n      <span class=\"play-btn\"><\/span>\n              <div class=\"bg-stretch\" >\n          <span data-srcset=\"https:\/\/img.youtube.com\/vi\/UcoH0KUzw0U\/hqdefault.jpg, https:\/\/img.youtube.com\/vi\/UcoH0KUzw0U\/hqdefault.jpg 2x\"><\/span>\n        <\/div>\n          <\/a>\n    <div class=\"video-txt\">\n          <\/div>\n  <\/div>\n<\/section><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><section class=\"video-block\">\n  <div class=\"video-box\">\n        <a aria-labelledby=\"video-txt\" data-fancybox href=\"https:\/\/youtu.be\/z0zn0UVEw-g\" class=\"video\">\n      <span class=\"play-btn\"><\/span>\n              <div class=\"bg-stretch\" >\n          <span data-srcset=\"https:\/\/img.youtube.com\/vi\/z0zn0UVEw-g\/hqdefault.jpg, https:\/\/img.youtube.com\/vi\/z0zn0UVEw-g\/hqdefault.jpg 2x\"><\/span>\n        <\/div>\n          <\/a>\n    <div class=\"video-txt\">\n          <\/div>\n  <\/div>\n<\/section><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p>As the world gathers in warmth and light while we\u2019re <strong>celebrating the heart of the season in Europe<\/strong>\u2014from glowing candles and bustling holiday markets of Germany to the joy of daily traditions like opening an Advent calendar. Tadano sends a heartfelt thank you to everyone who has been part of our journey this year. Like the Stollen bread we enjoy during the holidays, our success is made sweeter by the ingredients you all bring\u2014collaboration, innovation, and trust.<\/p>\n\n\n\n<p>\ud83c\udf84 <strong>Watch the video here to experience the holiday magic with Tadano Europe!<\/strong> \ud83c\udf84<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p><strong>A True-Blue Aussie Christmas \ud83c\udf85\u2600\ufe0f<\/strong><\/p>\n\n\n\n<p>At Tadano, we\u2019re celebrating the festive season across the globe, and <strong>in Australia, Christmas takes on its own sunny twist!<\/strong><\/p>\n\n\n\n<p>It\u2019s all about backyard BBQs, beach cricket, and cooling off with a swim after opening presents. Families gather for seafood feasts, pavlova takes pride of place on dessert tables, and carols under the stars bring communities together in true Aussie style. Whether it\u2019s a day at the beach or a game of backyard cricket, Christmas Down Under is all about good food, great company, and making the most of the summer vibes.<\/p>\n\n\n\n<p>Stay tuned as we continue sharing how the Tadano family celebrates around the world. Wishing you a joyful season filled with celebration, togetherness, and new beginnings! \ud83c\udf0a\ud83c\udf64\ud83c\udf84<\/p>\n\n\n\n<p>\ud83c\udf84 <strong>Watch the video here to experience the holiday magic with Tadano Oceania!<\/strong> \ud83c\udf84<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><section class=\"video-block\">\n  <div class=\"video-box\">\n        <a aria-labelledby=\"video-txt\" data-fancybox href=\"https:\/\/youtu.be\/zeuf45-gleY\" class=\"video\">\n      <span class=\"play-btn\"><\/span>\n              <div class=\"bg-stretch\" >\n          <span data-srcset=\"https:\/\/img.youtube.com\/vi\/zeuf45-gleY\/hqdefault.jpg, https:\/\/img.youtube.com\/vi\/zeuf45-gleY\/hqdefault.jpg 2x\"><\/span>\n        <\/div>\n          <\/a>\n    <div class=\"video-txt\">\n          <\/div>\n  <\/div>\n<\/section><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><section class=\"video-block\">\n  <div class=\"video-box\">\n        <a aria-labelledby=\"video-txt\" data-fancybox href=\"https:\/\/youtu.be\/Zdgrw3BbkDk\" class=\"video\">\n      <span class=\"play-btn\"><\/span>\n              <div class=\"bg-stretch\" >\n          <span data-srcset=\"https:\/\/img.youtube.com\/vi\/Zdgrw3BbkDk\/hqdefault.jpg, https:\/\/img.youtube.com\/vi\/Zdgrw3BbkDk\/hqdefault.jpg 2x\"><\/span>\n        <\/div>\n          <\/a>\n    <div class=\"video-txt\">\n          <\/div>\n  <\/div>\n<\/section><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p><strong>As the New Year approaches in Japan<\/strong>, we are reminded of the beauty and tradition that make this season so special\u2014from the symbolic act of house cleaning to welcome fresh beginnings, to the warmth of family gatherings and the first shrine visits of the year. At Tadano, we deeply value the partnerships and collaboration that have shaped our journey. Much like the hope and renewal that accompany the ringing of temple bells at midnight, your support continues to inspire our growth. Thank you for being a part of our story, and may the New Year bring you peace, prosperity, and joy.<\/p>\n\n\n\n<p>\ud83c\udf84 <strong>Watch the video here to experience the holiday magic with Tadano Japan!<\/strong> \ud83c\udf84<\/p>\n<\/div>\n<\/div>\n\n\n        <\/div>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading has-text-align-left\"><strong>Activities to Share<\/strong><\/h2>\n\n\n\n<p>This holiday season, share the joy with our beautifully designed digital cards, perfect for spreading cheer to your coworkers, customers and friends, near and far. Brighten someone\u2019s day with a personalized touch!<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#ecard\">Send a Tadano e-holiday greeting<\/a><\/div>\n<\/div>\n\n\n\n<div class=\"overlay\" id=\"ecard\">\n    <div class=\"overlay-wrapper\">\n        <div class=\"close-overlay\">\n            <div class=\"close-btn\"><\/div>\n        <\/div>\n        <div class=\"container\">\n            \n\n<h1 class=\"wp-block-heading\">Send A Tadano E-Holiday Greeting<\/h1>\n\n\n\n<section class=\"holiday-greeting-block contact-form-block \">\n    <div class=\"container\">\n        <form class=\"contact-form\" id=\"form_xmax_card\" action=\"\" method=\"post\">\n            <div class=\"row\">\n                <div class=\"card-design\">\n                    <div class=\"card active\" id=\"AC_XMAS_CARD\">\n                        <img decoding=\"async\" src=\"https:\/\/tadanoworld.com\/asia\/wp-content\/themes\/tadano\/assets\/dist\/images\/AC_XMAS_CARD_thumb.jpg\">\n                    <\/div>\n                    <div class=\"card\" id=\"CC_XMAS_CARD\">\n                        <img decoding=\"async\" src=\"https:\/\/tadanoworld.com\/asia\/wp-content\/themes\/tadano\/assets\/dist\/images\/CC_XMAS_CARD_thumb.jpg\">\n                    <\/div>\n                    <div class=\"card\" id=\"GR_XMAS_CARD\">\n                        <img decoding=\"async\" src=\"https:\/\/tadanoworld.com\/asia\/wp-content\/themes\/tadano\/assets\/dist\/images\/GR_XMAS_CARD_thumb.jpg\">\n                    <\/div>\n                <\/div>\n            <\/div>\n            <div class=\"row\">\n                                <div class=\"col full-width\">\n                    <label for=\"recipient-name\" class=\"hidden\">Name of the recipient<\/label>\n                    <input type=\"text\" placeholder=\"Name of the recipient *\" name=\"recipient-name\" required \/>\n                <\/div>\n                <div class=\"col full-width\">\n                    <label for=\"recipient-mail\" class=\"hidden\">Send to Email Address<\/label>\n                    <input type=\"text\" placeholder=\"Send to Email Address *\" name=\"recipient-mail\" required \/>\n                <\/div>\n                <div class=\"col full-width btn-holder\" id=\"greeting-btn-holder\" style=\"display: none;\">\n                    <a href=\"mailto:\" id=\"greeting-btn\" class=\"btn btn-light\">Send greeting via email<\/a>\n\n                    <div class=\"fallback\" id=\"greeting-fallback\"  style=\"display: none;\">\n                        <p style=\"font-weight: 300; font-size: 80%\">If your email program is not opening, copy and paste your text into an email and send to your friend.<\/p>\n                        <a href=\"javascript:void(0);\" id=\"copy-mail-text\" class=\"btn btn-small\">\n                            <img decoding=\"async\" width=\"17px\" src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTIiIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSIiPjxnPjxwYXRoIGQ9Ik0yMi4yNSAxMGgtOC41QTEuNzUgMS43NSAwIDAgMCAxMiAxMS43NXYxMC41YzAgLjk2Ni43ODQgMS43NSAxLjc1IDEuNzVoOC41QTEuNzUgMS43NSAwIDAgMCAyNCAyMi4yNXYtMTAuNUExLjc1IDEuNzUgMCAwIDAgMjIuMjUgMTB6bS0yLjEyNSAxMGgtNC41YS43NS43NSAwIDAgMSAwLTEuNWg0LjVhLjc1Ljc1IDAgMCAxIDAgMS41em0wLTNoLTQuNWEuNzUuNzUgMCAwIDEgMC0xLjVoNC41YS43NS43NSAwIDAgMSAwIDEuNXoiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjEiIGRhdGEtb3JpZ2luYWw9IiMwMDAwMDAiIGNsYXNzPSIiPjwvcGF0aD48cGF0aCBkPSJNMTQuMjUgM0gxM3YtLjI1YS43NS43NSAwIDAgMC0uNzUtLjc1aC0xLjEwNEMxMC44MTguODQ3IDkuNzU3IDAgOC41IDBTNi4xODIuODQ3IDUuODU0IDJINC43NWEuNzUuNzUgMCAwIDAtLjc1Ljc1VjNIMi43NUEyLjc1MiAyLjc1MiAwIDAgMCAwIDUuNzV2MTIuNUEyLjc1MiAyLjc1MiAwIDAgMCAyLjc1IDIxaDcuNzV2LTkuMjVhMy4yNTQgMy4yNTQgMCAwIDEgMy4yNS0zLjI1SDE3VjUuNzVBMi43NTIgMi43NTIgMCAwIDAgMTQuMjUgM3ptLTguNzUuNWgxYS43NS43NSAwIDAgMCAuNzUtLjc1YzAtLjY4OS41NjEtMS4yNSAxLjI1LTEuMjVzMS4yNS41NjEgMS4yNSAxLjI1YzAgLjQxNC4zMzYuNzUuNzUuNzVoMXYxLjI1YS4yNS4yNSAwIDAgMS0uMjUuMjVoLTUuNWEuMjUuMjUgMCAwIDEtLjI1LS4yNXoiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjEiIGRhdGEtb3JpZ2luYWw9IiMwMDAwMDAiIGNsYXNzPSIiPjwvcGF0aD48L2c+PC9zdmc+\" \/>\n                            Copy text                        <\/a>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/form>\n    <\/div>\n\n\n    <style type=\"text\/css\">\n        .card-design {\n            display: flex;\n            justify-content: space-between;\n            gap: 20px;\n            margin-bottom: 20px;\n        }\n        @media screen and (max-width: 768px) {\n            .card-design {\n                width: 93%;\n                margin: 0 auto;\n                gap: 10px;\n            }\n        }\n        .card-design .card {\n            position: relative;\n            cursor: pointer;\n            transition: transform 0.3s ease-in-out;\n        }\n        .card-design .card:hover {\n            transform: scale(1.05) rotate(0.5deg);\n        }\n        .card-design .card.active::after {\n            content: '';\n            position: absolute;\n            display: block;\n            bottom: 0;\n            right: 0;\n            width: 55px;\n            border-radius: 10px 0 0 0;\n            background-color: #004295;\n            \/* padding: 22px; *\/\n            height: 55px;\n            background-size: 61%;\n            background-position: center;\n            background-repeat: no-repeat;\n            background-image: url(data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDQwLjAyIDQ0MC4wMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9IiI+PGc+PHBhdGggZD0iTTMyNy4zMjcgMzU5Ljg2MUg2MFY5Mi41MzJoMjA4LjY1bDYwLjAwMS02MEgwVjQxOS44NmgzODcuMzI3VjE3MS44NDZsLTYwIDYwLjAwMXoiIGZpbGw9IiMwMGE0Y2YiIG9wYWNpdHk9IjEiIGRhdGEtb3JpZ2luYWw9IiMwMDAwMDAiIGNsYXNzPSIiPjwvcGF0aD48cGF0aCBkPSJtMTI1LjczNSAxNzMuMTcxLTQyLjQyNyA0Mi40MjYgMTAxLjg1IDEwMS44NTFMNDQwLjAyIDYyLjU4NWwtNDIuNDI3LTQyLjQyNi0yMTIuNDM1IDIxMi40MzZ6IiBmaWxsPSIjMDBhNGNmIiBvcGFjaXR5PSIxIiBkYXRhLW9yaWdpbmFsPSIjMDAwMDAwIiBjbGFzcz0iIj48L3BhdGg+PC9nPjwvc3ZnPg==);\n        }\n        .card-design img {\n            width: 100%;\n            border-radius: 10px;\n        }\n    <\/style>\n\n\n    <script type=\"text\/javascript\">\n\n        var mailBody = '';\n        var selectedImage = '';\n        var recipientName = '';\n        var mailSubject = \"HAPPY HOLIDAYS\";\n        var mailBodyPart0 = \"Wishing you, your family, and friends a wonderful holiday season!\";\n        var mailBodyPart1 = \"I selected my favorite Tadano crane for you. Click the link to see which one!\";\n        var mailBodyPart2 = \"If you would like to send a Holiday Greeting along with your favorite Tadano crane to someone else, explore the Tadano Holiday page here:\";\n        var mailBodyFrewell = \"Best wishes,\";\n\n\n        \/\/ Function to check all input fields\n        function checkInputs() {\n            const inputs = document.querySelectorAll('.holiday-greeting-block .col.full-width input');\n            const buttonHolder = document.getElementById('greeting-btn-holder');\n            let allFilled = true;\n\n            inputs.forEach(input => {\n                if (input.value === '') {\n                    allFilled = false;\n                }\n            });\n\n            buttonHolder.style.display = allFilled ? 'block' : 'none';\n        }\n\n        \/\/ Add event listener to each input field\n        document.querySelectorAll('.holiday-greeting-block .col.full-width input').forEach(input => {\n            input.addEventListener('input', checkInputs);\n        });\n\n        \/\/ Function to show the div when the button is clicked\n        function showGreetingFallback() {\n            const greetingFallbackDiv = document.getElementById('greeting-fallback');\n            greetingFallbackDiv.style.display = 'block';\n        }\n\n        \/\/ Add event listener to the button\n        const greetingBtn = document.getElementById('greeting-btn');\n        greetingBtn.addEventListener('click', function(e) {\n            e.preventDefault();\n            showGreetingFallback();\n            recipientName = document.querySelector('.holiday-greeting-block input[name=\"recipient-name\"]').value;\n            var recipient = document.querySelector('.holiday-greeting-block input[name=\"recipient-mail\"]').value;\n            selectedImage = document.querySelector('.holiday-greeting-block .card.active').id;\n            selectedImage = 'https:\/\/' + window.location.hostname + '\/' + selectedImage;\n            mailBody = recipientName + ',%0D%0A%0D' + mailBodyPart0 + '%0D%0A%0D' + mailBodyPart1 + ' ' + selectedImage + '%0D%0A%0D%0A' + mailBodyPart2 + ' ' + 'https:\/\/tadanoworld.com\/holidays-2024' + '%0D%0A%0D%0A' + mailBodyFrewell;\n            window.location.href = 'mailto:' + recipient + '?subject=' + mailSubject + '&body=' + mailBody;\n            \n        });\n\n        \/\/ Function to copy text to clipboard\n        function copyToClipboard(text) {\n            navigator.clipboard.writeText(text).then(() => {\n                console.log(\"Text copied to clipboard\");\n            }).catch(err => {\n                console.error('Error in copying text: ', err);\n            });\n        }\n\n        \/\/ Select all card elements\n        const cards = document.querySelectorAll('.holiday-greeting-block .card');\n\n        \/\/ Function to remove 'active' class from all cards\n        function removeActiveClasses() {\n            cards.forEach(card => {\n                card.classList.remove('active');\n            });\n        }\n\n        \/\/ Add click event listener to each card\n        cards.forEach(card => {\n            card.addEventListener('click', function() {\n                \/\/ Remove 'active' class from all cards\n                removeActiveClasses();\n\n                \/\/ Add 'active' class to the clicked card\n                this.classList.add('active');\n            });\n        });\n\n\n        \/\/ Add click event listener to the link\n        document.getElementById('copy-mail-text').addEventListener('click', function(event) {\n            event.preventDefault(); \/\/ Prevent the default link behavior\n            copyToClipboard(recipientName + ',\\r\\n\\r\\n' + mailBodyPart0 + '\\r\\n\\r\\n' + mailBodyPart1 + ' ' + selectedImage + '\\r\\n\\r\\n' + mailBodyPart2 + ' ' + 'https:\/\/tadanoworld.com\/holidays-2024' + '\\r\\n\\r\\n' + mailBodyFrewell);\n        });\n\n    <\/script>\n\n<\/section>\n\n\n\n\n\n        <\/div>\n    <\/div>\n<\/div>\n\n\n<p><strong>HOLIDAY GAMES<\/strong><\/p>\n\n\n\n<p>While the Holiday season can be an extremely busy time of the year, we want to add a little bit of fun to your day. Take some time to relax with these games! We hope that they brighten your day, much like the season!<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.spatial.io\/embed\/Tadano-Green-Solutions-Winter-Wonderland-6748fd917098e92c4f8e3012?share=8365362142372918489\" target=\"_blank\" rel=\"noreferrer noopener\">Tadano Green Solutions &#8211; winter wonderland<\/a><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/tadanoworld.com\/europe\/en\/highscore-game\/\" target=\"_blank\" rel=\"noreferrer noopener\">TADANO Holiday Stacking Game<\/a><\/div>\n<\/div>\n<script type=\"text\/javascript\">const useMetricTxt =\"Use metric\"; const useImperialTxt =\"Use imperial\";<\/script>","protected":false},"excerpt":{"rendered":"<p>Wishing You a Wonderful Holiday Season! As we approach the holiday season, we want to take a moment to send our warmest wishes to all of our valued customers and distributors. This time of year is a perfect opportunity to connect and celebrate the special moments that bring us together. Share the Joy! We\u2019re proud [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-232","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/pages\/232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/comments?post=232"}],"version-history":[{"count":5,"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/pages\/232\/revisions"}],"predecessor-version":[{"id":249,"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/pages\/232\/revisions\/249"}],"wp:attachment":[{"href":"https:\/\/tadanoworld.com\/asia\/en\/wp-json\/wp\/v2\/media?parent=232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}