gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-merchant-demos] branch master updated (30a87f5 -> 3ca29bf)


From: gnunet
Subject: [taler-taler-merchant-demos] branch master updated (30a87f5 -> 3ca29bf)
Date: Wed, 22 Jul 2020 16:11:34 +0200

This is an automated email from the git hooks/post-receive script.

ms pushed a change to branch master
in repository taler-merchant-demos.

    from 30a87f5  Installing donations (css not found)
     new 147658b  no web-common
     new 3ca29bf  import static files

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 talermerchantdemos/blog/__init__.py                |   2 +-
 talermerchantdemos/blog/content.py                 |   6 +-
 .../blog/static/{web-common => }/demo.css          |   0
 .../{web-common => }/dropdown-navbar_style.css     |   0
 .../blog/static/{web-common => }/lang.css          |   0
 .../blog/static/{web-common => }/pure.css          |   0
 .../blog/static/{web-common => }/style.css         |   0
 .../static/{web-common => }/taler-fallback.css     |   0
 .../blog/static/web-common/.gitignore              |   6 -
 talermerchantdemos/blog/static/web-common/AUTHORS  |   2 -
 .../blog/static/web-common/Makefile.am             |  51 ---
 .../blog/static/web-common/Makefile_Guix           |   5 -
 .../blog/static/web-common/chrome-any.d.ts         |   2 -
 .../blog/static/web-common/dropdown-navbar.html    |  51 ---
 .../static/web-common/dropdown-navbar_script.js    |  60 ---
 .../blog/static/web-common/favicon-taler.ico       | Bin 1150 -> 0 bytes
 .../blog/static/web-common/lang.html               |  29 --
 talermerchantdemos/blog/static/web-common/lang.js  |  69 ---
 .../blog/static/web-common/licensing.rst           |   2 -
 .../blog/static/web-common/logo-2015-medium.png    | Bin 75094 -> 0 bytes
 .../blog/static/web-common/taler-wallet-lib.js     | 446 -------------------
 .../blog/static/web-common/taler-wallet-lib.ts     | 488 ---------------------
 .../blog/static/web-common/tsconfig.json           |  17 -
 talermerchantdemos/blog/templates/base.html        |   6 +-
 talermerchantdemos/donations/__init__.py           |   3 +
 talermerchantdemos/donations/donations.py          | 314 +++++++++++++
 .../web-common => donations/static}/demo.css       |   0
 .../web-common => donations/static}/pure.css       |   0
 .../static}/taler-fallback.css                     |   0
 .../{blog => donations}/templates/base.html        |  41 +-
 .../donations/templates/checkout.html              |  59 +++
 .../{blog => donations}/templates/error.html       |   0
 .../donations/templates/fulfillment.html           |  11 +
 talermerchantdemos/donations/templates/index.html  |  42 ++
 .../{blog => donations}/templates/javascript.html  |   0
 .../templates/provider-not-supported.html          |   6 +
 .../templates/request_payment.html                 |   0
 37 files changed, 450 insertions(+), 1268 deletions(-)
 copy talermerchantdemos/blog/static/{web-common => }/demo.css (100%)
 rename talermerchantdemos/blog/static/{web-common => 
}/dropdown-navbar_style.css (100%)
 rename talermerchantdemos/blog/static/{web-common => }/lang.css (100%)
 copy talermerchantdemos/blog/static/{web-common => }/pure.css (100%)
 rename talermerchantdemos/blog/static/{web-common => }/style.css (100%)
 copy talermerchantdemos/blog/static/{web-common => }/taler-fallback.css (100%)
 delete mode 100644 talermerchantdemos/blog/static/web-common/.gitignore
 delete mode 100644 talermerchantdemos/blog/static/web-common/AUTHORS
 delete mode 100644 talermerchantdemos/blog/static/web-common/Makefile.am
 delete mode 100644 talermerchantdemos/blog/static/web-common/Makefile_Guix
 delete mode 100644 talermerchantdemos/blog/static/web-common/chrome-any.d.ts
 delete mode 100644 
talermerchantdemos/blog/static/web-common/dropdown-navbar.html
 delete mode 100644 
talermerchantdemos/blog/static/web-common/dropdown-navbar_script.js
 delete mode 100644 talermerchantdemos/blog/static/web-common/favicon-taler.ico
 delete mode 100644 talermerchantdemos/blog/static/web-common/lang.html
 delete mode 100644 talermerchantdemos/blog/static/web-common/lang.js
 delete mode 100644 talermerchantdemos/blog/static/web-common/licensing.rst
 delete mode 100644 
talermerchantdemos/blog/static/web-common/logo-2015-medium.png
 delete mode 100644 
talermerchantdemos/blog/static/web-common/taler-wallet-lib.js
 delete mode 100644 
talermerchantdemos/blog/static/web-common/taler-wallet-lib.ts
 delete mode 100644 talermerchantdemos/blog/static/web-common/tsconfig.json
 create mode 100644 talermerchantdemos/donations/__init__.py
 create mode 100644 talermerchantdemos/donations/donations.py
 rename talermerchantdemos/{blog/static/web-common => 
donations/static}/demo.css (100%)
 rename talermerchantdemos/{blog/static/web-common => 
donations/static}/pure.css (100%)
 rename talermerchantdemos/{blog/static/web-common => 
donations/static}/taler-fallback.css (100%)
 copy talermerchantdemos/{blog => donations}/templates/base.html (64%)
 create mode 100644 talermerchantdemos/donations/templates/checkout.html
 copy talermerchantdemos/{blog => donations}/templates/error.html (100%)
 create mode 100644 talermerchantdemos/donations/templates/fulfillment.html
 create mode 100644 talermerchantdemos/donations/templates/index.html
 copy talermerchantdemos/{blog => donations}/templates/javascript.html (100%)
 create mode 100644 
talermerchantdemos/donations/templates/provider-not-supported.html
 copy talermerchantdemos/{blog => donations}/templates/request_payment.html 
(100%)

diff --git a/talermerchantdemos/blog/__init__.py 
b/talermerchantdemos/blog/__init__.py
index 2c45f00..6b9d58a 100644
--- a/talermerchantdemos/blog/__init__.py
+++ b/talermerchantdemos/blog/__init__.py
@@ -1,3 +1,3 @@
-from talerblog.blog.blog import app
+from talermerchantdemos.blog.blog import app
 
 __all__ = ["app"]
diff --git a/talermerchantdemos/blog/content.py 
b/talermerchantdemos/blog/content.py
index 0ecfa66..a0e90dd 100644
--- a/talermerchantdemos/blog/content.py
+++ b/talermerchantdemos/blog/content.py
@@ -53,7 +53,7 @@ def add_article(slug, title, teaser, main_file, extra_files):
 # @param image the image filename.
 # @return the path to the image file.
 def get_image_file(image):
-    filex = resource_filename("talerblog", os.path.join("blog/data/", image))
+    filex = resource_filename("talermerchantdemos", os.path.join("blog/data/", 
image))
     return os.path.abspath(filex)
 
 
@@ -63,7 +63,7 @@ def get_image_file(image):
 # @param article the article filename.
 # @return the path to the article HTML file.
 def get_article_file(article):
-    filex = resource_filename("talerblog", article.main_file)
+    filex = resource_filename("talermerchantdemos", article.main_file)
     return os.path.basename(filex)
 
 
@@ -79,7 +79,7 @@ def get_article_file(article):
 #        HTML itself, so give it here if a explicit title needs to be
 #        specified.
 def add_from_html(resource_name, teaser_paragraph=0, title=None):
-    res = resource_stream("talerblog", resource_name)
+    res = resource_stream("talermerchantdemos", resource_name)
     soup = BeautifulSoup(res, 'html.parser')
     res.close()
     if title is None:
