| 0 | 1 <!doctype html> | 
|  | 2 <head> | 
|  | 3   <title>Kalkulator</title> | 
|  | 4   <meta name="viewport" content="width=device-width"> | 
|  | 5   <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> | 
|  | 6   <style type="text/css"> | 
|  | 7     body { | 
|  | 8       font-size: 12px; | 
|  | 9       font-family: Helvetica Neue, Helvetica, Arial, sans-serif; | 
|  | 10       line-height: 1.5; | 
|  | 11       margin: 0px; | 
|  | 12       background-color: #eee; | 
|  | 13     } | 
|  | 14     #content { | 
|  | 15       width: 100%; | 
|  | 16       min-height: 100vh; | 
|  | 17       padding: 10px; | 
|  | 18       margin: auto; | 
|  | 19       background-color: #fff; | 
|  | 20     } | 
|  | 21     @media (min-width: 600px) { | 
|  | 22       #content { | 
|  | 23         width: 500px; | 
|  | 24       } | 
|  | 25     } | 
|  | 26     * { box-sizing: border-box; } | 
|  | 27     ul { padding-left: 20px; } | 
|  | 28     #n, .js { display: none; } | 
|  | 29     input, button, select, option, .js { font-size: 150%; } | 
|  | 30   </style> | 
|  | 31 </head> | 
|  | 32 <body> | 
|  | 33   <div id="content"> | 
|  | 34     <h1>Konversi buat nitip</h1> | 
|  | 35     <form> | 
|  | 36       <p> | 
|  | 37         <label for="x">Jumlah dalam yen:</label> | 
|  | 38         <br> | 
|  | 39         <input id="x" name="x" type="number" autofocus> | 
|  | 40       </p> | 
|  | 41       <p> | 
|  | 42         <button type="submit">Hitung</button> | 
|  | 43         <button type="reset">Hapus</button> | 
|  | 44       </p> | 
|  | 45     </form> | 
|  | 46     <div class="js" id="loading"> | 
|  | 47       <p>Memuat data nilai tukar...</p> | 
|  | 48     </div> | 
|  | 49     <div class="js" id="ok"> | 
|  | 50       <p> | 
|  | 51         Biaya: | 
|  | 52       </p> | 
|  | 53       <ul> | 
|  | 54         <li> | 
|  | 55           Bank transfer: | 
|  | 56           <span id="result-bank"></span> IDR | 
|  | 57           (<span id="rate-text"></span> IDR/JPY) | 
|  | 58         </li> | 
|  | 59         <li> | 
|  | 60           PayPal: | 
|  | 61           <span id="result-paypal"></span> JPY | 
|  | 62         </li> | 
|  | 63       </ul> | 
|  | 64     </div> | 
|  | 65     <div class="js" id="error"> | 
|  | 66       <p>Koneksi ke server nilai tukar bermasalah.</p> | 
|  | 67     </div> | 
|  | 68 | 
|  | 69     <hr> | 
|  | 70     <ul> | 
|  | 71       <li>Ongkir, cukai, dll tidak termasuk.</li> | 
|  | 72       <li>Berhubung sudah punya timbangan, ongkir (estimasi) bisa dihitung sebelum dikirim.</li> | 
|  | 73       <li><a href="http://www.post.japanpost.jp/int/charge/list/ems1_en.html">Tabel ongkir EMS</a>.</li> | 
|  | 74       <li>Perhitungan: | 
|  | 75         <ul> | 
|  | 76           <li>Bank: <code>jumlah × 1.07 × nilai_tukar</code>, dibulatkan ke seribuan terdekat.</li> | 
|  | 77           <li>PayPal: <code>jumlah × 1.05</code>, dibulatkan ke satuan terdekat.</li> | 
|  | 78         </ul> | 
|  | 79       </li> | 
|  | 80       <li>Jangan lupa memastikan jumlah setelah pajak dan ongkir (lokal).</li> | 
|  | 81       <li>Data nilai tukar didapat dari layanan <a href="http://fixer.io/">Fixer.io</a>.</li> | 
|  | 82     </ul> | 
|  | 83 | 
|  | 84     <pre id="n"><code> | 
|  | 85 location = /calc { | 
|  | 86   root /home/edho/public_html; | 
|  | 87   try_files /calc.html =404; | 
|  | 88 } | 
|  | 89 location = /calc/get { | 
|  | 90   return 302 http://www.wolframalpha.com/input/?i=ceil%28%28$arg_x+*+1.07+jpy+in+idr%29%2F1000%29*1000; | 
|  | 91 } | 
|  | 92     </code></pre> | 
|  | 93   </div> | 
|  | 94 | 
|  | 95   <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> | 
|  | 96   <script> | 
|  | 97     // best javascript ahead. Proceed with care. | 
|  | 98     var | 
|  | 99       displayResult = function(x, rate) { | 
|  | 100         $("#rate-text").text(rate.toLocaleString()) | 
|  | 101         $("#result-bank").text((Math.round(x * 1.07 * rate / 1000) * 1000).toLocaleString()) | 
|  | 102         $("#result-paypal").text((Math.round(x * 1.05)).toLocaleString()) | 
|  | 103         $("#ok").show() | 
|  | 104       }, | 
|  | 105       loading = $("#loading"), | 
|  | 106       doButton = $("button[type=submit]"), | 
|  | 107       clearButton = $("button[type=reset]"), | 
|  | 108       unlock = function() { | 
|  | 109         loading.hide() | 
|  | 110         doButton.attr("disabled", false) | 
|  | 111       }, | 
|  | 112       lock = function() { | 
|  | 113         loading.show() | 
|  | 114         doButton.attr("disabled", true) | 
|  | 115       }, | 
|  | 116       xForm = $("#x"), | 
|  | 117       action = function(e) { | 
|  | 118         e.preventDefault() | 
|  | 119         $(".js").hide() | 
|  | 120         var x = parseFloat(xForm.val()) | 
|  | 121         if (x === NaN || x === undefined) { return false; } | 
|  | 122 | 
|  | 123         if (window.rate === undefined) { | 
|  | 124           lock() | 
|  | 125           $.getJSON("https://api.fixer.io/latest", { base: "JPY", symbols: "IDR" }) | 
|  | 126           .done(function(data) { | 
|  | 127             window.rate = data.rates["IDR"] | 
|  | 128             displayResult(x, window.rate) | 
|  | 129           }) | 
|  | 130           .fail(function() { | 
|  | 131             $("#error").show() | 
|  | 132           }) | 
|  | 133           .always(function() { | 
|  | 134             unlock() | 
|  | 135           }) | 
|  | 136         } else { | 
|  | 137           displayResult(x, window.rate) | 
|  | 138         } | 
|  | 139       } | 
|  | 140     clearButton.click(function(e) { xForm.focus() }) | 
|  | 141     doButton.click(action) | 
|  | 142     $("form").submit(action) | 
|  | 143   </script> | 
|  | 144 </body> |