diff --git a/talermerchantdemos/blog/static/web-common/demo.css 
b/talermerchantdemos/blog/static/demo.css
similarity index 100%
copy from talermerchantdemos/blog/static/web-common/demo.css
copy to talermerchantdemos/blog/static/demo.css
diff --git 
a/talermerchantdemos/blog/static/web-common/dropdown-navbar_style.css 
b/talermerchantdemos/blog/static/dropdown-navbar_style.css
similarity index 100%
rename from talermerchantdemos/blog/static/web-common/dropdown-navbar_style.css
rename to talermerchantdemos/blog/static/dropdown-navbar_style.css
diff --git a/talermerchantdemos/blog/static/web-common/lang.css 
b/talermerchantdemos/blog/static/lang.css
similarity index 100%
rename from talermerchantdemos/blog/static/web-common/lang.css
rename to talermerchantdemos/blog/static/lang.css
diff --git a/talermerchantdemos/blog/static/web-common/pure.css 
b/talermerchantdemos/blog/static/pure.css
similarity index 100%
copy from talermerchantdemos/blog/static/web-common/pure.css
copy to talermerchantdemos/blog/static/pure.css
diff --git a/talermerchantdemos/blog/static/web-common/style.css 
b/talermerchantdemos/blog/static/style.css
similarity index 100%
rename from talermerchantdemos/blog/static/web-common/style.css
rename to talermerchantdemos/blog/static/style.css
diff --git a/talermerchantdemos/blog/static/web-common/taler-fallback.css 
b/talermerchantdemos/blog/static/taler-fallback.css
similarity index 100%
copy from talermerchantdemos/blog/static/web-common/taler-fallback.css
copy to talermerchantdemos/blog/static/taler-fallback.css
diff --git a/talermerchantdemos/blog/static/web-common/.gitignore 
b/talermerchantdemos/blog/static/web-common/.gitignore
deleted file mode 100644
index e64e5c1..0000000
--- a/talermerchantdemos/blog/static/web-common/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile
-Makefile.in
-# these should be commited pre-build to the repo, too:
-#taler-wallet-lib.js
-
-.idea
diff --git a/talermerchantdemos/blog/static/web-common/AUTHORS 
b/talermerchantdemos/blog/static/web-common/AUTHORS
deleted file mode 100644
index 7f16bf5..0000000
--- a/talermerchantdemos/blog/static/web-common/AUTHORS
+++ /dev/null
@@ -1,2 +0,0 @@
-Florian Dold
-Marcello Stanisci
diff --git a/talermerchantdemos/blog/static/web-common/Makefile.am 
b/talermerchantdemos/blog/static/web-common/Makefile.am
deleted file mode 100644
index 71c1d68..0000000
--- a/talermerchantdemos/blog/static/web-common/Makefile.am
+++ /dev/null
@@ -1,51 +0,0 @@
-# This Makefile.am is in the public domain
-EXTRA_DIST = \
- style.css \
- taler-wallet-lib.ts \
- chrome-any.d.ts \
- logo-2015-medium.png \
- licensing.rst \
- favicon-taler.ico \
- dropdown-navbar.html \
- lang.html \
- lang.css \
- lang.js \
- dropdown-navbar_style.css \
- dropdown-navbar_script.js \
- taler-fallback.css \
- tsconfig.json \
- AUTHORS
-
-# Some file may be missing here...
-pkgdata_DATA = \
-  dropdown-navbar.html \
-  favicon-taler.ico \
-  logo-2015-medium.png \
-  style.css \
-  taler-wallet-lib.js
-
-all: taler-wallet-lib.min.js taler-wallet-lib.js.tar.gz taler-wallet-lib.js
-
-%.min.js: %.js
-       python3 -m jsmin $< > $@
-
-%.js.tar.gz: %.js
-       tar czf $@ $<
-
-taler-wallet-lib.js: taler-wallet-lib.ts chrome-any.d.ts
-if HAVE_TSC
-       tsc
-else
-       @echo
-       @if [ ! -f "$@" ] ; then \
-         echo "*** Error: typescript compiler 'tsc' is missing," \
-              "can't build" $@ ; \
-         echo ; \
-         exit 1 ; \
-       else \
-          echo "*** Warning: typescript compiler 'tsc' is missing," \
-               "using pre-build" $@ ; \
-         touch "$@"; \
-       fi
-       @echo
-endif
diff --git a/talermerchantdemos/blog/static/web-common/Makefile_Guix 
b/talermerchantdemos/blog/static/web-common/Makefile_Guix
deleted file mode 100644
index 43dfe04..0000000
--- a/talermerchantdemos/blog/static/web-common/Makefile_Guix
+++ /dev/null
@@ -1,5 +0,0 @@
-# This Makefile is used to update the compiled JavaScripts
-# put under versioning for making Guix packaging easier
-
-all:
-       tsc taler-wallet-lib.ts
diff --git a/talermerchantdemos/blog/static/web-common/chrome-any.d.ts 
b/talermerchantdemos/blog/static/web-common/chrome-any.d.ts
deleted file mode 100644
index b621337..0000000
--- a/talermerchantdemos/blog/static/web-common/chrome-any.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-// We don't really need the full declaration here, so just include this.
-declare let chrome: any;
diff --git a/talermerchantdemos/blog/static/web-common/dropdown-navbar.html 
b/talermerchantdemos/blog/static/web-common/dropdown-navbar.html
deleted file mode 100644
index 7d28787..0000000
--- a/talermerchantdemos/blog/static/web-common/dropdown-navbar.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-  This file is part of GNU TALER.
-  Copyright (C) 2014, 2015, 2016 INRIA
-
-  TALER is free software; you can redistribute it and/or modify it under the
-  terms of the GNU Lesser General Public License as published by the Free 
Software
-  Foundation; either version 2.1, or (at your option) any later version.
-
-  TALER is distributed in the hope that it will be useful, but WITHOUT ANY
-  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-  A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more 
details.
-
-  You should have received a copy of the GNU Lesser General Public License 
along with
-  TALER; see the file COPYING.  If not, If not, see 
<http://www.gnu.org/licenses/>
-
-  @author Marcello Stanisci
--->
-
-<!--
-  URLs here use the special redir_app_rel path, which is rewritten by the
-  webserver to be relative to the current application mount path, no matter
-  where it occurs in the path.
--->
-
-<div>
- <link rel="stylesheet" type="text/css" 
href="redir_app_rel/static/web-common/dropdown-navbar_style.css">
- <script src="redir_app_rel/static/web-common/dropdown-navbar_script.js" 
type="application/javascript"></script>
-  <div class="dropdown-navbar">
-    <ul>
-      <li>
-        <a href="https://taler.net/"; class="m_index btn btn-outline-success" 
id="home" target="_blank">Home</a>
-      </li>
-      <li>
-        <a href="redir_app_rel/landing" class="m_demo" 
id="demo">Instructions</a>
-      </li>
-      <li>
-        <a href="javascript:void(0)" class="dropbtn" id="bank">Bank</a>
-        <div class="dropdown-content bank">
-          <a href="redir_app_rel/bank">Main</a>
-          <a href="redir_app_rel/bank/public-accounts">Public accounts</a>
-       </div>
-      </li>
-      <li>
-        <a href="redir_app_rel/shop" class="m_demo" id="shop">Shop</a>
-      </li>
-      <li>
-        <a href="redir_app_rel/donations" class="m_demo" 
id="donations">Donations</a>
-      </li>
-    </ul>
-  </div>
-</div>
diff --git 
a/talermerchantdemos/blog/static/web-common/dropdown-navbar_script.js 
b/talermerchantdemos/blog/static/web-common/dropdown-navbar_script.js
deleted file mode 100644
index 65f6848..0000000
--- a/talermerchantdemos/blog/static/web-common/dropdown-navbar_script.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/* @licstart  The following is the entire license notice for the
-  JavaScript code in this page.
-
-  Copyright (C) 2015, 2016 INRIA
-
-  The JavaScript code in this page is free software: you can
-  redistribute it and/or modify it under the terms of the GNU
-  Lesser General Public License (GNU LGPL) as published by the Free Software
-  Foundation, either version 2.1 of the License, or (at your option)
-  any later version.  The code is distributed WITHOUT ANY WARRANTY;
-  without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.
-
-  As additional permission under GNU LGPL version 2.1 section 7, you
-  may distribute non-source (e.g., minimized or compacted) forms of
-  that code without the copy of the GNU LGPL normally required by
-  section 4, provided you include this license notice and a URL
-  through which recipients can access the Corresponding Source.
-
-  @licend  The above is the entire license notice
-  for the JavaScript code in this page.
-
-  @author Marcello Stanisci
-*/
-window.onclick = function(e) {
-  var dropdowns = document.getElementsByClassName("dropdown-content");
-  if (!e.target.matches('.dropbtn')) {
-    for (var d = 0; d < dropdowns.length; d++) {
-      var openDropdown = dropdowns[d];
-      if (openDropdown.classList.contains('show')) {
-        openDropdown.classList.remove('show');
-      }
-    }
-  }
-  else{ // need to close other tabs belonging to tabs other than the clicked 
one 
-    for (var d = 0; d < dropdowns.length; d++) {
-      var openDropdown = dropdowns[d];
-      if ((openDropdown.parentNode != e.target.parentNode)
-        && (openDropdown.classList.contains("show"))){
-        openDropdown.classList.remove('show');
-      }
-    }        
-  }
-}
-/**
- * Dropdown bar items which are supposed to.  In the current
- * configuration, only the 'bank' item shold dropdown.
- */
-function injectOnclicks(){
-  var where = ["bank"];
-  for (i in where){
-    document.getElementById(where[i]).onclick = function(){
-      this.parentNode.children[1].classList.toggle("show");
-      }
-  }
-}
-function dropMenu(){
-
-}
-document.addEventListener('DOMContentLoaded', injectOnclicks);
diff --git a/talermerchantdemos/blog/static/web-common/favicon-taler.ico 
b/talermerchantdemos/blog/static/web-common/favicon-taler.ico
deleted file mode 100644
index 141b93d..0000000
Binary files a/talermerchantdemos/blog/static/web-common/favicon-taler.ico and 
/dev/null differ
diff --git a/talermerchantdemos/blog/static/web-common/lang.html 
b/talermerchantdemos/blog/static/web-common/lang.html
deleted file mode 100644
index 8db1c0d..0000000
--- a/talermerchantdemos/blog/static/web-common/lang.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="bottom-bar">
-  <div class="lang-selector">
-    <a href="#" onclick="setLang('en');">
-      <img>
-        <!-- 
https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg
 -->
-        <svg xmlns="http://www.w3.org/2000/svg"; viewBox="0 0 60 30" width="45" 
height="22.5">
-        <clipPath id="t">
-               <path d="M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z"/>
-        </clipPath>
-        <path d="M0,0 v30 h60 v-30 z" fill="#00247d"/>
-        <path d="M0,0 L60,30 M60,0 L0,30" stroke="#fff" stroke-width="6"/>
-        <path d="M0,0 L60,30 M60,0 L0,30" clip-path="url(#t)" stroke="#cf142b" 
stroke-width="4"/>
-        <path d="M30,0 v30 M0,15 h60" stroke="#fff" stroke-width="10"/>
-        <path d="M30,0 v30 M0,15 h60" stroke="#cf142b" stroke-width="6"/>
-        </svg>
-      </img>
-    </a>
-    <a href="#" onclick="setLang('it');">
-      <img>
-       <!-- https://upload.wikimedia.org/wikipedia/en/0/03/Flag_of_Italy.svg 
-->
-        <svg xmlns="http://www.w3.org/2000/svg"; width="45" height="22.5" 
viewBox="0 0 3 2">
-        <rect width="1" height="2" fill="#009246"/>
-        <rect width="1" height="2" x="1" fill="#fff"/>
-        <rect width="1" height="2" x="2" fill="#ce2b37"/>
-        </svg>
-      </img>
-    </a>
-  </div>
-</div>
diff --git a/talermerchantdemos/blog/static/web-common/lang.js 
b/talermerchantdemos/blog/static/web-common/lang.js
deleted file mode 100644
index 356a152..0000000
--- a/talermerchantdemos/blog/static/web-common/lang.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * @licstart  The following is the entire license notice for the
- *  JavaScript code in this page.
- *
- * Copyright (C) 2014 GNUnet e.V.
- *
- * The JavaScript code in this page is free software: you can
- * redistribute it and/or modify it under the terms of the GNU
- * General Public License (GNU GPL) as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version.  The code is distributed WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
- *
- * As additional permission under GNU GPL version 3 section 7, you
- * may distribute non-source (e.g., minimized or compacted) forms of
- * that code without the copy of the GNU GPL normally required by
- * section 4, provided you include this license notice and a URL
- * through which recipients can access the Corresponding Source.
- *
- * @licend  The above is the entire license notice
- * for the JavaScript code in this page.
- */
-
-// @license 
magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt 
GPL-v3-or-Later
-
-function supports_html5_storage() {
-  try {
-    return 'sessionStorage' in window && window['sessionStorage'] !== null;
-  }
-  catch (e) {
-    return false;
-  }
-}
-
-function setLang(l)
-{
-  document.body.className=l;
-  if (supports_html5_storage()) {
-    sessionStorage.setItem('lang', l);
-  }
-  if (l == 'en') document.title = 'GNU Taler - Merchant demonstrator';
-  if (l == 'it') document.title = 'GNU Taler - Dimostrazione d\'acquisto';
-}
-
-function get_default_lang()
-{
-  langs = ['en', 'it'];
-  for (var i in navigator.languages) {
-    for (var j in langs) {
-      if (navigator.languages[i].indexOf(langs[j]) != -1)
-        return langs[j];
-    }
-  }
-  return 'en';
-}
-
-/*To be called on each onLoad*/
-function loadLang()
-{
-  l = null;
-  if (supports_html5_storage()) {
-    l = sessionStorage.getItem('lang');
-  }
-  if (!l)
-    l = get_default_lang();
-  setLang(l);
-}
-// @license-end
diff --git a/talermerchantdemos/blog/static/web-common/licensing.rst 
b/talermerchantdemos/blog/static/web-common/licensing.rst
deleted file mode 100644
index 05c13b9..0000000
--- a/talermerchantdemos/blog/static/web-common/licensing.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-The copyright of all the HTML/CSS/JavaScript files in this directory
-is owned by INRIA.
diff --git a/talermerchantdemos/blog/static/web-common/logo-2015-medium.png 
b/talermerchantdemos/blog/static/web-common/logo-2015-medium.png
deleted file mode 100644
index 78159bb..0000000
Binary files a/talermerchantdemos/blog/static/web-common/logo-2015-medium.png 
and /dev/null differ
diff --git a/talermerchantdemos/blog/static/web-common/taler-wallet-lib.js 
b/talermerchantdemos/blog/static/web-common/taler-wallet-lib.js
deleted file mode 100644
index 2fe1c20..0000000
--- a/talermerchantdemos/blog/static/web-common/taler-wallet-lib.js
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
-  @source 
https://www.git.taler.net/?p=web-common.git;a=blob_plain;f=taler-wallet-lib.ts;hb=HEAD
-  @license 
magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt 
LGPL v21
-
-  @licstart  The following is the entire license notice for the
-  JavaScript code in this page.
-
-  Copyright (C) 2015, 2016 INRIA
-
-  The JavaScript code in this page is free software: you can
-  redistribute it and/or modify it under the terms of the GNU
-  Lesser General Public License (GNU LGPL) as published by the Free Software
-  Foundation, either version 2.1 of the License, or (at your option)
-  any later version.  The code is distributed WITHOUT ANY WARRANTY;
-  without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.
-
-  As additional permission under GNU LGPL version 2.1 section 7, you
-  may distribute non-source (e.g., minimized or compacted) forms of
-  that code without the copy of the GNU LGPL normally required by
-  section 4, provided you include this license notice and a URL
-  through which recipients can access the Corresponding Source.
-
-  @licend  The above is the entire license notice
-  for the JavaScript code in this page.
-
-  @author Marcello Stanisci
-  @author Florian Dold
-*/
-(function (factory) {
-    if (typeof module === "object" && typeof module.exports === "object") {
-        var v = factory(require, exports);
-        if (v !== undefined) module.exports = v;
-    }
-    else if (typeof define === "function" && define.amd) {
-        define(["require", "exports"], factory);
-    }
-})(function (require, exports) {
-    "use strict";
-    var taler;
-    (function (taler) {
-        "use strict";
-        var logVerbose = false;
-        try {
-            logVerbose = !!localStorage.getItem("taler-log-verbose");
-        }
-        catch (e) {
-        }
-        var presentHandlers = [];
-        var absentHandlers = [];
-        // Are we running as the content script of an 
-        // extension (and not just from a normal page)?
-        var runningInExtension = false;
-        var callSeqId = 1;
-        var installed = false;
-        var probeExecuted = false;
-        var pageLoaded = false;
-        var errorHandler = undefined;
-        var sheet;
-        function onError(handler) {
-            if (errorHandler) {
-                console.warn("Overriding error handler");
-            }
-            errorHandler = handler;
-        }
-        taler.onError = onError;
-        /**
-         * Error handler for things that go wrong in the merchant
-         * frontend browser code.
-         */
-        function raise_error(reason, detail) {
-            if (errorHandler) {
-                errorHandler(reason, detail);
-                return;
-            }
-            alert("Failure: " + reason + ".  No error handler installed.  Open 
the developer console for more information.");
-            console.error(reason, detail);
-            console.warn("No custom error handler set.");
-        }
-        function callWallet(funcName, args, onResult) {
-            var detail = JSON.parse(JSON.stringify(args || {}));
-            var callId = callSeqId++;
-            detail.callId = callId;
-            var onTimeout = function () {
-                console.warn("timeout for invocation of " + funcName);
-            };
-            var timeoutHandle = setTimeout(onTimeout, 1000);
-            var handler = function (evt) {
-                if (evt.detail.callId !== callId) {
-                    return;
-                }
-                if (onResult) {
-                    onResult(evt.detail);
-                }
-                clearTimeout(timeoutHandle);
-                document.removeEventListener(funcName + "-result", handler);
-            };
-            document.addEventListener(funcName + "-result", handler);
-            var evt = new CustomEvent(funcName, { detail: detail });
-            document.dispatchEvent(evt);
-        }
-        /**
-         * Confirm that a reserve was created.
-         *
-         * Used by tightly integrated bank portals.
-         */
-        function confirmReserve(reservePub) {
-            if (!installed) {
-                logVerbose && console.log("delaying confirmReserve");
-                taler.onPresent(function () {
-                    confirmReserve(reservePub);
-                });
-                return;
-            }
-            callWallet("taler-confirm-reserve", { reserve_pub: reservePub });
-        }
-        taler.confirmReserve = confirmReserve;
-        function createReserve(callbackUrl, amount, wtTypes, 
suggestedExchangeUrl) {
-            if (!installed) {
-                logVerbose && console.log("delaying createReserve");
-                taler.onPresent(function () {
-                    createReserve(callbackUrl, amount, wtTypes, 
suggestedExchangeUrl);
-                });
-                return;
-            }
-            var args = {
-                callback_url: callbackUrl,
-                amount: amount,
-                wt_types: wtTypes,
-                suggested_exchange_url: suggestedExchangeUrl
-            };
-            callWallet("taler-create-reserve", args);
-        }
-        taler.createReserve = createReserve;
-        function handlePaymentResponse(walletResp) {
-            /**
-             * Handle a failed payment.
-             *
-             * Try to notify the wallet first, before we show a potentially
-             * synchronous error message (such as an alert) or leave the page.
-             */
-            function handleFailedPayment(r) {
-                var timeoutHandle = null;
-                function err() {
-                    raise_error("pay-failed", { status: r.status, response: 
r.responseText });
-                }
-                function onResp() {
-                    if (timeoutHandle != null) {
-                        clearTimeout(timeoutHandle);
-                        timeoutHandle = null;
-                    }
-                    err();
-                }
-                function onTimeout() {
-                    timeoutHandle = null;
-                    err();
-                }
-                callWallet("taler-payment-failed", { H_contract: 
walletResp.H_contract }, onResp);
-                timeoutHandle = setTimeout(onTimeout, 200);
-            }
-            logVerbose && console.log("handling taler-notify-payment: ", 
walletResp);
-            // Payment timeout in ms.
-            var timeout_ms = 1000;
-            // Current request.
-            var r;
-            var timeoutHandle = null;
-            function sendPay() {
-                r = new XMLHttpRequest();
-                r.open("post", walletResp.contract.pay_url);
-                r.setRequestHeader("Content-Type", 
"application/json;charset=UTF-8");
-                r.send(JSON.stringify(walletResp.payReq));
-                r.onload = function () {
-                    if (!r) {
-                        return;
-                    }
-                    switch (r.status) {
-                        case 200:
-                            var merchantResp = JSON.parse(r.responseText);
-                            logVerbose && console.log("got success from 
pay_url");
-                            callWallet("taler-payment-succeeded", { 
H_contract: walletResp.H_contract, merchantSig: merchantResp.sig }, function () 
{
-                                var nextUrl = 
walletResp.contract.fulfillment_url;
-                                logVerbose && 
console.log("taler-payment-succeeded done, going to", nextUrl);
-                                window.location.href = nextUrl;
-                                window.location.reload(true);
-                            });
-                            break;
-                        default:
-                            handleFailedPayment(r);
-                            break;
-                    }
-                    r = null;
-                    if (timeoutHandle != null) {
-                        clearTimeout(timeoutHandle);
-                        timeoutHandle = null;
-                    }
-                };
-                function retry() {
-                    if (r) {
-                        r.abort();
-                        r = null;
-                    }
-                    timeout_ms = Math.min(timeout_ms * 2, 10 * 1000);
-                    logVerbose && console.log("sendPay timed out, retrying in 
", timeout_ms, "ms");
-                    sendPay();
-                }
-                timeoutHandle = setTimeout(retry, timeout_ms);
-            }
-            sendPay();
-        }
-        function onPresent(f) {
-            presentHandlers.push(f);
-        }
-        taler.onPresent = onPresent;
-        function onAbsent(f) {
-            absentHandlers.push(f);
-        }
-        taler.onAbsent = onAbsent;
-        function internalPay(p) {
-            // either the callback gets called,
-            // or the wallet will redirect the browser
-            callWallet("taler-pay", p, handlePaymentResponse);
-        }
-        taler.internalPay = internalPay;
-        function pay(p) {
-            if (!installed) {
-                logVerbose && console.log("delaying call to 'pay' until GNU 
Taler wallet is present");
-                taler.onPresent(function () {
-                    pay(p);
-                });
-                return;
-            }
-            internalPay(p);
-        }
-        taler.pay = pay;
-        function internalAddAuditor(d) {
-            // either the callback gets called,
-            // or the wallet will redirect the browser
-            callWallet("taler-add-auditor", d);
-        }
-        taler.internalAddAuditor = internalAddAuditor;
-        function addAuditor(d) {
-            if (!installed) {
-                logVerbose && console.log("delaying call to 'addAuditor' until 
GNU Taler wallet is present");
-                taler.onPresent(function () {
-                    addAuditor(d);
-                });
-                return;
-            }
-            internalAddAuditor(d);
-        }
-        taler.addAuditor = addAuditor;
-        function internalCheckAuditor(url) {
-            return new Promise(function (resolve, reject) {
-                callWallet("taler-check-auditor", url, function (x) { return 
resolve(x); });
-            });
-        }
-        taler.internalCheckAuditor = internalCheckAuditor;
-        /**
-         * Check if an auditor is already added to the wallet.
-         *
-         * Same-origin restrictions apply.
-         */
-        function checkAuditor(url) {
-            if (!installed) {
-                logVerbose && console.log("delaying call to 'checkAuditor' 
until GNU Taler wallet is present");
-                return new Promise(function (resolve, reject) {
-                    taler.onPresent(function () {
-                        resolve(checkAuditor(url));
-                    });
-                });
-            }
-            return internalCheckAuditor(url);
-        }
-        taler.checkAuditor = checkAuditor;
-        function initTaler() {
-            function handleUninstall() {
-                installed = false;
-                // not really true, but we want "uninstalled" to be shown
-                firstTimeoutCalled = true;
-                announce();
-            }
-            function handleProbe() {
-                probeExecuted = true;
-                if (!installed) {
-                    logVerbose && console.log("taler install detected");
-                    installed = true;
-                    announce();
-                }
-            }
-            function probeTaler() {
-                probeExecuted = false;
-                var eve = new Event("taler-probe");
-                document.dispatchEvent(eve);
-            }
-            var firstTimeoutCalled = false;
-            function onProbeTimeout() {
-                if (!probeExecuted) {
-                    if (installed || !firstTimeoutCalled) {
-                        installed = false;
-                        firstTimeoutCalled = true;
-                        logVerbose && console.log("taler uninstall detected");
-                        announce();
-                    }
-                }
-                // try again, maybe it'll be installed ...
-                probeTaler();
-            }
-            /**
-             * Announce presence/absence and update stylesheets.
-             *
-             * Only called after document.readyState is at least "interactive".
-             */
-            function announce() {
-                if (!pageLoaded) {
-                    logVerbose && console.log("page not loaded yet, announcing 
later");
-                    return;
-                }
-                setStyles();
-                if (installed) {
-                    logVerbose && console.log("announcing installed");
-                    for (var i = 0; i < presentHandlers.length; i++) {
-                        presentHandlers[i]();
-                    }
-                }
-                else {
-                    if (firstTimeoutCalled) {
-                        logVerbose && console.log("announcing uninstalled");
-                        for (var i = 0; i < absentHandlers.length; i++) {
-                            absentHandlers[i]();
-                        }
-                    }
-                    else {
-                        logVerbose && console.log("announcing nothing");
-                    }
-                }
-            }
-            function setStyles() {
-                if (!sheet || !sheet.cssRules) {
-                    return;
-                }
-                while (sheet.cssRules.length > 0) {
-                    sheet.deleteRule(0);
-                }
-                if (installed) {
-                    sheet.insertRule(".taler-installed-hide { display: none; 
}", 0);
-                    sheet.insertRule(".taler-probed-hide { display: none; }", 
0);
-                }
-                else {
-                    sheet.insertRule(".taler-installed-show { display: none; 
}", 0);
-                    if (firstTimeoutCalled) {
-                        sheet.insertRule(".taler-probed-hide { display: none; 
}", 0);
-                    }
-                    else {
-                        // We're still doing the detection
-                        sheet.insertRule(".taler-installed-hide { display: 
none; }", 0);
-                    }
-                }
-            }
-            function initStyle() {
-                logVerbose && console.log("taking over styles");
-                var name = "taler-presence-stylesheet";
-                var content = "/* Taler stylesheet controlled by JS */";
-                var style = document.getElementById(name);
-                if (!style) {
-                    style = document.createElement("style");
-                    // Needed by WebKit
-                    style.appendChild(document.createTextNode(content));
-                    style.id = name;
-                    document.head.appendChild(style);
-                    sheet = style.sheet;
-                }
-                else {
-                    // We've taken over the stylesheet now,
-                    // make it clear by clearing all the rules in it
-                    // and making it obvious in the DOM.
-                    if (style.tagName.toLowerCase() === "style") {
-                        style.innerText = content;
-                    }
-                    if (!style.sheet) {
-                        throw Error("taler-presence-stylesheet should be a 
style sheet (<link> or <style>)");
-                    }
-                    sheet = style.sheet;
-                    while (sheet.cssRules.length > 0) {
-                        sheet.deleteRule(0);
-                    }
-                }
-            }
-            function onPageLoad() {
-                pageLoaded = true;
-                if (document.readyState == "complete") {
-                    initStyle();
-                }
-                else {
-                    var listener = function () {
-                        initStyle();
-                        setStyles();
-                    };
-                    window.addEventListener("load", listener);
-                }
-                // We only start the timeout after the page is interactive.
-                window.setInterval(onProbeTimeout, 300);
-                announce();
-            }
-            probeTaler();
-            document.addEventListener("taler-probe-result", handleProbe, 
false);
-            document.addEventListener("taler-uninstall", handleUninstall, 
false);
-            // Handle the case where the JavaScript is loaded after the page
-            // has been loaded for the first time.
-            if (document.readyState == "loading") {
-                document.addEventListener("DOMContentLoaded", onPageLoad, 
false);
-            }
-            else {
-                onPageLoad();
-            }
-        }
-        function onPageLoadInExtension() {
-            if (document.documentElement.getAttribute("data-taler-nojs")) {
-                logVerbose && console.log("doing taler initialization from 
extension (nojs)");
-                initTaler();
-            }
-        }
-        var caught = false;
-        try {
-            chrome.runtime.sendMessage({ type: "ping" });
-        }
-        catch (e) {
-            caught = true;
-        }
-        if (caught) {
-            logVerbose && console.log("running taler-wallet-lib from page");
-            initTaler();
-        }
-        else {
-            logVerbose && console.log("running taler-wallet-lib from 
extension");
-            runningInExtension = true;
-            // Wait for even style sheets to load
-            if (document.readyState != "complete") {
-                window.addEventListener("load", function () { return 
onPageLoadInExtension(); });
-            }
-            else {
-                onPageLoadInExtension();
-            }
-        }
-    })(taler = exports.taler || (exports.taler = {}));
-});
-// @license-end
diff --git a/talermerchantdemos/blog/static/web-common/taler-wallet-lib.ts 
b/talermerchantdemos/blog/static/web-common/taler-wallet-lib.ts
deleted file mode 100644
index cbf32e8..0000000
--- a/talermerchantdemos/blog/static/web-common/taler-wallet-lib.ts
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
-  @source 
https://www.git.taler.net/?p=web-common.git;a=blob_plain;f=taler-wallet-lib.ts;hb=HEAD
-  @license 
magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt 
LGPL v21
-
-  @licstart  The following is the entire license notice for the
-  JavaScript code in this page.
-
-  Copyright (C) 2015, 2016 INRIA
-
-  The JavaScript code in this page is free software: you can
-  redistribute it and/or modify it under the terms of the GNU
-  Lesser General Public License (GNU LGPL) as published by the Free Software
-  Foundation, either version 2.1 of the License, or (at your option)
-  any later version.  The code is distributed WITHOUT ANY WARRANTY;
-  without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.
-
-  As additional permission under GNU LGPL version 2.1 section 7, you
-  may distribute non-source (e.g., minimized or compacted) forms of
-  that code without the copy of the GNU LGPL normally required by
-  section 4, provided you include this license notice and a URL
-  through which recipients can access the Corresponding Source.
-
-  @licend  The above is the entire license notice
-  for the JavaScript code in this page.
-
-  @author Marcello Stanisci
-  @author Florian Dold
-*/
-
-
-export namespace taler {
-  "use strict";
-
-  let logVerbose: boolean = false;
-  try {
-    logVerbose = !!localStorage.getItem("taler-log-verbose");
-  } catch (e) {
-    // can't read from local storage
-  }
-
-  const presentHandlers: any[] = [];
-  const absentHandlers: any[] = [];
-
-  // Are we running as the content script of an 
-  // extension (and not just from a normal page)?
-  let runningInExtension = false;
-
-  let callSeqId = 1;
-
-  let installed = false;
-  let probeExecuted = false;
-  let pageLoaded = false;
-
-  let errorHandler: any = undefined;
-
-  let sheet: CSSStyleSheet;
-
-  export function onError(handler: any) {
-    if (errorHandler) {
-      console.warn("Overriding error handler");
-    }
-    errorHandler = handler;
-  }
-
-
-  /**
-   * Error handler for things that go wrong in the merchant
-   * frontend browser code.
-   */
-  function raise_error(reason: string, detail: any) {
-    if (errorHandler) {
-      errorHandler(reason, detail);
-      return;
-    }
-    alert(`Failure: ${reason}.  No error handler installed.  Open the 
developer console for more information.`);
-    console.error(reason, detail);
-    console.warn("No custom error handler set.");
-  }
-
-
-  function callWallet(funcName: string, args: any, onResult?: any): void {
-    const detail = JSON.parse(JSON.stringify(args || {}));
-    const callId = callSeqId++;
-    detail.callId = callId;
-    let onTimeout = () => {
-      console.warn("timeout for invocation of " + funcName);
-    }
-    const timeoutHandle: number = setTimeout(onTimeout, 1000);
-    let handler = (evt: CustomEvent) => {
-      if (evt.detail.callId !== callId) {
-        return;
-      }
-      if (onResult) {
-        onResult(evt.detail);
-      }
-      clearTimeout(timeoutHandle);
-      document.removeEventListener(funcName + "-result", handler);
-    };
-    document.addEventListener(funcName + "-result", handler);
-    const evt = new CustomEvent(funcName, {detail});
-    document.dispatchEvent(evt)
-  }
-
-
-  /**
-   * Confirm that a reserve was created.
-   *
-   * Used by tightly integrated bank portals.
-   */
-  export function confirmReserve(reservePub: string) {
-    if (!installed) {
-      logVerbose && console.log("delaying confirmReserve");
-      taler.onPresent(() => {
-        confirmReserve(reservePub);
-      });
-      return;
-    }
-    callWallet("taler-confirm-reserve", {reserve_pub: reservePub});
-  }
-
-
-  export function createReserve(callbackUrl: string, amount: any, wtTypes: 
string[], suggestedExchangeUrl?: string) {
-    if (!installed) {
-      logVerbose && console.log("delaying createReserve");
-      taler.onPresent(() => {
-        createReserve(callbackUrl, amount, wtTypes, suggestedExchangeUrl);
-      });
-      return;
-    }
-    let args = {
-      callback_url: callbackUrl,
-      amount: amount,
-      wt_types: wtTypes,
-      suggested_exchange_url: suggestedExchangeUrl
-    };
-    callWallet("taler-create-reserve", args);
-  }
-
-
-  function handlePaymentResponse(walletResp: any) {
-    /**
-     * Handle a failed payment.
-     *
-     * Try to notify the wallet first, before we show a potentially
-     * synchronous error message (such as an alert) or leave the page.
-     */
-    function handleFailedPayment(r: XMLHttpRequest) {
-      let timeoutHandle: number|null = null;
-      function err() {
-        raise_error("pay-failed", {status: r.status, response: 
r.responseText});
-      }
-      function onResp() {
-        if (timeoutHandle != null) {
-          clearTimeout(timeoutHandle);
-          timeoutHandle = null;
-        }
-        err();
-      }
-      function onTimeout() {
-        timeoutHandle = null
-        err();
-      }
-      callWallet("taler-payment-failed", {H_contract: walletResp.H_contract}, 
onResp);
-      timeoutHandle = setTimeout(onTimeout, 200);
-    }
-
-
-    logVerbose && console.log("handling taler-notify-payment: ", walletResp);
-    // Payment timeout in ms.
-    let timeout_ms = 1000;
-    // Current request.
-    let r: XMLHttpRequest|null;
-    let timeoutHandle: number|null = null;
-    function sendPay() {
-      r = new XMLHttpRequest();
-      r.open("post", walletResp.contract.pay_url);
-      r.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
-      r.send(JSON.stringify(walletResp.payReq));
-      r.onload = function() {
-        if (!r) {
-          return;
-        }
-        switch (r.status) {
-          case 200:
-            const merchantResp = JSON.parse(r.responseText);
-            logVerbose && console.log("got success from pay_url");
-            callWallet("taler-payment-succeeded", {H_contract: 
walletResp.H_contract, merchantSig: merchantResp.sig}, () => {
-              let nextUrl = walletResp.contract.fulfillment_url;
-              logVerbose && console.log("taler-payment-succeeded done, going 
to", nextUrl);
-              window.location.href = nextUrl;
-              window.location.reload(true);
-            });
-            break;
-          default:
-            handleFailedPayment(r);
-            break;
-        }
-        r = null;
-        if (timeoutHandle != null) {
-          clearTimeout(timeoutHandle!);
-          timeoutHandle = null;
-        }
-      };
-      function retry() {
-        if (r) {
-          r.abort();
-          r = null;
-        }
-        timeout_ms = Math.min(timeout_ms * 2, 10 * 1000);
-        logVerbose && console.log("sendPay timed out, retrying in ", 
timeout_ms, "ms");
-        sendPay();
-      }
-      timeoutHandle = setTimeout(retry, timeout_ms);
-    }
-    sendPay();
-  }
-
-
-  export function onPresent(f: any) {
-    presentHandlers.push(f);
-  }
-
-  export function onAbsent(f: any) {
-    absentHandlers.push(f);
-  }
-
-  interface FulfillmentQuery {
-    type: "fulfillment_url";
-  }
-
-  interface OrderIdQuery {
-    type: "order_id";
-    order_id: string;
-  }
-
-
-  interface PayDetail {
-    contract_url?: string;
-    offer_url?: string;
-  }
-
-  export function internalPay(p: PayDetail) {
-    // either the callback gets called,
-    // or the wallet will redirect the browser
-    callWallet("taler-pay", p, handlePaymentResponse);
-  }
-
-  export function pay(p: PayDetail) {
-    if (!installed) {
-      logVerbose && console.log("delaying call to 'pay' until GNU Taler wallet 
is present");
-      taler.onPresent(() => {
-        pay(p);
-      });
-      return;
-    }
-    internalPay(p);
-  }
-
-  export interface AuditorDetail {
-    currency: string;
-    url: string;
-    auditorPub: string;
-    expirationStamp: number;
-  }
-
-
-  export function internalAddAuditor(d: AuditorDetail) {
-    // either the callback gets called,
-    // or the wallet will redirect the browser
-    callWallet("taler-add-auditor", d);
-  }
-
-
-  export function addAuditor(d: AuditorDetail) {
-    if (!installed) {
-      logVerbose && console.log("delaying call to 'addAuditor' until GNU Taler 
wallet is present");
-      taler.onPresent(() => {
-        addAuditor(d);
-      });
-      return;
-    }
-    internalAddAuditor(d);
-  }
-
-
-  export function internalCheckAuditor(url: string): 
Promise<AuditorDetail|undefined> {
-    return new Promise<AuditorDetail|undefined>((resolve, reject) => {
-      callWallet("taler-check-auditor", url, (x: any) => resolve(x as 
AuditorDetail));
-    });
-  }
-
-
-  /**
-   * Check if an auditor is already added to the wallet.
-   *
-   * Same-origin restrictions apply.
-   */
-  export function checkAuditor(url: string): Promise<AuditorDetail|undefined> {
-    if (!installed) {
-      logVerbose && console.log("delaying call to 'checkAuditor' until GNU 
Taler wallet is present");
-      return new Promise<AuditorDetail|undefined>((resolve, reject) => {
-        taler.onPresent(() => {
-          resolve(checkAuditor(url));
-        });
-      });
-    }
-    return internalCheckAuditor(url);
-  }
-
-
-  function initTaler() {
-
-    function handleUninstall() {
-      installed = false;
-      // not really true, but we want "uninstalled" to be shown
-      firstTimeoutCalled = true;
-      announce();
-    }
-
-    function handleProbe() {
-      probeExecuted = true;
-      if (!installed) {
-        logVerbose && console.log("taler install detected");
-        installed = true;
-        announce();
-      }
-    }
-
-    function probeTaler() {
-      probeExecuted = false;
-      var eve = new Event("taler-probe");
-      document.dispatchEvent(eve);
-    }
-
-    let firstTimeoutCalled = false;
-
-    function onProbeTimeout() {
-      if (!probeExecuted) {
-        if (installed || !firstTimeoutCalled) {
-          installed = false;
-          firstTimeoutCalled = true;
-          logVerbose && console.log("taler uninstall detected");
-          announce();
-        }
-      }
-      // try again, maybe it'll be installed ...
-      probeTaler();
-    }
-
-    /**
-     * Announce presence/absence and update stylesheets.
-     *
-     * Only called after document.readyState is at least "interactive".
-     */
-    function announce() {
-      if (!pageLoaded) {
-        logVerbose && console.log("page not loaded yet, announcing later");
-        return;
-      }
-      setStyles();
-      if (installed) {
-        logVerbose && console.log("announcing installed");
-        for (var i = 0; i < presentHandlers.length; i++) {
-          presentHandlers[i]();
-        }
-      } else {
-        if (firstTimeoutCalled) {
-          logVerbose && console.log("announcing uninstalled");
-          for (var i = 0; i < absentHandlers.length; i++) {
-            absentHandlers[i]();
-          }
-        } else {
-          logVerbose && console.log("announcing nothing");
-        }
-      }
-    }
-
-    function setStyles() {
-      if (!sheet || !sheet.cssRules) {
-        return;
-      }
-      while (sheet.cssRules.length > 0) {
-        sheet.deleteRule(0);
-      }
-      if (installed) {
-        sheet.insertRule(".taler-installed-hide { display: none; }", 0);
-        sheet.insertRule(".taler-probed-hide { display: none; }", 0);
-      } else {
-        sheet.insertRule(".taler-installed-show { display: none; }", 0);
-
-        if (firstTimeoutCalled) {
-          sheet.insertRule(".taler-probed-hide { display: none; }", 0);
-        } else {
-          // We're still doing the detection
-          sheet.insertRule(".taler-installed-hide { display: none; }", 0);
-        }
-      }
-    }
-
-    function initStyle() {
-      logVerbose && console.log("taking over styles");
-      const name = "taler-presence-stylesheet";
-      const content = "/* Taler stylesheet controlled by JS */";
-      let style = document.getElementById(name) as HTMLStyleElement|null; 
-      if (!style) {
-        style = document.createElement("style");
-        // Needed by WebKit
-        style.appendChild(document.createTextNode(content));
-        style.id = name;
-        document.head.appendChild(style);
-        sheet = style.sheet as CSSStyleSheet;
-      } else {
-        // We've taken over the stylesheet now,
-        // make it clear by clearing all the rules in it
-        // and making it obvious in the DOM.
-        if (style.tagName.toLowerCase() === "style") {
-          style.innerText = content;
-        }
-        if (!style.sheet) {
-          throw Error("taler-presence-stylesheet should be a style sheet 
(<link> or <style>)");
-        }
-        sheet = style.sheet as CSSStyleSheet;
-        while (sheet.cssRules.length > 0) {
-          sheet.deleteRule(0);
-        }
-      }
-    }
-
-    function onPageLoad() {
-      pageLoaded = true;
-      if (document.readyState == "complete") {
-        initStyle();
-      } else {
-        let listener = () => {
-          initStyle();
-          setStyles();
-        };
-        window.addEventListener("load", listener);
-      }
-
-      // We only start the timeout after the page is interactive.
-      window.setInterval(onProbeTimeout, 300);
-
-      announce();
-    }
- 
-    probeTaler();
-    document.addEventListener("taler-probe-result", handleProbe, false);
-    document.addEventListener("taler-uninstall", handleUninstall, false);
-    // Handle the case where the JavaScript is loaded after the page
-    // has been loaded for the first time.
-    if (document.readyState == "loading") {
-      document.addEventListener("DOMContentLoaded", onPageLoad, false);
-    } else {
-      onPageLoad();
-    }
-  }
-
-  function onPageLoadInExtension() {
-    if (document.documentElement.getAttribute("data-taler-nojs")) {
-      logVerbose && console.log("doing taler initialization from extension 
(nojs)");
-      initTaler();
-    }
-  }
-
-  let caught = false;
-  try {
-    (chrome as any).runtime.sendMessage({type: "ping"});
-  } catch (e) {
-    caught = true;
-  }
-
-  if (caught) {
-    logVerbose && console.log("running taler-wallet-lib from page");
-    initTaler();
-  } else {
-    logVerbose && console.log("running taler-wallet-lib from extension");
-    runningInExtension = true;
-    // Wait for even style sheets to load
-    if (document.readyState != "complete") {
-      window.addEventListener("load", () => onPageLoadInExtension());
-    } else {
-      onPageLoadInExtension();
-    }
-  }
-}
-// @license-end
diff --git a/talermerchantdemos/blog/static/web-common/tsconfig.json 
b/talermerchantdemos/blog/static/web-common/tsconfig.json
deleted file mode 100644
index 7d51196..0000000
--- a/talermerchantdemos/blog/static/web-common/tsconfig.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "compilerOptions": {
-    "target": "es3",
-    "jsx": "react",
-    "module": "umd",
-    "experimentalDecorators": true,
-    "noImplicitReturns": true,
-    "noFallthroughCasesInSwitch": true,
-    "strictNullChecks": true,
-    "noImplicitAny": true,
-    "lib": ["ES6", "DOM"]
-  },
-  "files": [
-    "taler-wallet-lib.ts",
-    "chrome-any.d.ts"
-  ]
-}
diff --git a/talermerchantdemos/blog/templates/base.html 
b/talermerchantdemos/blog/templates/base.html
index 52e97b7..4507d9e 100644
--- a/talermerchantdemos/blog/templates/base.html
+++ b/talermerchantdemos/blog/templates/base.html
@@ -21,9 +21,9 @@
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   {% block meta %}{% endblock %}
   <title>Taler Essay Shop Demo</title>
-  <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='web-common/pure.css') }}" />
-  <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='web-common/demo.css') }}" />
-  <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='web-common/taler-fallback.css') }}" id="taler-presence-stylesheet" />
+  <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='pure.css') }}" />
+  <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='demo.css') }}" />
+  <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='taler-fallback.css') }}" id="taler-presence-stylesheet" />
   <style>
     .warn {
       background-color: #aa393977;
diff --git a/talermerchantdemos/donations/__init__.py 
b/talermerchantdemos/donations/__init__.py
new file mode 100644
index 0000000..c977bd0
--- /dev/null
+++ b/talermerchantdemos/donations/__init__.py
@@ -0,0 +1,3 @@
+from talermerchantdemos.donations.donations import app
+
+__all__ = ["app"]
diff --git a/talermerchantdemos/donations/donations.py 
b/talermerchantdemos/donations/donations.py
new file mode 100644
index 0000000..c6c03e5
--- /dev/null
+++ b/talermerchantdemos/donations/donations.py
@@ -0,0 +1,314 @@
+##
+# This file is part of GNU TALER.
+# Copyright (C) 2014-2016 INRIA
+#
+# TALER is free software; you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free 
Software
+# Foundation; either version 2.1, or (at your option) any later version.
+#
+# TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more 
details.
+#
+# You should have received a copy of the GNU Lesser General Public License 
along with
+# GNU TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+#
+# @author Florian Dold
+# @author Marcello Stanisci
+# @brief Implementation of a donations site.
+
+import base64
+import flask
+import logging
+import lxml.etree
+import os
+import qrcode
+import qrcode.image.svg
+import random
+import requests
+import time
+import traceback
+import urllib
+import uuid
+from taler.util.talerconfig import TalerConfig
+from urllib.parse import urljoin, parse_qsl
+
+LOGGER = logging.getLogger(__name__)
+
+BASE_DIR = os.path.dirname(os.path.abspath(__file__))
+
+app = flask.Flask(__name__, template_folder=BASE_DIR)
+app.debug = True
+app.secret_key = base64.b64encode(os.urandom(64)).decode('utf-8')
+
+TC = TalerConfig.from_env()
+BACKEND_BASE_URL = TC["frontends"]["backend"].value_string(required=True)
+CURRENCY = TC["taler"]["currency"].value_string(required=True)
+APIKEY = TC["frontends"]["backend_apikey"].value_string(required=True)
+
+app.config.from_object(__name__)
+
+
+##
+# Extend the templating language with a function
+# that fetches values from the environment.
+#
+# @return the environment-reading function.
+@app.context_processor
+def utility_processor():
+    def env(name, default=None):
+        return os.environ.get(name, default)
+
+    return dict(env=env)
+
+
+##
+# Return a error response to the client.
+#
+# @param abort_status_code status code to return along the response.
+# @param params _kw_ arguments to passed verbatim to the templating engine.
+def err_abort(abort_status_code, **params):
+    t = flask.render_template("templates/error.html", **params)
+    flask.abort(flask.make_response(t, abort_status_code))
+
+
+##
+# Issue a GET request to the backend.
+#
+# @param endpoint the backend endpoint where to issue the request.
+# @param params (dict type of) URL parameters to append to the request.
+# @return the JSON response from the backend, or a error response
+#         if something unexpected happens.
+def backend_instanced_get(instance, endpoint, params):
+    backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/")
+    headers = {"Authorization": "ApiKey " + APIKEY}
+    try:
+        resp = requests.get(
+            urljoin(backend_url, endpoint), params=params, headers=headers
+        )
+    except requests.ConnectionError:
+        err_abort(500, message="Could not establish connection to backend")
+    try:
+        response_json = resp.json()
+    except ValueError:
+        err_abort(500, message="Could not parse response from backend")
+    if resp.status_code != 200:
+        err_abort(
+            500,
+            message="Backend returned error status",
+            json=response_json,
+            status_code=resp.status_code
+        )
+    return response_json
+
+
+##
+# POST a request to the backend, and return a error
+# response if any error occurs.
+#
+# @param endpoint the backend endpoint where to POST
+#        this request.
+# @param json the POST's body.
+# @return the backend response (JSON format).
+def backend_instanced_post(instance, endpoint, json):
+    backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/")
+    headers = {"Authorization": "ApiKey " + APIKEY}
+    try:
+        resp = requests.post(
+            urljoin(backend_url, endpoint), json=json, headers=headers
+        )
+    except requests.ConnectionError:
+        err_abort(500, message=f"Could not establish connection to backend 
(url={url})")
+    try:
+        response_json = resp.json()
+    except ValueError:
+        err_abort(
+            500,
+            message="Could not parse response from backend",
+            status_code=resp.status_code
+        )
+    if resp.status_code != 200:
+        err_abort(
+            500,
+            message="Backend returned error status",
+            json=response_json,
+            status_code=resp.status_code
+        )
+    return response_json
+
+
+##
+# Inspect GET arguments in the look for a parameter.
+#
+# @param name the parameter name to lookup.
+# @return the parameter value, or a error page if not found.
+def expect_parameter(name):
+    val = flask.request.args.get(name)
+    if not val:
+        return err_abort(400, message="parameter '{}' required".format(name))
+    return val
+
+
+##
+# "Fallback" exception handler to capture all the unmanaged errors.
+#
+# @param e the Exception object, currently unused.
+# @return flask-native response object carrying the error message
+#         (and execution stack!).
+@app.errorhandler(Exception)
+def internal_error(e):
+    return flask.render_template(
+        "templates/error.html",
+        message="Internal error",
+        stack=traceback.format_exc()
+    )
+
+
+##
+# Serve the main index page.
+#
+# @return response object of the index page.
+@app.route("/")
+def index():
+    return flask.render_template(
+        "templates/index.html", merchant_currency=CURRENCY
+    )
+
+
+##
+# Serve the "/javascript" page.
+#
+# @return response object for the /javascript page.
+@app.route("/javascript")
+def javascript_licensing():
+    return flask.render_template("templates/javascript.html")
+
+
+##
+# Serve the "/checkout" page.  This page lets the
+# user pick the payment method they want to use,
+# and finally confirm the donation.
+#
+# @return response object for the /checkout page.
+@app.route("/checkout", methods=["GET"])
+def checkout():
+    amount = expect_parameter("donation_amount")
+    donation_receiver = expect_parameter("donation_receiver")
+    donation_donor = expect_parameter("donation_donor")
+    return flask.render_template(
+        "templates/checkout.html",
+        donation_amount=amount,
+        donation_receiver=donation_receiver,
+        donation_donor=donation_donor,
+        merchant_currency=CURRENCY
+    )
+
+
+##
+# Serve the page advising the user about the impossibility
+# of further processing the payment method they chose.
+#
+# @return response object about the mentioned impossibility.
+@app.route("/provider-not-supported")
+def provider_not_supported():
+    return flask.render_template("templates/provider-not-supported.html")
+
+
+##
+# POST the donation request to the backend.  In particular,
+# it uses the "POST /order" API.
+#
+# @return response object that will redirect the browser to
+#         the fulfillment URL, where all the pay-logic will
+#         happen.
+@app.route("/donate")
+def donate():
+    donation_receiver = expect_parameter("donation_receiver")
+    donation_amount = expect_parameter("donation_amount")
+    donation_donor = expect_parameter("donation_donor")
+    payment_system = expect_parameter("payment_system")
+    if payment_system != "taler":
+        return flask.redirect(flask.url_for("provider_not_supported"))
+    fulfillment_url = flask.url_for(
+        "fulfillment",
+        timestamp=str(time.time()),
+        receiver=donation_receiver,
+        _external=True
+    )
+    order = dict(
+        amount=donation_amount,
+        extra=dict(
+            donor=donation_donor,
+            receiver=donation_receiver,
+            amount=donation_amount
+        ),
+        fulfillment_url=fulfillment_url,
+        summary="Donation to {}".format(donation_receiver),
+    )
+    order_resp = backend_instanced_post(donation_receiver, "order", 
dict(order=order))
+    order_id = order_resp["order_id"]
+    return flask.redirect(
+        flask.url_for(
+            "fulfillment", receiver=donation_receiver, order_id=order_id
+        )
+    )
+
+
+##
+# This endpoint is used by the payment request page
+# to check if the payment has been completed via the QR code.
+@app.route("/check-status/<instance>/<order_id>")
+def check_status(instance, order_id):
+    pay_params = dict(order_id=order_id)
+    pay_status = backend_instanced_get(instance, "check-payment", pay_params)
+    return flask.jsonify(paid=pay_status["paid"])
+
+
+def get_qrcode_svg(data):
+    factory = qrcode.image.svg.SvgImage
+    img = qrcode.make(data, image_factory=factory)
+    return lxml.etree.tostring(img.get_image()).decode("utf-8")
+
+
+##
+# Serve the fulfillment page.
+#
+# @param receiver the donation receiver name, that should
+#        correspond to a merchant instance.
+# @return after the wallet sent the payment, the final HTML "congrats"
+#         page is returned; otherwise, the browser will be redirected
+#         to a page that accepts the payment.
+@app.route("/donation/<receiver>")
+def fulfillment(receiver):
+    order_id = expect_parameter("order_id")
+    pay_params = dict(order_id=order_id)
+    pay_status = backend_instanced_get(receiver, "check-payment", pay_params)
+
+    if pay_status.get("paid"):
+        extra = pay_status["contract_terms"]["extra"]
+        return flask.render_template(
+            "templates/fulfillment.html",
+            donation_receiver=extra["receiver"],
+            donation_amount=extra["amount"],
+            donation_donor=extra["donor"],
+            order_id=order_id,
+            currency=CURRENCY
+        )
+    else:
+        taler_pay_uri = pay_status["taler_pay_uri"]
+        qrcode_svg = get_qrcode_svg(taler_pay_uri)
+        check_status_url_enc = urllib.parse.quote(
+            flask.url_for("check_status", instance=receiver, order_id=order_id)
+        )
+        content = flask.render_template(
+            "templates/request_payment.html",
+            taler_pay_uri=taler_pay_uri,
+            qrcode_svg=qrcode_svg,
+            check_status_url_enc=check_status_url_enc
+        )
+        headers = {"Taler": taler_pay_uri}
+        resp = flask.Response(content, status=402, headers=headers)
+        return resp
+
+    # no pay_redirect but article not paid, this should never happen!
+    err_abort(500, message="Internal error, invariant failed", json=pay_status)
diff --git a/talermerchantdemos/blog/static/web-common/demo.css 
b/talermerchantdemos/donations/static/demo.css
similarity index 100%
rename from talermerchantdemos/blog/static/web-common/demo.css
rename to talermerchantdemos/donations/static/demo.css
diff --git a/talermerchantdemos/blog/static/web-common/pure.css 
b/talermerchantdemos/donations/static/pure.css
similarity index 100%
rename from talermerchantdemos/blog/static/web-common/pure.css
rename to talermerchantdemos/donations/static/pure.css
diff --git a/talermerchantdemos/blog/static/web-common/taler-fallback.css 
b/talermerchantdemos/donations/static/taler-fallback.css
similarity index 100%
rename from talermerchantdemos/blog/static/web-common/taler-fallback.css
rename to talermerchantdemos/donations/static/taler-fallback.css
diff --git a/talermerchantdemos/blog/templates/base.html 
b/talermerchantdemos/donations/templates/base.html
similarity index 64%
copy from talermerchantdemos/blog/templates/base.html
copy to talermerchantdemos/donations/templates/base.html
index 52e97b7..86f81a9 100644
--- a/talermerchantdemos/blog/templates/base.html
+++ b/talermerchantdemos/donations/templates/base.html
@@ -17,46 +17,19 @@
 
 <html data-taler-nojs="true">
 <head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  {% block meta %}{% endblock %}
-  <title>Taler Essay Shop Demo</title>
+  <title>Taler Donation Demo</title>
   <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='web-common/pure.css') }}" />
   <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='web-common/demo.css') }}" />
   <link rel="stylesheet" type="text/css" href="{{ url_for('static', 
filename='web-common/taler-fallback.css') }}" id="taler-presence-stylesheet" />
-  <style>
-    .warn {
-      background-color: #aa393977;
-      padding: 1em;
-    }
-    .notice {
-      border-radius: 1em;
-      background: #0333;
-      border-left: 0.3em solid #033;
-      padding-left: 1em;
-      padding-top: 0.5em;
-      padding-bottom: 0.5em;
-      margin-top: 2em;
-      margin-bottom: 2em;
-    }
-    #main a:link, #main a:visited, #main a:hover, #main a:active {
-        color: black;
-    }
-  </style>
   {% block styles %}{% endblock %}
   {% block scripts %}{% endblock %}
 </head>
 
 <body>
-  <div class="demobar" style="display: flex; flex-direction: column;">
+  <div class="demobar">
     <h1><span class="tt adorn-brackets">Taler Demo</span></h1>
-    <h1><span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_BLOG') 
}}">Shop</a></span></h1>
-    <p>On this page you can buy articles using an imaginary currency (for now).
-       The articles are chapters from Richard Stallman's book &quot;Free 
Software, Free Society&quot;,
-       which is also
-      <a 
href="http://shop.fsf.org/product/free-software-free-society-2/";>published by 
the FSF</a>
-      and available gratis at <a href="http://www.gnu.org/";>gnu.org</a>.
-    </p>
+    <h1><span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_DONATIONS') 
}}">Donations</a></span></h1>
+    <p>This is the donation page, you can make donations (with an imaginary 
currency for now) to free software projects.</p>
     <ul>
       <li><a href="{{ env('TALER_ENV_URL_INTRO', '#') }}">Introduction</a></li>
       <li><a href="{{ env('TALER_ENV_URL_BANK', '#') }}">Bank</a></li>
@@ -66,8 +39,6 @@
       <li><a href="{{ env('TALER_ENV_URL_BACKOFFICE', '#') 
}}">Back-office</a></li>
     </ul>
     <p>You can learn more about Taler on our main <a 
href="https://taler.net";>website</a>.</p>
-    <div style="flex-grow:1"></div>
-    <p>Copyright &copy; 2014&mdash;2018 Inria</p>
   </div>
 
   <section id="main" class="content">
@@ -75,6 +46,10 @@
       This is the main content of the page.
     {% endblock %}
     <hr />
+    <div class="copyright">
+      <p>Copyright &copy; 2014&mdash;2017 INRIA</p>
+      <a href="/javascript" data-jslicense="1" 
class="jslicenseinfo">JavaScript license information</a>
+    </div>
   </section>
 </body>
 </html>
diff --git a/talermerchantdemos/donations/templates/checkout.html 
b/talermerchantdemos/donations/templates/checkout.html
new file mode 100644
index 0000000..5c3e116
--- /dev/null
+++ b/talermerchantdemos/donations/templates/checkout.html
@@ -0,0 +1,59 @@
+{% extends "templates/base.html" %}
+
+{% block main %}
+<article>
+  <h1>Select your payment method</h1>
+
+  <p>
+    This is an example for a "checkout" page of a Web shop.
+    On the previous page, you have created the shopping cart
+    and decided which product to buy (i.e. which project to
+    donate KUDOS to).  Now in this page, you are asked to
+    select a payment option.  As Taler is not yet universally
+    used, we expect merchants will offer various payment options.
+  </p>
+  <p>
+    The page also demonstrates how to only enable (or show) the Taler
+    option if Taler is actually supported by the browser.  For example,
+    if you disable the Taler extension now, the Taler payment option
+    will be disabled in the page.  Naturally, you could also trivially
+    hide the Taler option entirely by changing the visibility instead.
+  </p>
+  <p>
+    Note that you MUST select Taler here for the demo to continue,
+    as the other payment options are just placeholders and not
+    really working in the demonstration.  Also, it is of course
+    possible to ask the user to make this choice already on the
+    previous page (with the shopping cart), we just separated the
+    two steps to keep each step as simple as possible.
+  </p>
+  
+  <form name="tform" action="{{ url_for('donate') }}" method="get">
+    <div id="opt-form" align="left"><br>
+      <input type="hidden" name="donation_receiver" value="{{ 
donation_receiver }}">
+      <input type="hidden" name="donation_amount" value="{{ donation_amount 
}}">
+      <input type="hidden" name="donation_donor" value="{{ donation_donor }}">
+
+      <input type="radio" name="payment_system" value="lisa" id="radio-lisa">
+      <label for="radio-lisa">Lisa</input>
+      <br/>
+
+      <input type="radio" name="payment_system" value="ycard" id="radio-ycard">
+      <label for="radio-ycard">You Card</label>
+      <br/>
+
+      <input type="radio" name="payment_system" value="cardme" 
id="radio-cardme">
+      <label for="radio-cardme">Card Me</label>
+      <br/>
+
+      <input type="radio" name="payment_system" value="taler" checked 
id="radio-taler">
+      <label for=radio-taler">Taler</label>
+      <br/>
+
+      <input id="select-payment-method" type="submit" value="Ok"></input>
+    </div>
+  </form>
+
+</article>
+
+{% endblock main %}
diff --git a/talermerchantdemos/blog/templates/error.html 
b/talermerchantdemos/donations/templates/error.html
similarity index 100%
copy from talermerchantdemos/blog/templates/error.html
copy to talermerchantdemos/donations/templates/error.html
diff --git a/talermerchantdemos/donations/templates/fulfillment.html 
b/talermerchantdemos/donations/templates/fulfillment.html
new file mode 100644
index 0000000..17d8cd8
--- /dev/null
+++ b/talermerchantdemos/donations/templates/fulfillment.html
@@ -0,0 +1,11 @@
+{% extends "templates/base.html" %}
+
+{% block main %}
+<h1>Donation Receipt</h1>
+<p> Thank you, <strong>{{ donation_donor }}</strong>, for donating <strong>{{ 
donation_amount }}</strong> to <strong>{{ donation_receiver }}</strong>.</p>
+
+<p>Please keep the order identifier <strong>{{ order_id }}</strong> as a 
receipt for your donation.  You can show other people that you donated
+by sharing <a href={{ request.url }}>this link</a> with them.</p>
+
+<p>You can always make <a href="{{ url_for('index') }}">another 
donation</a></p>
+{% endblock main %}
diff --git a/talermerchantdemos/donations/templates/index.html 
b/talermerchantdemos/donations/templates/index.html
new file mode 100644
index 0000000..cbb3c35
--- /dev/null
+++ b/talermerchantdemos/donations/templates/index.html
@@ -0,0 +1,42 @@
+{% extends "templates/base.html" %}
+
+{% block main %}
+<h1 lang="en">Welcome to the Taler Donation "Shop" Demo</h1>
+
+<p>This toy donations website shows the user experience for donations with 
Taler.
+You are paying with an imaginary currency ({{ merchant_currency }}).
+</p>
+
+<div>
+  <p>Please select a project, the amount (*) of {{ merchant_currency }} you
+    wish to donate, and enter the name that will appear on your receipt:</p>
+
+  <form name="tform" action="checkout" method="GET" class="pure-form">
+    <div class="participation" id="fake-shop">
+      <select name="donation_receiver">
+        <option value="GNUnet">GNUnet</option>
+        <option value="Taler">GNU Taler</option>
+        <option value="Tor">Tor</option>
+      </select>
+      <select id="taler-donation" name="donation_amount">
+        <option value="{{ merchant_currency }}:0.1">0.1 {{ merchant_currency 
}}</option>
+        <option value="{{ merchant_currency }}:1">1 {{ merchant_currency 
}}</option>
+        <option value="{{ merchant_currency }}:6">5 {{ merchant_currency 
}}</option>
+        <option value="{{ merchant_currency }}:10">10 {{ merchant_currency 
}}</option>
+      </select>
+      <input type="text" name="donation_donor" value="Anonymous Donor" />
+      <input type="submit" class="pure-button pure-button-primary" 
value="Donate!" />
+    </div>
+  </form>
+  <p>
+    (*) To make it a bit more fun, the 5 {{ merchant_currency }} option is
+    deliberately implemented with a fault: the merchant will try to make you
+    donate 6 {{ merchant_currency }} instead of the 5 {{ merchant_currency }} 
you
+    got to see.  But do not worry, you will be given the opportunity to review
+    the final offer from the merchant in a window secured by the Taler
+    extension.  That way, you can spot the error before committing to an
+    incorrect contract.
+  </p>
+</div>
+
+{% endblock %}
diff --git a/talermerchantdemos/blog/templates/javascript.html 
b/talermerchantdemos/donations/templates/javascript.html
similarity index 100%
copy from talermerchantdemos/blog/templates/javascript.html
copy to talermerchantdemos/donations/templates/javascript.html
diff --git a/talermerchantdemos/donations/templates/provider-not-supported.html 
b/talermerchantdemos/donations/templates/provider-not-supported.html
new file mode 100644
index 0000000..88f2000
--- /dev/null
+++ b/talermerchantdemos/donations/templates/provider-not-supported.html
@@ -0,0 +1,6 @@
+{% extends "templates/base.html" %}
+
+{% block main %}
+<h1>Payment Provider Not Supported</h1>
+<p>Unfortunately the selected payment provider is not supported in this demo. 
Please go back and select "Taler".</p>
+{% endblock main %}
diff --git a/talermerchantdemos/blog/templates/request_payment.html 
b/talermerchantdemos/donations/templates/request_payment.html
similarity index 100%
copy from talermerchantdemos/blog/templates/request_payment.html
copy to talermerchantdemos/donations/templates/request_payment.html

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]