invoices
authorkilian (ksmachome) <ksaffran@dks.lu>
Mon, 25 Nov 2019 06:35:12 +0000 (07:35 +0100)
committerkilian (ksmachome) <ksaffran@dks.lu>
Mon, 25 Nov 2019 06:35:12 +0000 (07:35 +0100)
15 files changed:
CGI/tmpl/app/creorga/index.tt
CGI/tmpl/app/invoicejournal/index.tt
CGI/tmpl/app/invoicejournal/module/invoicejournal/index.js
CGI/tmpl/app/invoicejournal/module/invoicejournal/index.tt
CGI/tmpl/app/invoicejournal/module/invoicejournal/print/examples.js [new file with mode: 0644]
bin/dksnas.pl
bin/imgtob64.pl [new file with mode: 0644]
htdocs/img/dks_1000.png.b64 [new file with mode: 0644]
htdocs/js/admin.js
htdocs/js/database.js [deleted file]
htdocs/js/formsave.js
htdocs/js/mainapp.js [deleted file]
htdocs/js/moduleglobal.js
htdocs/js/request.js
htdocs/js/webdatabase.js [deleted file]

index 271f190..d15d27e 100644 (file)
@@ -8,7 +8,7 @@
     <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />\r
   <meta http-equiv="Pragma" content="no-cache" />\r
   <meta http-equiv="Expires" content="0" />\r
-    <link rel="icon" href="../img/favicon/creorga.png">\r
+    <!--<link rel="icon" href="../img/favicon/creorga.png">-->\r
 \r
     <title>Creorga </title>\r
 \r
index 2e22f47..5b92a2c 100644 (file)
@@ -13,7 +13,7 @@
 
 <body>
     <div class="w3-bar w3-top w3-theme-light w3-large" style="z-index:4">
-        <button class="w3-bar-item w3-button w3-hide-large w3-hover-none w3-hover-text-light-grey" onclick="w3_open();"><img src="[% abspath %][% staticpath %]img/icons/menu_white.svg" style="height: 33px;"/></button>
+        <button class="w3-bar-item w3-button w3-hide-large w3-hover-none w3-hover-text-light-grey" onclick="w3_open();" id="btnsidemenu"><img src="[% abspath %][% staticpath %]img/icons/menu.svg" style="height: 33px;"/></button>
         <span class="w3-bar-item">Invoice Journal</span>
         <span class="w3-bar-item w3-right" id="modulename"></span>
     </div>
index bfd383e..bd13d79 100644 (file)
@@ -1,18 +1,19 @@
 var tbl = null;
 var tblproducts = null;
 var tblfiles = null;
+var currentinvoice = null;
 var statustypes = [{ "value": "planned", "label": "geplant" },
     { "value": "sended", "label": "verschickt" },
     { "value": "received", "label": "erhalten" },
     { "value": "payed", "label": "bezahlt" },
     { "value": "overdue", "label": "überfällig" }
 ];
-
+var currenttemplate = { "base": null, "elements": null };
 var statuslang = { "planned": "geplant", "payed": "bezahlt", "received": "erhalten", "overdue": "überfällig", "sended": "verschickt" };
 var quarters = [{ "value": "Q1", "label": "Q1" }, { "value": "Q2", "label": "Q2" }, { "value": "Q3", "label": "Q3" }, { "value": "Q4", "label": "Q4" }];
 var invoicetypes = [{ "value": "inv-out", "label": "Ausgangs-Rechnung" }, { "value": "inv-in", "label": "Eingangs-Rechnung" }, { "value": "crn-out", "label": "Ausgangs-Gutschrift" }, { "value": "crn-in", "label": "Eingangs-Gutschrift" }];
 
-var templates = [{ "value": "dks-deutsch", "label": "DKS - Deutsch" }, { "value": "dks-french", "label": "DKS  Französisch" }, { "value": "dks-english", "label": "DKS - english" }];
+// var templates = [{ "value": "dks-deutsch", "label": "DKS - Deutsch" }, { "value": "dks-french", "label": "DKS  Französisch" }, { "value": "dks-english", "label": "DKS - english" }];
 
 var choice = {
     "invoices": {
@@ -22,7 +23,7 @@ var choice = {
         "bquarter": null,
         "byear": null,
         "invoicetype": null,
-        "template": null
+        "id_template": null
     }
 };
 
@@ -34,13 +35,13 @@ var choicedata = {
         "bquarter": { "view": "quarters" },
         "byear": { "view": "businessyears" },
         "invoicetype": { "data": invoicetypes },
-        "template": { "data": templates }
+        "id_template": { "view": "templates" }
     }
 };
 
 function initpage() {
-    console.log(mpref.cfg);
-    console.log("APP:" + parent.app);
+    //console.log(mpref.cfg);
+    //console.log("APP:" + parent.app);
     flatpickr(".datefield", {
         altInput: true,
         altFormat: "d.m.Y",
@@ -168,14 +169,14 @@ function inittblfiles() {
 function gettblfilesdata() {
     var udata = tbl.getSelectedData();
     if (udata[0]) {
-        console.log(udata[0]);
+        //console.log(udata[0]);
         req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "fileslist", "filter": "id_invoice=" + udata[0].id }, loadtblfilesdata);
     }
     return false;
 }
 
 function loadtblfilesdata(data) {
-    console.log(data);
+    //console.log(data);
     if (data && data.sqldata) {
         tblfiles.setData(data.sqldata);
     }
@@ -266,14 +267,14 @@ function inittblbookings() {
 function gettblbookingdata() {
     var udata = tbl.getSelectedData();
     if (udata[0]) {
-        console.log(udata[0]);
+        //console.log(udata[0]);
         req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "bookings", "filter": "id_invoice=" + udata[0].id }, loadtblbookingdata);
     }
     return false;
 }
 
 function loadtblbookingdata(data) {
-    console.log(data);
+    //console.log(data);
     if (data && data.sqldata) {
         tblproducts.setData(data.sqldata);
     }
@@ -287,7 +288,7 @@ function gettbldata() {
 }
 
 function loadtbldata(data) {
-    console.log(data);
+    //console.log(data);
     if (data && data.sqldata) {
         tbl.setData(data.sqldata);
     }
@@ -298,8 +299,9 @@ function edit() {
     var udata = tbl.getSelectedData();
     //cleanform("invoices");
     if (udata[0]) {
-        console.log(udata[0]);
-        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoicelist", "filter": "id=" + udata[0].id }, fillinvoice);
+        currentinvoice = udata[0];
+        //console.log(udata[0]);
+        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoices", "filter": "id=" + udata[0].id }, fillinvoice);
         viewinvoicepanel();
     }
     return false;
@@ -309,6 +311,11 @@ function fillinvoice(data) {
     if (data && data.sqldata) {
         //console.log(data);
         fillformbydataclass("invoices", data.sqldata[0], false);
+        //console.log(data.sqldata[0].invoicetype);
+        currentinvoice = data.sqldata[0];
+        if (data.sqldata[0].invoicetype == "inv-out") {
+            document.getElementById("netamount").readonly = true;
+        }
         gettblbookingdata();
     }
     return false;
@@ -329,7 +336,14 @@ function remove() {
 function viewinvoicepanel() {
     document.getElementById('tbl_invoices').style.display = 'none';
     document.getElementById('pnl_invoices').style.display = 'block';
-
+    var x = document.getElementsByClassName("invlist");
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "none";
+    }
+    x = document.getElementsByClassName("invdata");
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "block";
+    }
     return false;
 }
 
@@ -337,6 +351,14 @@ function viewtable() {
     gettbldata();
     document.getElementById('pnl_invoices').style.display = 'none';
     document.getElementById('tbl_invoices').style.display = 'block';
+    var x = document.getElementsByClassName("invlist");
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "block";
+    }
+    x = document.getElementsByClassName("invdata");
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "none";
+    }
     return false;
 }
 
@@ -369,7 +391,7 @@ function fillchoices() {
                 shouldSort: false
             });
             if (choicedata[f][c]['view']) {
-                console.log("We have a view:" + choicedata[f][c]['view']);
+                //console.log("We have a view:" + choicedata[f][c]['view']);
                 getchoicedata(choicedata[f][c]['view']);
             }
         }
@@ -384,23 +406,64 @@ function loadtab(tabname) {
         x[i].style.display = "none";
     }
     document.getElementById("tab_" + tabname).style.display = "block";
+    x = document.getElementsByClassName("tabbtn");
+
+    for (i = 0; i < x.length; i++) {
+        //console.log(x[i].classList);
+        x[i].classList.remove("w3-blue-grey");
+    }
+    document.getElementById("tabbtn_" + tabname).classList.add("w3-blue-grey");
+    x = document.getElementsByClassName("tabxbtn");
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "none";
+    }
+    x = document.getElementsByClassName("tabbtn" + tabname);
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "block";
+    }
     return false;
 }
 
+
+
 function geninvoice() {
+    req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templates", "filter": "id=" + document.getElementById("id_template").value }, gettemplateelements);
+    return false;
+}
+
+function gettemplateelements(data) {
+    if (data && data.sqldata) {
+        currenttemplate["base"] = data.sqldata[0];
+        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templateelements", "filter": "id_template=" + document.getElementById("id_template").value }, makepdf);
+    }
+
+}
+
+function makepdf(data) {
+    if (data && data.sqldata) {
+        currenttemplate["elements"] = data.sqldata;
+    }
+    console.log(currenttemplate);
     tblproducts.download("pdf", document.getElementById("reference").value + ".pdf", {
-        orientation: "portrait",
+        orientation: currenttemplate.base.orientation,
 
         jsPDF: {
-            unit: "mm",
+            unit: currenttemplate.base.unit,
         },
         autoTable(doc) {
-            doc.setFontSize(10);
-            doc.text("DKS s.à r.l.", 160, 10);
-            doc.text("8b, rue du Moulin", 160, 15);
-            doc.text("L-6914 Roodt/Syre", 160, 20);
-            doc.setFontSize(20);
-            doc.text("Invoice", 160, 70);
+            for (var i in currenttemplate.elements) {
+                var cel = currenttemplate.elements[i];
+                if (cel['etype'] == 'text') {
+                    setpdftext(doc, cel);
+                }
+                if (cel['etype'] == 'image') {
+                    setpdfimage(doc, cel);
+                }
+            }
+
+            // doc.text("DKS s.à r.l.\n8b, rue du Moulin\nL-6914 Roodt/Syre\n\nTel: +352 691504574\ninfo@dks.lu / www.dks.lu", 160, 10);
+            // doc.setFontSize(20);
+            // doc.text("Rechnung", 160, 70);
 
             // styles: {
             //     fillColor: [100, 255, 255]
@@ -409,7 +472,12 @@ function geninvoice() {
             //     id: {fillColor: 255}
             // },
             return {
-                margin: { top: 130, bottom: 10, left: 15, right: 10 },
+                margin: {
+                    top: parseInt(currenttemplate.base.top),
+                    bottom: parseInt(currenttemplate.base.bottom),
+                    left: parseInt(currenttemplate.base.left),
+                    right: parseInt(currenttemplate.base.right)
+                },
             }
 
         },
@@ -417,4 +485,38 @@ function geninvoice() {
             //carry out an action on the doc object
         }
     });
+}
+
+function setpdftext(pdf, el) {
+    if (el['fontsize']) {
+        pdf.setFontSize(el['fontsize']);
+    }
+    const regex = /%%([\w]+)%%/gm;
+    var etext = el['edata'];
+    var m;
+    while ((m = regex.exec(etext)) !== null) {
+        // This is necessary to avoid infinite loops with zero-width matches
+        if (m.index === regex.lastIndex) {
+            regex.lastIndex++;
+        }
+
+        // The result can be accessed through the `m`-variable.
+        m.forEach((match, groupIndex) => {
+            //etext.replace('')
+            if (groupIndex == 1) {
+                if (document.getElementById(match)) {
+                    etext.replace('%%' + match + '%%', currentinvoice[match]);
+                }
+
+            }
+            //console.log(`Found match, group ${groupIndex}: ${match}`);
+        });
+
+    }
+    etext.replace(regex, '');
+    pdf.text(etext, el['xpos'], el['ypos']);
+}
+
+function setpdfimage(pdf,el){
+    
 }
\ No newline at end of file
index e01fe65..02a7625 100644 (file)
@@ -3,26 +3,33 @@
     <div class="w3-bar">
         <button class="w3-bar-item w3-button w3-border w3-blue-grey" onclick="viewtable();"><img src="[% abspath%][% staticpath %]img/icons/list_white.svg" style="height: 24px;"/> Journal</button>
 
-        <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="geninvoice();"><img src="[% abspath%][% staticpath %]img/icons/Adobe_Acrobat.svg" style="height: 24px;"/></button>
-        <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="remove();"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
-        <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="edit();"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
-        <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="add();"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
+        <button class="w3-bar-item w3-button w3-border w3-right w3-red invdata" onclick="geninvoice();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/Adobe_Acrobat.svg" style="height: 24px; "/></button>
+        <button class="w3-bar-item w3-button w3-border w3-right w3-red invlist" onclick="remove();"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
+        <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey invlist" onclick="edit();"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
+        <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey invlist" onclick="add();"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
+        <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey invdata" onclick="saveinvoice();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/Save.svg" style="height: 24px;"/></button>
     </div>
 </div>
 <div class="w3-display-container" id="tbl_invoices" style="margin-top: 50px;"></div>
 <div class="w3-display-container" id="pnl_invoices" style="display: none; margin-top: 50px;">
 
-
-    <div class="w3-bar w3-border-top w3-border-bottom">
-        <button class="w3-bar-item w3-button" onclick="loadtab('details');"><img src="[% abspath%][% staticpath %]img/icons/list.svg" style="height: 24px;"/> Allgemein</button>
-        <button class="w3-bar-item w3-button" onclick="loadtab('products')"><img src="[% abspath%][% staticpath %]img/icons/list.svg" style="height: 24px;"/> Produkte</button>
-        <button class="w3-bar-item w3-button" onclick="loadtab('files');"><img src="[% abspath%][% staticpath %]img/icons/list.svg" style="height: 24px;"/> Dateien</button>
-
+    <div class="w3-top" style="margin-top: 43px;">
+        <div class="w3-bar w3-border-top w3-border-bottom tabbar w3-light-grey">
+            <button class="w3-bar-item w3-button tabbtn" id="tabbtn_details" onclick="loadtab('details');"><img src="[% abspath%][% staticpath %]img/icons/Bill.svg" style="height: 24px;"/> Allgemein</button>
+            <button class="w3-bar-item w3-button tabbtn" id="tabbtn_products" onclick="loadtab('products')"><img src="[% abspath%][% staticpath %]img/icons/package.svg" style="height: 24px;"/> Produkte</button>
+            <button class="w3-bar-item w3-button tabbtn" id="tabbtn_files" onclick="loadtab('files');"><img src="[% abspath%][% staticpath %]img/icons/file.svg" style="height: 24px;"/> Dateien</button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-red tabxbtn tabbtnproducts" onclick="removeproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey tabxbtn tabbtnproducts" onclick="editproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey tabxbtn tabbtnproducts" onclick="addproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-red tabxbtn tabbtnfiles" onclick="removefile();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey tabxbtn tabbtnfiles" onclick="addfile();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
+        </div>
     </div>
-    <div class="w3-container tabpanel" id="tab_details">
+    <div class="w3-container tabpanel" id="tab_details" style="margin-top: 100px;">
         [% fieldhidden('id','invoices','ident') %]
+        [% fieldhidden('address','invoices') %]
         <div class="w3-cell-row">
-            [% fieldselectbox('invoicetype','invoices','Typ','w3-half','') %] [% fieldselectbox('template','invoices','Vorlage','w3-half','') %]
+            [% fieldselectbox('invoicetype','invoices','Typ','w3-half','') %] [% fieldselectbox('id_template','invoices','Vorlage','w3-half','') %]
         </div>
         <div class="w3-cell-row">
             [% fieldselectbox('status','invoices','Status','w3-quarter','') %] [% fielddatebox('statusdate','invoices','Status-Datum','w3-quarter','readonly') %] [% fieldeditbox('statement','invoices','Kontoauszug','w3-quarter','') %] [% fieldselectbox('bquarter','invoices','G.Quartal','w3-quarter','')
             [% fielddatebox('invoicedate','invoices','Datum','w3-fifth','') %] [% fielddatebox('deadlinedate','invoices','Fälligkeit','w3-fifth','') %] [% fieldtagbox('reminderdates','invoices','Mahnungs-Daten','w3-threefifth','') %]
         </div>
         <div class="w3-cell-row">
-            [% fieldmoneybox('netamount','invoices','Netto','w3-quarter','') %] [% fieldmoneybox('vatamount','invoices','MwSt','w3-quarter','') %] [% fieldmoneybox('grossamount','invoices','Brutto','w3-quarter','') %] [% fieldmoneybox('payedamount','invoices','Bezahlt','w3-quarter','')
-            %]
+            [% fieldtextarea('headernote','invoices','Vorwort','','','200px','') %]
+        </div>
+        <div class="w3-cell-row">
+            [% fieldtextarea('footernote','invoices','Nachwort','','','200px','') %]
         </div>
     </div>
-    <div class="w3-container tabpanel" id="tab_products" style="display: none;">
+    <div class="w3-container tabpanel" id="tab_products" style="margin-top: 100px;display: none;">
         <div id="tbl_products"></div>
     </div>
-    <div class="w3-container tabpanel" id="tab_files" style="display: none;">
+    <div class="w3-container tabpanel" id="tab_files" style="margin-top: 100px;display: none;">
         <div id="tbl_files"></div>
     </div>
+    <div class="spacerx" style="height: 60px;"></div>
+    <div class="w3-bottom w3-border-bottom w3-light-grey">
+        <div class="w3-bar">
+            [% fieldmoneybox('netamount','invoices','Netto','w3-quarter','') %] [% fieldmoneybox('vatamount','invoices','MwSt','w3-quarter','') %] [% fieldmoneybox('grossamount','invoices','Brutto','w3-quarter','') %] [% fieldmoneybox('payedamount','invoices','Bezahlt','w3-quarter','')
+            %]
+        </div>
+    </div>
 </div>
\ No newline at end of file
diff --git a/CGI/tmpl/app/invoicejournal/module/invoicejournal/print/examples.js b/CGI/tmpl/app/invoicejournal/module/invoicejournal/print/examples.js
new file mode 100644 (file)
index 0000000..552b33c
--- /dev/null
@@ -0,0 +1,469 @@
+/*
+ |--------------------------------------------------------------------------
+ | This file contains examples of how to use this plugin
+ |--------------------------------------------------------------------------
+ |
+ | To see what the documents generated by these examples looks like you can open
+ | ´examples.html´ or go to http://simonbengtsson.github.io/jsPDF-AutoTable.
+ |
+ | To make it possible to view each example in examples.html some extra code
+ | is added to the examples below. For example they return their jspdf
+ | doc instance and gets generated data from the library faker.js. See simple.html
+ | for a minimal example.
+ */
+
+var faker = window.faker;
+
+var examples = {};
+window.examples = examples;
+
+// Basic - shows what a default table looks like
+examples.basic = function () {
+    let doc = new jsPDF();
+
+    // From HTML
+    doc.autoTable({html: '.table'});
+
+    // From Javascript
+    let finalY = doc.previousAutoTable.finalY;
+    doc.text("From javascript arrays", 14, finalY + 15);
+    doc.autoTable({
+        startY: finalY + 20,
+        head: [
+            ['ID', 'Name', 'Email', 'Country', 'IP-address'],
+        ],
+        body: [
+            ['1', 'Donna', 'dmoore0@furl.net', 'China', '211.56.242.221'],
+            ['2', 'Janice', 'jhenry1@theatlantic.com', 'Ukraine', '38.36.7.199'],
+            ['3', 'Ruth', 'rwells2@constantcontact.com', 'Trinidad and Tobago', '19.162.133.184'],
+            ['4', 'Jason', 'jray3@psu.edu', 'Brazil', '10.68.11.42'],
+            ['5', 'Jane', 'jstephens4@go.com', 'United States', '47.32.129.71'],
+            ['6', 'Adam', 'anichols5@com.com', 'Canada', '18.186.38.37']
+        ],
+    });
+
+    finalY = doc.previousAutoTable.finalY;
+    doc.text("From HTML with CSS", 14, finalY + 15);
+    doc.autoTable({
+        startY: finalY + 20,
+        html: '.table',
+        useCss: true,
+    });
+    
+    return doc;
+};
+
+// Minimal - shows how compact tables can be drawn
+examples.minimal = function () {
+    var doc = new jsPDF();
+    doc.autoTable({
+        html: '.table',
+        tableWidth: 'wrap',
+        styles: {cellPadding: 0.5, fontSize: 8}
+    });
+    return doc;
+};
+
+// Long data - shows how the overflow features looks and can be used
+examples.long = function () {
+    var doc = new jsPDF('l');
+    
+    let head = headRows();
+    head[0]['text'] = 'Text';
+    let body = bodyRows(4);
+    body.forEach(function(row) {row['text'] = faker.lorem.sentence(100)});
+    
+    doc.text("Overflow 'ellipsize' with one column with long content", 14, 20);
+    doc.autoTable({
+        head: head,
+        body: body,
+        startY: 25,
+        // Default for all columns
+        styles: {overflow: 'ellipsize', cellWidth: 'wrap'},
+        // Override the default above for the text column
+        columnStyles: {text: {cellWidth: 'auto'}}
+    });
+    doc.text("Overflow 'linebreak' (default) with one column with long content", 14, doc.autoTable.previous.finalY + 10);
+    doc.autoTable({
+        head: head,
+        body: body,
+        startY: doc.previousAutoTable.finalY + 15,
+        rowPageBreak: 'auto',
+        bodyStyles: {valign: 'top'},
+        styles: {cellWidth: 'wrap'},
+        columnStyles: {text: {cellWidth: 'auto'}}
+    });
+
+    return doc;
+};
+
+// Content - shows how tables can be integrated with any other pdf content
+examples.content = function () {
+    var doc = new jsPDF();
+
+    doc.setFontSize(18);
+    doc.text('With content', 14, 22);
+    doc.setFontSize(11);
+    doc.setTextColor(100);
+    
+    // jsPDF 1.4+ uses getWidth, <1.4 uses .width
+    var pageSize = doc.internal.pageSize;
+    var pageWidth = pageSize.width ? pageSize.width : pageSize.getWidth();
+    var text = doc.splitTextToSize(faker.lorem.sentence(45), pageWidth - 35, {});
+    doc.text(text, 14, 30);
+
+    doc.autoTable({
+        head: headRows(),
+        body: bodyRows(40),
+        startY: 50, 
+        showHead: 'firstPage'
+    });
+
+    doc.text(text, 14, doc.autoTable.previous.finalY + 10);
+
+    return doc;
+};
+
+// Multiple - shows how multiple tables can be drawn both horizontally and vertically
+examples.multiple = function () {
+    var doc = new jsPDF();
+    doc.setFontSize(22);
+    doc.text("Multiple tables", 14, 20);
+    doc.setFontSize(12);
+
+    doc.autoTable({startY: 30, head: headRows(), body: bodyRows(25)});
+    
+    let pageNumber = doc.internal.getNumberOfPages();
+
+    doc.autoTable({
+        columns: [
+            {dataKey: 'id', header: 'ID'},
+            {dataKey: 'name', header: 'Name'},
+            {dataKey: 'expenses', header: 'Sum'}
+        ],
+        body: bodyRows(15),
+        startY: 240,
+        showHead: 'firstPage',
+        styles: {overflow: 'hidden'},
+        margin: {right: 107}
+    });
+    
+    doc.setPage(pageNumber);
+
+    doc.autoTable({
+        columns: [
+            {dataKey: 'id', header: 'ID'},
+            {dataKey: 'name', header: 'Name'},
+            {dataKey: 'expenses', header: 'Sum'}
+        ],
+        body: bodyRows(15),
+        startY: 240,
+        showHead: 'firstPage',
+        styles: {overflow: 'hidden'},
+        margin: {left: 107}
+    });
+
+    for (var j = 0; j < 3; j++) {
+        doc.autoTable({
+            head: headRows(), 
+            body: bodyRows(),
+            startY: doc.autoTable.previous.finalY + 10,
+            pageBreak: 'avoid',
+        });
+    }
+
+    return doc;
+};
+
+// Header and footers - shows how header and footers can be drawn
+examples['header-footer'] = function () {
+    var doc = new jsPDF();
+    var totalPagesExp = "{total_pages_count_string}";
+
+    doc.autoTable({
+        head: headRows(),
+        body: bodyRows(40),
+        didDrawPage: function (data) {
+            // Header
+            doc.setFontSize(20);
+            doc.setTextColor(40);
+            doc.setFontStyle('normal');
+            if (base64Img) {
+                doc.addImage(base64Img, 'JPEG', data.settings.margin.left, 15, 10, 10);
+            }
+            doc.text("Report", data.settings.margin.left + 15, 22);
+
+            // Footer
+            var str = "Page " + doc.internal.getNumberOfPages()
+            // Total page number plugin only available in jspdf v1.0+
+            if (typeof doc.putTotalPages === 'function') {
+                str = str + " of " + totalPagesExp;
+            }
+            doc.setFontSize(10);
+
+            // jsPDF 1.4+ uses getWidth, <1.4 uses .width
+            var pageSize = doc.internal.pageSize;
+            var pageHeight = pageSize.height ? pageSize.height : pageSize.getHeight();
+            doc.text(str, data.settings.margin.left, pageHeight - 10);
+        },
+        margin: {top: 30}
+    });
+
+    // Total page number plugin only available in jspdf v1.0+
+    if (typeof doc.putTotalPages === 'function') {
+        doc.putTotalPages(totalPagesExp);
+    }
+
+    return doc;
+};
+
+// Minimal - shows how compact tables can be drawn
+examples.defaults = function () {
+    // Global defaults
+    // (would apply to all documents if more than one were created)
+    jsPDF.autoTableSetDefaults({
+        columnStyles: {id: {fontStyle: 'bold'}},
+        headStyles: {fillColor: 0},
+    });
+
+    var doc = new jsPDF();
+
+    // Document defaults
+    doc.autoTableSetDefaults({
+        headStyles: {fillColor: [155, 89, 182]}, // Purple
+        margin: {top: 25},
+        didDrawPage: function(data) {
+            doc.setFontSize(20);
+            doc.text('Default options', data.settings.margin.left, 20);
+        }
+    });
+
+    doc.autoTable({head: headRows(), body: bodyRows()});
+
+    doc.addPage();
+
+    doc.autoTable({
+        head: headRows(), 
+        body: bodyRows(),
+        // Will override document and global head tyles
+        headStyles: {fillColor: [231, 76, 60]} // Red
+    });
+
+    // Reset defaults
+    doc.autoTableSetDefaults(null);
+    jsPDF.autoTableSetDefaults(null);
+
+    return doc;
+};
+
+// Column styles - shows how tables can be drawn with specific column styles
+examples.colstyles = function () {
+    var doc = new jsPDF();
+    doc.autoTable({
+        head: headRows(), 
+        body: bodyRows(),
+        showHead: false,
+        // Note that the "id" key below is the same as the column's dataKey used for 
+        // the head and body rows. If your data is entered in array form instead you have to 
+        // use the integer index instead i.e. `columnStyles: {5: {fillColor: [41, 128, 185], ...}}`
+        columnStyles: {
+            id: {fillColor: [41, 128, 185], textColor: 255, fontStyle: 'bold'}
+        }
+    });
+    return doc;
+};
+
+
+// Col spans and row spans
+examples.spans = function() {
+    var doc = new jsPDF('p', 'pt');
+    doc.setFontSize(12);
+    doc.setTextColor(0);
+    doc.setFontStyle('bold');
+    doc.text('Rowspan and colspan', 40, 50);
+
+    var raw = bodyRows(40);
+    var body = [];
+
+    for (var i = 0; i < raw.length; i++) {
+        var row = [];
+        for(var key in raw[i]) {
+            row.push(raw[i][key]);
+        }
+        if (i % 5 === 0) {
+            row.unshift({rowSpan: 5, content: i / 5 + 1, styles: {valign: 'middle', halign: 'center'}});
+        }
+        body.push(row)
+    }
+
+    doc.autoTable({
+        startY: 60,
+        head: [[{content: 'People', colSpan: 5, styles: {halign: 'center', fillColor: [22, 160, 133]}}]],
+        body: body,
+        theme: 'grid'
+    });
+    return doc;
+};
+
+// Themes - shows how the different themes looks
+examples.themes = function () {
+    var doc = new jsPDF();
+    doc.setFontSize(12);
+    doc.setFontStyle('bold');
+
+    doc.text('Theme "striped"', 14, 16);
+    doc.autoTable({head: headRows(), body: bodyRows(5), startY: 20});
+
+    doc.text('Theme "grid"', 14, doc.autoTable.previous.finalY + 10);
+    doc.autoTable({head: headRows(), body: bodyRows(5), startY: doc.autoTable.previous.finalY + 14, theme: 'grid'});
+
+    doc.text('Theme "plain"', 14, doc.autoTable.previous.finalY + 10);
+    doc.autoTable({head: headRows(), body: bodyRows(5), startY: doc.autoTable.previous.finalY + 14, theme: 'plain'});
+
+    return doc;
+};
+
+// Custom style - shows how custom styles can be applied
+examples.custom = function () {
+    var doc = new jsPDF();
+    doc.autoTable({
+        head: headRows(), 
+        body: bodyRows(),
+        foot: headRows(),
+        startY: 37,
+        tableLineColor: [231, 76, 60],
+        tableLineWidth: 1,
+        styles: {
+            lineColor: [44, 62, 80],
+            lineWidth: 1
+        },
+        headStyles: {
+            fillColor: [241, 196, 15],
+            fontSize: 15
+        },
+        footStyles: {
+            fillColor: [241, 196, 15],
+            fontSize: 15
+        },
+        bodyStyles: {
+            fillColor: [52, 73, 94],
+            textColor: 240
+        },
+        alternateRowStyles: {
+            fillColor: [74, 96, 117]
+        },
+        // Note that the "email" key below is the same as the column's dataKey used for
+        // the head and body rows. If your data is entered in array form instead you have to
+        // use the integer index instead i.e. `columnStyles: {5: {fillColor: [41, 128, 185], ...}}`
+        columnStyles: {
+            email: {
+                fontStyle: 'bold'
+            },
+            city: {
+                // The font file mitubachi-normal.js is included on the page and was created from mitubachi.ttf
+                // with https://github.com/MrRio/jsPDF/tree/master/fontconverter/fontconveter.html
+                font: 'mitubachi',
+            },
+            id: {
+                halign  : 'right'
+            }
+        },
+        allSectionHooks: true,
+        // Use for customizing texts or styles of specific cells after they have been formatted by this plugin.
+        // This hook is called just before the column width and other features are computed.
+        didParseCell: function(data) {
+            if (data.row.index === 5) {
+                data.cell.styles.fillColor = [40, 170, 100];
+            }
+
+            if ((data.row.section === 'head' || data.row.section === 'foot') && data.column.dataKey === "expenses") {
+                data.cell.text = '' // Use an icon in didDrawCell instead
+            }
+
+            if (data.row.index === 0 && data.row.section === 'body' && data.column.dataKey === 'city') {
+                data.cell.text = 'とうきょう'
+            }
+        },
+        // Use for changing styles with jspdf functions or customize the positioning of cells or cell text
+        // just before they are drawn to the page.
+        willDrawCell: function(data) {
+            if (data.row.section === 'body' && data.column.dataKey === "expenses") {
+                if (data.cell.raw > 750) {
+                    doc.setTextColor(231, 76, 60); // Red
+                    doc.setFontStyle('bold');
+                }
+            }
+        },
+        // Use for adding content to the cells after they are drawn. This could be images or links.
+        // You can also use this to draw other custom jspdf content to cells with doc.text or doc.rect
+        // for example.
+        didDrawCell: function(data) {
+            if ((data.row.section === 'head' || data.row.section === 'foot') && data.column.dataKey === "expenses" && coinBase64Img) {
+                doc.addImage(coinBase64Img, 'PNG', data.cell.x + 5, data.cell.y + 2, 5, 5);
+            }
+        },
+        // Use this to add content to each page that has the autoTable on it. This can be page headers,
+        // page footers and page numbers for example.
+        didDrawPage: function(data) {
+            doc.setFontSize(18);
+            doc.text("Custom styling with hooks", data.settings.margin.left, 22);
+            doc.setFontSize(12);
+            doc.text("Conditional styling of cells, rows and columns, cell and table borders, custom font, image in cell", data.settings.margin.left, 30)
+        },
+    });
+    return doc;
+};
+
+/*
+ |--------------------------------------------------------------------------
+ | Below is some helper functions for the examples
+ |--------------------------------------------------------------------------
+ */
+
+function headRows() {
+    return [{id: 'ID', name: 'Name', email: 'Email', city: 'City', expenses: 'Sum'}];
+}
+
+function footRows() {
+    return [{id: 'ID', name: 'Name', email: 'Email', city: 'City', expenses: 'Sum'}];
+}
+
+function columns() {
+    return [
+        {header: 'ID', dataKey: 'id'},
+        {header: 'Name', dataKey: 'name'},
+        {header: 'Email', dataKey: 'email'},
+        {header: 'City', dataKey: 'city'},
+        {header: 'Exp', dataKey: 'expenses'},
+    ]
+}
+
+function data(rowCount) {
+    rowCount = rowCount || 10;
+    let body = [];
+    for (var j = 1; j <= rowCount; j++) {
+        body.push({
+            id: j,
+            name: faker.name.findName(),
+            email: faker.internet.email(),
+            city: faker.address.city(),
+            expenses: faker.finance.amount(),
+        });
+    }
+    return body;
+}
+
+function bodyRows(rowCount) {
+    rowCount = rowCount || 10;
+    let body = [];
+    for (var j = 1; j <= rowCount; j++) {
+        body.push({
+            id: j,
+            name: faker.name.findName(),
+            email: faker.internet.email(),
+            city: faker.address.city(),
+            expenses: faker.finance.amount(),
+        });
+    }
+    return body;
+}
\ No newline at end of file
index cc902cc..b82654a 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 use strict;
 use File::Basename;
 use Getopt::Long;
diff --git a/bin/imgtob64.pl b/bin/imgtob64.pl
new file mode 100644 (file)
index 0000000..0cc80f8
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env perl
+
+use strict;
+use MIME::Base64 qw(encode_base64);
+use MIME::File
+open (IMAGE, $ARGV[0]) || die "$!";
+binmode(IMAGE);
+local $/;
+my $file_contents = <IMAGE>;
+close IMAGE;
+open (B64, ">$ARGV[0].b64") || die $!;
+print B64 encode_base64($file_contents);
+close B64;
+my $ftype = 
+my $webstr = "data:image/"..";"
+open(B64,"$ARGV[0].b64")
+close(B64)
+print "output file is $ARGV[0].b64\n";
diff --git a/htdocs/img/dks_1000.png.b64 b/htdocs/img/dks_1000.png.b64
new file mode 100644 (file)
index 0000000..ba471eb
--- /dev/null
@@ -0,0 +1,1203 @@
+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
index 332161f..a5c2311 100644 (file)
 var admin = {\r
-  current_dataset:  {},\r
-  loadapp: function(appident){\r
-    console.log(appident);\r
-    console.log(location.origin + '/app/' + appident + '/index.html');\r
-    location.href=location.origin + '/app/' + appident + '/index.html';\r
-  },\r
-  loadpage: function(modulepage,modulename){\r
-    console.log(admin.current_dataset);\r
-    console.log("Load module:" + modulepage);\r
-    if (modulename){\r
-      document.getElementById("modulename").innerHTML = modulename;\r
-    }\r
-    var pm = [];\r
-    for (var i in admin.current_dataset){\r
-      pm.push(i + "=" + encodeURIComponent(admin.current_dataset[i]));\r
-    } \r
-    if (pm.length > 0){\r
-      modulepage = modulepage + "?" + pm.join("&");\r
-    }\r
-    console.log(modulepage);\r
-    document.getElementById("moduleframe").setAttribute('src',modulepage);\r
-  },\r
-  sidebarclick: function(modulepage,modulename){\r
-    admin.ladpage(modulepage,modulename);\r
-  },\r
-  logout: function(){\r
-    req.reqdata("POST",location.href,{"logout":"1"},admin.reloadpage);\r
+    current_dataset: {},\r
+    loadapp: function(appident) {\r
+        //console.log(appident);\r
+        //console.log(location.origin + '/app/' + appident + '/index.html');\r
+        location.href = location.origin + '/app/' + appident + '/index.html';\r
+    },\r
+    loadpage: function(modulepage, modulename) {\r
+        //console.log(admin.current_dataset);\r
+        //console.log("Load module:" + modulepage);\r
+        if (modulename) {\r
+            document.getElementById("modulename").innerHTML = modulename;\r
+        }\r
+        var pm = [];\r
+        for (var i in admin.current_dataset) {\r
+            pm.push(i + "=" + encodeURIComponent(admin.current_dataset[i]));\r
+        }\r
+        if (pm.length > 0) {\r
+            modulepage = modulepage + "?" + pm.join("&");\r
+        }\r
+        //console.log(modulepage);\r
+        //console.log(document.getElementById("myOverlay").style.display);\r
+        if (document.getElementById("myOverlay").style.display == 'block') {\r
+            w3_close();\r
+        }\r
+        document.getElementById("moduleframe").setAttribute('src', modulepage);\r
+    },\r
+    sidebarclick: function(modulepage, modulename) {\r
+        admin.ladpage(modulepage, modulename);\r
+        if (document.getElementById("myOverlay").style.display == 'block') {\r
+            w3_close();\r
+        }\r
 \r
-  },\r
-  reloadpage(page){\r
-    location.href=location.href;\r
+    },\r
+    logout: function() {\r
+        req.reqdata("POST", location.href, { "logout": "1" }, admin.reloadpage);\r
 \r
-  },\r
-  getdatasets: function(){\r
-    req.reqdata("POST","db.cgi",{"db":basedb,"type":"array","sql":"select * from datastores;"},admin.loaddatasets);\r
-  },\r
-  getpreference: function(pagename,callback){\r
-    req.reqdata("POST","db.cgi",{"db":basedb,"type":"array","sql":"select * from preferences where page='"+ pagename+"' and ident='"+ admin.getCookie("dksident") +"';"},callback);\r
-  },\r
-  setpreference: function(pagename,prefdata){\r
-    var txtprefdata= encodeURIComponent(prefdata);\r
-    if (typeof prefdata == 'object'){\r
-      txtprefdata = encodeURIComponent(JSON.stringify(prefdata));\r
-    }\r
-    req.reqdata("POST","db.cgi",{"db":basedb,"exec":"INSERT INTO preferences (ident,page,preferences) VALUES ('"+ admin.getCookie("dksident") +"','"+pagename+"','"+ txtprefdata+"');"},null);\r
-  },\r
-  loaddatasets: function(data){\r
-    console.log("loaddatasets");\r
-    console.log(data);\r
-    var gdt = document.getElementById('globaldatasets');\r
-    console.log(gdt);\r
-    gdt.innerHTML = '';\r
-    if (data){\r
-      var opts = '';\r
-      for (var i in data){\r
-        opts += '<option value="'+ data[i].datastore +'">'+data[i].name+'</option>';\r
-      }\r
-      gdt.innerHTML = opts;\r
-    }\r
-    if (admin.current_dataset.db){\r
+    },\r
+    reloadpage(page) {\r
+        location.href = location.href;\r
 \r
-    }else {\r
-      admin.current_dataset["db"]=gdt.value;\r
-    }\r
-    console.log(admin.current_dataset);\r
-  },\r
-  getCookie: function(cname) {\r
-    var name = cname + "=";\r
-    var decodedCookie = decodeURIComponent(document.cookie);\r
-    var ca = decodedCookie.split(';');\r
-    for(var i = 0; i <ca.length; i++) {\r
-      var c = ca[i];\r
-      while (c.charAt(0) == ' ') {\r
-        c = c.substring(1);\r
-      }\r
-      if (c.indexOf(name) == 0) {\r
-        return c.substring(name.length, c.length);\r
-      }\r
-    }\r
-    return "";\r
-  },\r
-  setCookie: function (cname, cvalue) {\r
-    document.cookie = cname + "=" + cvalue +";path=/";\r
-  },\r
-  setident: function(){\r
-    if (admin.getCookie("dksident") == ""){\r
-      var dksident = prompt("Bitte Name eingeben, damit wir deine Einstellungen speichern können!");\r
-      if ((dksident != null) && (dksident != "")){\r
-        admin.setCookie("dksident",dksident);\r
-      }\r
+    },\r
+    getdatasets: function() {\r
+        req.reqdata("POST", "db.cgi", { "db": basedb, "type": "array", "sql": "select * from datastores;" }, admin.loaddatasets);\r
+    },\r
+    getpreference: function(pagename, callback) {\r
+        req.reqdata("POST", "db.cgi", { "db": basedb, "type": "array", "sql": "select * from preferences where page='" + pagename + "' and ident='" + admin.getCookie("dksident") + "';" }, callback);\r
+    },\r
+    setpreference: function(pagename, prefdata) {\r
+        var txtprefdata = encodeURIComponent(prefdata);\r
+        if (typeof prefdata == 'object') {\r
+            txtprefdata = encodeURIComponent(JSON.stringify(prefdata));\r
+        }\r
+        req.reqdata("POST", "db.cgi", { "db": basedb, "exec": "INSERT INTO preferences (ident,page,preferences) VALUES ('" + admin.getCookie("dksident") + "','" + pagename + "','" + txtprefdata + "');" }, null);\r
+    },\r
+    loaddatasets: function(data) {\r
+        //console.log("loaddatasets");\r
+        //console.log(data);\r
+        var gdt = document.getElementById('globaldatasets');\r
+        //console.log(gdt);\r
+        gdt.innerHTML = '';\r
+        if (data) {\r
+            var opts = '';\r
+            for (var i in data) {\r
+                opts += '<option value="' + data[i].datastore + '">' + data[i].name + '</option>';\r
+            }\r
+            gdt.innerHTML = opts;\r
+        }\r
+        if (admin.current_dataset.db) {\r
+\r
+        } else {\r
+            admin.current_dataset["db"] = gdt.value;\r
+        }\r
+        //console.log(admin.current_dataset);\r
+    },\r
+    getCookie: function(cname) {\r
+        var name = cname + "=";\r
+        var decodedCookie = decodeURIComponent(document.cookie);\r
+        var ca = decodedCookie.split(';');\r
+        for (var i = 0; i < ca.length; i++) {\r
+            var c = ca[i];\r
+            while (c.charAt(0) == ' ') {\r
+                c = c.substring(1);\r
+            }\r
+            if (c.indexOf(name) == 0) {\r
+                return c.substring(name.length, c.length);\r
+            }\r
+        }\r
+        return "";\r
+    },\r
+    setCookie: function(cname, cvalue) {\r
+        document.cookie = cname + "=" + cvalue + ";path=/";\r
+    },\r
+    setident: function() {\r
+        if (admin.getCookie("dksident") == "") {\r
+            var dksident = prompt("Bitte Name eingeben, damit wir deine Einstellungen speichern können!");\r
+            if ((dksident != null) && (dksident != "")) {\r
+                admin.setCookie("dksident", dksident);\r
+            }\r
+        }\r
     }\r
-  }\r
 }\r
 \r
-function reload_page(){\r
-  location.href=location.href;\r
+function reload_page() {\r
+    location.href = location.href;\r
 }\r
 \r
 var mySidebar = document.getElementById("mySidebar");\r
@@ -104,40 +112,30 @@ var overlayBg = document.getElementById("myOverlay");
 \r
 // Toggle between showing and hiding the sidebar, and add overlay effect\r
 function w3_open() {\r
-  if (mySidebar.style.display === 'block') {\r
-    mySidebar.style.display = 'none';\r
-    overlayBg.style.display = "none";\r
-  } else {\r
-    mySidebar.style.display = 'block';\r
-    overlayBg.style.display = "block";\r
-  }\r
+    if (mySidebar.style.display === 'block') {\r
+        mySidebar.style.display = 'none';\r
+        overlayBg.style.display = "none";\r
+    } else {\r
+        mySidebar.style.display = 'block';\r
+        overlayBg.style.display = "block";\r
+    }\r
 }\r
 \r
 // Close the sidebar with the close button\r
 function w3_close() {\r
-  mySidebar.style.display = "none";\r
-  overlayBg.style.display = "none";\r
+    mySidebar.style.display = "none";\r
+    overlayBg.style.display = "none";\r
 }\r
 \r
 \r
-// function closeSidebar(){\r
-//   document.getElementById("sidebar").style.display = "none";\r
-//   document.getElementById("main").style.margin = "0 0 0 0";\r
-//   document.getElementById("modulename").style.setProperty("margin-left","0px");\r
-// }\r
 \r
-// function openSidebar(){\r
-//   document.getElementById("sidebar").style.display = "block";\r
-//   document.getElementById("main").style.setProperty("margin-left","210px");\r
-//   document.getElementById("modulename").style.setProperty("margin-left","150px");\r
-// }\r
 \r
 document.addEventListener("DOMContentLoaded", function() {\r
-  \r
-  //admin.setident();\r
-  \r
-  if (basedb && basedb != ""){\r
-    console.log("INFO basedb:" + basedb );\r
-    admin.getdatasets();\r
-  }\r
+\r
+    //admin.setident();\r
+\r
+    if (basedb && basedb != "") {\r
+        //console.log("INFO basedb:" + basedb);\r
+        admin.getdatasets();\r
+    }\r
 });
\ No newline at end of file
diff --git a/htdocs/js/database.js b/htdocs/js/database.js
deleted file mode 100644 (file)
index 2a06683..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-var appdb = {\r
-               //dbfile: null,\r
-               url: null,\r
-               dbquery: function(sQuery){\r
-                       var type='querysorted';\r
-                       var result= {sqldata:[]};\r
-                       //console.log(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery));\r
-                       //dump(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n");\r
-                       $.ajax({\r
-                               encoding:"UTF-8",\r
-                               url:this.url,\r
-                               crossDomain: true,\r
-                               method: "POST",\r
-                               data: 'type=' + type + '&sql=' +encodeURIComponent(sQuery),\r
-                               success: function (data){\r
-                                       //dump(data + "\n");\r
-                                               result=data.result;\r
-                                       },\r
-                                       error: function(data){\r
-                                               alert("Error:" + JSON.stringify(data));\r
-                                               console.log("Error:" + JSON.stringify(data));\r
-                                       },\r
-                               async:false\r
-                       });\r
-                       return result;\r
-               },\r
-               dbqueryarray: function(sQuery){\r
-                       var type='queryarray';\r
-                       var result= {sqldata:[]};\r
-                       //console.log(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery));\r
-                       //alert(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n");\r
-                       $.ajax({\r
-                               encoding:"UTF-8",\r
-                               url:this.url,\r
-                               crossDomain: true,\r
-                               method: "POST",\r
-                               data: 'type=' + type + '&sql=' +encodeURIComponent(sQuery),\r
-                               success: function (data){\r
-                                               result=data.result;\r
-                                       },\r
-                               error: function(data){\r
-                                       alert("Error:" + JSON.stringify(data));\r
-                                       console.log("Error:" + JSON.stringify(data));\r
-                               },\r
-                               async:false\r
-                       });\r
-                       return result;\r
-               },\r
-               dbexec: function(sQuery){\r
-                       var type='exec';\r
-                       var result= {sqldata:[]};\r
-                       //dump(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n");\r
-                       //console.log(this.url + '&db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) );\r
-                       $.ajax({\r
-                               encoding:"UTF-8",\r
-                               url:this.url,\r
-                               crossDomain: true,\r
-                               method: "POST",\r
-                               data: 'type=' + type + '&sql=' +encodeURIComponent(sQuery),\r
-                               success: function (data){\r
-                                               result=data.result;\r
-                                       },\r
-                                       error: function(data){\r
-                                               alert("Error:" + JSON.stringify(data));\r
-                                               console.log("Error:" + JSON.stringify(data));\r
-                                       },\r
-                               async:false\r
-                       });\r
-                       return result;\r
-               },\r
-//             b64EncodeUnicode: function (str) {\r
-//                 // first we use encodeURIComponent to get percent-encoded UTF-8,\r
-//                 // then we convert the percent encodings into raw bytes which\r
-//                 // can be fed into btoa.\r
-//                 return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\r
-//                     function toSolidBytes(match, p1) {\r
-//                         return String.fromCharCode('0x' + p1);\r
-//                 }));\r
-//             },\r
-               generate_uuid: function(){\r
-                       return this.s4() + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + this.s4() + this.s4();\r
-               },\r
-               s4: function(){\r
-                       return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\r
-               }\r
-}
\ No newline at end of file
index cd98192..3dcd0cf 100644 (file)
-function saveform(frmid,aftercallback){
-  var flds=getformcontent(frmid,null);
-  flds["fn"] ="saveform";
-  
-  //console.log(flds);
-  if (aftercallback){
-    req.reqdata("POST","index.cgi",flds,aftercallback);
-    formsaved({});
-  }
-  else {
-    req.reqdata("POST","index.cgi",flds,formsaved);
-  }
-  return false;
-}
+function saveform(frmid, aftercallback) {
+    var flds = getformcontent(frmid, null);
+    flds["fn"] = "saveform";
 
-function formsaved(data){
-  var sb = document.getElementById("snackbar");
-  sb.className="show w3-green";
-  sb.innerHTML = 'Les données ont été sauvegarder!';
-  setTimeout(function(){ sb.className = sb.className.replace("show w3-green", ""); }, 3000);
-  return false;
+    //console.log(flds);
+    if (aftercallback) {
+        req.reqdata("POST", "index.cgi", flds, aftercallback);
+        formsaved({});
+    } else {
+        req.reqdata("POST", "index.cgi", flds, formsaved);
+    }
+    return false;
 }
 
-function showsnackbar(xclass,xmessage){
-  var sb = document.getElementById("snackbar");
-  sb.className="show " + xclass;
-  sb.innerHTML = xmessage;
-  setTimeout(function(){ sb.className = sb.className.replace(sb.className, ""); }, 3000);
-  return false;
+function formsaved(data) {
+    var sb = document.getElementById("snackbar");
+    sb.className = "show w3-green";
+    sb.innerHTML = 'Les données ont été sauvegarder!';
+    setTimeout(function() { sb.className = sb.className.replace("show w3-green", ""); }, 3000);
+    return false;
 }
 
-function getformcontent(frmid,dataflds){
-  var frm = document.getElementById("frm_" + frmid);
-  var flds = [];
-  if (dataflds){
-    flds = dataflds;
-  } 
-  for (var i = 0; i < frm.elements.length; i++) {
-    var field = frm.elements[i];
-    //console.log("field:" + field.id + " Name:" + field.getAttribute("name"));
-    if (field.tagName == "INPUT" || field.tagName == "SELECT" || field.tagName == "TEXTAREA"){
-      if (field.classList.contains("tagedit")){
-        var fvalue=field.value.trim();
-        var ndata = null;
-        if (fvalue != ""){
-          ndata =  fvalue.split(",");  
-        }
-       
-        flds[field.getAttribute("name")] = ndata;
-      }else if (field.tagName == "TEXTAREA" ){
-        if (field.classList.contains("richeditarea")){
-          flds[field.getAttribute("name")] = tinymce.get(field.id).getContent();
-        } else {
-          flds[field.getAttribute("name")] = field.innerHTML;
-        }
-        
-      }else if (field.type == "checkbox" ){
-        if (field.checked){
-          flds[field.getAttribute("name")] = "1";
-        } else {
-          flds[field.getAttribute("name")] = "";
-        }
-        
-      }
-      else {
-        if (field.tagName == "SELECT" && field.multiple == true){
-          var opts = field.selectedOptions;
-          var vals = [];
-          for (var o in opts){
-            if (opts[o].value){
-              vals.push(opts[o].value);
-            }
-          }
-          if (vals.length > 0) {
-            flds[field.getAttribute("name")] = vals;
-          } else {
-            flds[field.getAttribute("name")] = "";
-          }
-          
-        } else {
-          flds[field.getAttribute("name")] = field.value;
-        }
-        
-      }
-      
-    }
-  }
-  return flds;
+function showsnackbar(xclass, xmessage) {
+    var sb = document.getElementById("snackbar");
+    sb.className = "show " + xclass;
+    sb.innerHTML = xmessage;
+    setTimeout(function() { sb.className = sb.className.replace(sb.className, ""); }, 3000);
+    return false;
 }
 
-function cleanform(frmname){
-  //console.log("Clean Form: " + frmname);
-  var frm = document.getElementById("frm_" + frmname);
-  
-  for (var f in frm){
-    //console.log(frm[f].id);
-    if (frm[f] && frm[f].id){
-    if (frm[f].tagName == 'INPUT'){
-      //console.log("is INPUT" + frm[f].id + " type:" + frm[f].type + " class:" + frm[f].classList);
-      if (frm[f].type == "checkbox"){
-        frm[f].checked = false;
-      } else if (frm[f].classList.contains("datefield")){
-          if (frm[f]._flatpickr){ frm[f]._flatpickr.clear(); }
-      } else if (frm[f].classList.contains("choices__input")){
-        if (choice[frmname][frm[f].id]){
-          choice[frmname][frm[f].id].removeActiveItems();
-        }
-      } else {
-        frm[f].value = "";
-      }
+function getformcontent(frmid, dataflds) {
+    var frm = document.getElementById("frm_" + frmid);
+    var flds = [];
+    if (dataflds) {
+        flds = dataflds;
     }
-    if (frm[f].tagName == 'SELECT'){
-      //console.log("is INPUT" + frm[f].id + " multiple:" + frm[f].multiple + " class:" + frm[f].classList);
-      if (frm[f].multiple == true){
-        if (frm[f].classList.contains("choices__input")){
-          choice[frmname][frm[f].id].removeActiveItems();
+
+    for (var i = 0; i < frm.elements.length; i++) {
+        var field = frm.elements[i];
+        //console.log("field:" + field.id + " Name:" + field.getAttribute("name"));
+        if (field.tagName == "INPUT" || field.tagName == "SELECT" || field.tagName == "TEXTAREA") {
+            if (field.classList.contains("tagedit")) {
+                var fvalue = field.value.trim();
+                var ndata = null;
+                if (fvalue != "") {
+                    ndata = fvalue.split(",");
+                }
+
+                flds[field.getAttribute("name")] = ndata;
+            } else if (field.tagName == "TEXTAREA") {
+                if (field.classList.contains("richeditarea")) {
+                    flds[field.getAttribute("name")] = tinymce.get(field.id).getContent();
+                } else {
+                    flds[field.getAttribute("name")] = field.innerHTML;
+                }
+
+            } else if (field.type == "checkbox") {
+                if (field.checked) {
+                    flds[field.getAttribute("name")] = "1";
+                } else {
+                    flds[field.getAttribute("name")] = "";
+                }
+
+            } else {
+                if (field.tagName == "SELECT" && field.multiple == true) {
+                    var opts = field.selectedOptions;
+                    var vals = [];
+                    for (var o in opts) {
+                        if (opts[o].value) {
+                            vals.push(opts[o].value);
+                        }
+                    }
+                    if (vals.length > 0) {
+                        flds[field.getAttribute("name")] = vals;
+                    } else {
+                        flds[field.getAttribute("name")] = "";
+                    }
+
+                } else {
+                    flds[field.getAttribute("name")] = field.value;
+                }
+
+            }
+
         }
-      } else {
-        frm[f].value = "";
-      }
-      
-    }
-    if (frm[f].tagName == 'TEXTAREA'){
-      //console.log("is INPUT" + frm[f].id +  " class:" + frm[f].classList);
-      if (frm[f].classList.contains("richeditarea")){
-        tinymce.get(frm[f].id).setContent("");
-      } else {
-        frm[f].innerHTML = "";
-      } 
     }
-  }
-  }
-  return false;
+    return flds;
 }
 
-function fillformbydataclass(dataclass,data,readonly = false){
-  //console.log(data);
-  var frm = document.querySelectorAll('.data_'+ dataclass);
-  if (data){
-    for (var f in frm){
-      console.log(frm[f].id + "=>" +  data[frm[f].id]);
-      if (data[frm[f].id]){
-        console.log(frm[f].id + " => " + data[frm[f].id]);
-        if (readonly){ frm[f].readonly = true;}
-        if (frm[f].tagName == 'INPUT'){
-          if (frm[f].type == "checkbox"){
-            if (data[frm[f].id] == "1"){
-              frm[f].checked = true;
-            } else {
-              frm[f].checked = false;
+function cleanform(frmname) {
+    //console.log("Clean Form: " + frmname);
+    var frm = document.getElementById("frm_" + frmname);
+
+    for (var f in frm) {
+        //console.log(frm[f].id);
+        if (frm[f] && frm[f].id) {
+            if (frm[f].tagName == 'INPUT') {
+                //console.log("is INPUT" + frm[f].id + " type:" + frm[f].type + " class:" + frm[f].classList);
+                if (frm[f].type == "checkbox") {
+                    frm[f].checked = false;
+                } else if (frm[f].classList.contains("datefield")) {
+                    if (frm[f]._flatpickr) { frm[f]._flatpickr.clear(); }
+                } else if (frm[f].classList.contains("choices__input")) {
+                    if (choice[frmname][frm[f].id]) {
+                        choice[frmname][frm[f].id].removeActiveItems();
+                    }
+                } else {
+                    frm[f].value = "";
+                }
+            }
+            if (frm[f].tagName == 'SELECT') {
+                //console.log("is INPUT" + frm[f].id + " multiple:" + frm[f].multiple + " class:" + frm[f].classList);
+                if (frm[f].multiple == true) {
+                    if (frm[f].classList.contains("choices__input")) {
+                        choice[frmname][frm[f].id].removeActiveItems();
+                    }
+                } else {
+                    frm[f].value = "";
+                }
+
             }
-          } else if (frm[f].classList.contains("datefield")){ 
-            frm[f]._flatpickr.setDate(data[frm[f].id]);
-          } else if (frm[f].classList.contains("choices__input")){  
-            if ((data[frm[f].id] != null) && (data[frm[f].id] != '[""]')){
-              choice[dataclass][frm[f].id].setValue(JSON.parse(data[frm[f].id])); 
+            if (frm[f].tagName == 'TEXTAREA') {
+                //console.log("is INPUT" + frm[f].id +  " class:" + frm[f].classList);
+                if (frm[f].classList.contains("richeditarea")) {
+                    tinymce.get(frm[f].id).setContent("");
+                } else {
+                    frm[f].innerHTML = "";
+                }
             }
-          } else {
-            frm[f].value=data[frm[f].id];
-          }
         }
-        if (frm[f].tagName == 'SELECT'){
-          if (frm[f].classList.contains("choices__input")){
-            if (frm[f].multiple == true){
-              //console.log(data[frm[f].id]);
-              choice[dataclass][frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id]));
-            }else {
-              choice[dataclass][frm[f].id].setChoiceByValue(data[frm[f].id]);
+    }
+    return false;
+}
+
+function fillformbydataclass(dataclass, data, readonly = false) {
+    //console.log(data);
+    var frm = document.querySelectorAll('.data_' + dataclass);
+    if (data) {
+        for (var f in frm) {
+            //console.log(frm[f].id + "=>" +  data[frm[f].id]);
+            if (data[frm[f].id]) {
+                //console.log(frm[f].id + " => " + data[frm[f].id]);
+                if (readonly) { frm[f].readonly = true; }
+                if (frm[f].tagName == 'INPUT') {
+                    if (frm[f].type == "checkbox") {
+                        if (data[frm[f].id] == "1") {
+                            frm[f].checked = true;
+                        } else {
+                            frm[f].checked = false;
+                        }
+                    } else if (frm[f].classList.contains("datefield")) {
+                        frm[f]._flatpickr.setDate(data[frm[f].id]);
+                    } else if (frm[f].classList.contains("choices__input")) {
+                        if ((data[frm[f].id] != null) && (data[frm[f].id] != '[""]')) {
+                            choice[dataclass][frm[f].id].setValue(JSON.parse(data[frm[f].id]));
+                        }
+                    } else {
+                        frm[f].value = data[frm[f].id];
+                    }
+                }
+                if (frm[f].tagName == 'SELECT') {
+                    if (frm[f].classList.contains("choices__input")) {
+                        if (frm[f].multiple == true) {
+                            //console.log(data[frm[f].id]);
+                            choice[dataclass][frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id]));
+                        } else {
+                            choice[dataclass][frm[f].id].setChoiceByValue(data[frm[f].id]);
+                        }
+                    } else {
+                        frm[f].value = data[frm[f].id];
+                    }
+
+                }
             }
-          } else {
-            frm[f].value=data[frm[f].id];
-          }
-          
+
         }
-      }
-      
     }
-  }
 }
 
-function fillselectlist(obj,data,vidcol,vvalcol){
-  var sellist = [];
-  obj.clearStore();
-  sellist.push({value:"",label:""});
-  if (data){
-    for (var i in data){
-      sellist.push({value:data[i][vidcol],label:data[i][vvalcol]});
+function fillselectlist(obj, data, vidcol, vvalcol) {
+    var sellist = [];
+    obj.clearStore();
+    sellist.push({ value: "", label: "" });
+    if (data) {
+        for (var i in data) {
+            sellist.push({ value: data[i][vidcol], label: data[i][vvalcol] });
+        }
     }
-  }
-  obj.setChoices(sellist, 'value', 'label', true);
-  return false;
+    obj.setChoices(sellist, 'value', 'label', true);
+    return false;
 }
\ No newline at end of file
diff --git a/htdocs/js/mainapp.js b/htdocs/js/mainapp.js
deleted file mode 100644 (file)
index bd7e5b0..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-document.addEventListener("DOMContentLoaded", function() {
-  console.log( "Main ready!" );
-  browserapp.setdatasets();
-  browserapp.loaddataset();
-  browserapp.loadmodule("overview");
-  console.log("After module load!");
-});
-
-//console.log(navigator.platform);
-//console.log(location.protocol);
-var browserapp = {
-  config: null,
-  loadmodule: function(modulename){
-    //var appdata = browserapp.getconfig();
-    var params = "?";
-    for (var i in this.config){
-      params += "&" + i +"=" + encodeURIComponent(this.config[i]);
-    }
-    //console.log("modules/"+modulename+"/index.html"+params);
-    document.getElementById("moduleframe").setAttribute("src","modules/"+modulename+"/index.html"+ params);
-  },
-  loadmodulepage: function(modulename,page,pageparams = null){
-    //var appdata = browserapp.getconfig();
-    var params = "?";
-    for (var i in this.config){
-      params += "&" + i +"=" + encodeURIComponent(this.config[i]);
-    }
-    if (pageparams){
-      for (var i in pageparams){
-        params += "&" + i +"=" + encodeURIComponent(pageparams[i]);
-      }
-    }
-    //console.log("modules/"+modulename+"/index.html"+params);
-    document.getElementById("moduleframe").setAttribute("src","modules/"+modulename+"/"+ page +".html"+ params);
-  },
-  setdatasets: function(myds){
-    $("#globaldatasets").html("");
-    var ds = usersystem.getLocalDataSets();
-    for (var i in ds){
-      var prop = usersystem.getPreference(ds[i]);
-      $("#globaldatasets").append('<option value="'+ds[i]+'">'+prop.name+'</option>');
-    }
-  },
-  currentdataset: function(){
-    return  $("#globaldatasets :selected").val();
-  },
-  loaddataset: function(){
-    var gdset = $("#globaldatasets :selected").val();
-    if (gdset == ""){
-      this.config = null;
-    }else {
-      var ldata = usersystem.getPreference(gdset);
-      this.config={dbfile:ldata.dbfile,serviceurl:"http://"+ldata.server+":6060/"};
-    }
-  }
-    
-  }
-}
\ No newline at end of file
index 1855b24..7eccf8a 100644 (file)
@@ -1,24 +1,24 @@
 document.addEventListener("DOMContentLoaded", function() {
-  console.log( "Iframe "+ location.pathname.substring(location.pathname.lastIndexOf("/")) +" ready!" );
-  mpref.loadconfig();
-  initpage();
+    //console.log( "Iframe "+ location.pathname.substring(location.pathname.lastIndexOf("/")) +" ready!" );
+    mpref.loadconfig();
+    initpage();
 });
 
-var mpref ={
-  cfg: null,
-  getSearchParams: function (k){
-    //alert(location.href);
-    var p={};
-    console.log("params =>" + location.search);
-    location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(s,k,v){p[k]=v});
-    return k?p[k]:p;
-  },
-  loadconfig: function(){
-    this.cfg = this.getSearchParams();
-    //var page = location.pathname.substring(location.pathname.lastIndexOf("/"));
-    //page = page.replace(/\.html/,'');
-    //apppref.getpreference(page);
-    //appdb.dbfile = this.cfg.dbfile; 
-    //appdb.url = decodeURIComponent(this.cfg.serviceurl) + 'sqlite/' + decodeURIComponent(this.cfg.dbfile);
-  }
-}
+var mpref = {
+    cfg: null,
+    getSearchParams: function(k) {
+        //alert(location.href);
+        var p = {};
+        //console.log("params =>" + location.search);
+        location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(s, k, v) { p[k] = v });
+        return k ? p[k] : p;
+    },
+    loadconfig: function() {
+        this.cfg = this.getSearchParams();
+        //var page = location.pathname.substring(location.pathname.lastIndexOf("/"));
+        //page = page.replace(/\.html/,'');
+        //apppref.getpreference(page);
+        //appdb.dbfile = this.cfg.dbfile; 
+        //appdb.url = decodeURIComponent(this.cfg.serviceurl) + 'sqlite/' + decodeURIComponent(this.cfg.dbfile);
+    }
+}
\ No newline at end of file
index 2aaf17b..a65b8c6 100644 (file)
-var api = location.origin+'/api/';
+var api = location.origin + '/api/';
 // if (location.pathname.indexOf('modules') > 0){
 //   api = location.origin + location.pathname.substring(0, location.pathname.indexOf('module')) + 'api/';
 // }
-console.log(api);
+//console.log(api);
 var req = {
-    multipartform: function(url,frmdata,callback=null){
-    var ret = null;
-    var rdata = null;
-    var async = false;
-    if (callback){
-      async=true;
-    }
-    
-    var request = new XMLHttpRequest();
-    
-    console.log(frmdata);
-    var sendurl = api + url;
-    console.log("Multipart sending URL: " + "POST" + " => " +sendurl);
-    request.open("POST", sendurl, true);
-    request.onload = function(){
-      if (request.status >= 200 && request.status <= 400){
-        console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type"));
-        if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0){
-          var xparse = JSON.parse(request.responseText);
-          ret = xparse.result;
-          console.log(ret);
-        }
-        else {
-          
-          ret = request.responseText;
+    multipartform: function(url, frmdata, callback = null) {
+        var ret = null;
+        var rdata = null;
+        var async = false;
+        if (callback) {
+            async = true;
         }
-        if (async){
-          callback(ret);
+
+        var request = new XMLHttpRequest();
+
+        //console.log(frmdata);
+        var sendurl = api + url;
+        //console.log("Multipart sending URL: " + "POST" + " => " + sendurl);
+        request.open("POST", sendurl, true);
+        request.onload = function() {
+            if (request.status >= 200 && request.status <= 400) {
+                //console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type"));
+                if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) {
+                    var xparse = JSON.parse(request.responseText);
+                    ret = xparse.result;
+                    //console.log(ret);
+                } else {
+
+                    ret = request.responseText;
+                }
+                if (async) {
+                    callback(ret);
+                }
+            } else {
+                alert("ServerERROR:" + request.status + "\n" + request.responseText);
+            }
+        };
+        request.onerror = function() {
+            alert("Connection ERROR!\n" + url);
+        };
+
+        request.setRequestHeader('Content-Type', 'multipart/form-data');
+        request.send(frmdata);
+        return ret;
+    },
+    reqdata: function(method, url, data, callback = null) {
+
+        var ret = null;
+        var rdata = null;
+        var async = false;
+        if (callback) {
+            async = true;
         }
-      } else {
-        alert("ServerERROR:" + request.status + "\n" + request.responseText);
-      }
-    };
-    request.onerror = function(){
-      alert("Connection ERROR!\n" + url);
-    };
-  
-      request.setRequestHeader('Content-Type','multipart/form-data');
-      request.send(frmdata);
-    return ret;
-  },
-  reqdata: function(method,url,data,callback=null){
-    
-    var ret = null;
-    var rdata = null;
-    var async = false;
-    if (callback){
-      async=true;
-    }
-    
-    var request = new XMLHttpRequest();
-    if (typeof data == 'object'){
-      var xdata = [];
-      for (var i in data){
-         var value = '';
-         if (typeof(data[i]) == 'object'){
-           value = encodeURIComponent(JSON.stringify(data[i]));
-         } else {
-           value = encodeURIComponent(data[i]);
-         }
-         xdata.push(i + "=" + value);
-      }
-      rdata = xdata.join("&");
-    }else {
-      rdata = data;
-    }
-    //console.log(rdata);
-    //console.log("Data to send: " + decodeURIComponent(rdata));
-    var sendurl = api + url;
-    if (method.toUpperCase() == 'GET'){
-      sendurl = sendurl + '?' + rdata;
-    }
-    console.log("sending URL: " + method + " => " +sendurl + '?' + rdata);
-    request.open(method.toUpperCase(), sendurl, true);
-    request.onload = function(){
-      if (request.status >= 200 && request.status <= 400){
-        // console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type"));
-        if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0){
-          console.log(xparse);
-          var xparse = JSON.parse(request.responseText);
-          ret = xparse.result;
-          console.log(ret);
+
+        var request = new XMLHttpRequest();
+        if (typeof data == 'object') {
+            var xdata = [];
+            for (var i in data) {
+                var value = '';
+                if (typeof(data[i]) == 'object') {
+                    value = encodeURIComponent(JSON.stringify(data[i]));
+                } else {
+                    value = encodeURIComponent(data[i]);
+                }
+                xdata.push(i + "=" + value);
+            }
+            rdata = xdata.join("&");
+        } else {
+            rdata = data;
         }
-        // else if (request.getResponseHeader("Content-Type").indexOf('application/vnd.ms-excel') == 0){
-        //   var filename = "";
-        //       var disposition = request.getResponseHeader('Content-Disposition');
-        //       if (disposition && disposition.indexOf('attachment') !== -1) {
-        //           var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
-        //           var matches = filenameRegex.exec(disposition);
-        //           if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
-        //       }
-        //       var type = request.getResponseHeader('Content-Type');
-        //       var blob = new Blob([this.response], { type: type });
-        //       var URL = window.URL;
-        //       var downloadUrl = URL.createObjectURL(blob);
-        //       if (filename) {
-        //         var a = document.createElement("a");
-        //         if (typeof a.download === 'undefined') {
-        //           window.location = downloadUrl;
-        //         } else {
-        //           a.href = downloadUrl;
-        //           a.download = filename;
-        //           document.body.appendChild(a);
-        //           a.click();
-        //         }
-        //       } else {
-        //         window.location = downloadUrl;
-        //       }
-              //setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100);
-        // }
-        else {
-          ret = request.responseText;
-          console.log("TEXT returned:" + ret);
+        //console.log(rdata);
+        //console.log("Data to send: " + decodeURIComponent(rdata));
+        var sendurl = api + url;
+        if (method.toUpperCase() == 'GET') {
+            sendurl = sendurl + '?' + rdata;
         }
-        ////console.log("data returned: " + request.responseText);
-        if (async){
-          callback(ret);
+        //console.log("sending URL: " + method + " => " + sendurl + '?' + rdata);
+        request.open(method.toUpperCase(), sendurl, true);
+        request.onload = function() {
+            if (request.status >= 200 && request.status <= 400) {
+                // console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type"));
+                if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) {
+                    //console.log(xparse);
+                    var xparse = JSON.parse(request.responseText);
+                    ret = xparse.result;
+                    //console.log(ret);
+                }
+                // else if (request.getResponseHeader("Content-Type").indexOf('application/vnd.ms-excel') == 0){
+                //   var filename = "";
+                //       var disposition = request.getResponseHeader('Content-Disposition');
+                //       if (disposition && disposition.indexOf('attachment') !== -1) {
+                //           var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
+                //           var matches = filenameRegex.exec(disposition);
+                //           if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
+                //       }
+                //       var type = request.getResponseHeader('Content-Type');
+                //       var blob = new Blob([this.response], { type: type });
+                //       var URL = window.URL;
+                //       var downloadUrl = URL.createObjectURL(blob);
+                //       if (filename) {
+                //         var a = document.createElement("a");
+                //         if (typeof a.download === 'undefined') {
+                //           window.location = downloadUrl;
+                //         } else {
+                //           a.href = downloadUrl;
+                //           a.download = filename;
+                //           document.body.appendChild(a);
+                //           a.click();
+                //         }
+                //       } else {
+                //         window.location = downloadUrl;
+                //       }
+                //setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100);
+                // }
+                else {
+                    ret = request.responseText;
+                    //console.log("TEXT returned:" + ret);
+                }
+                ////console.log("data returned: " + request.responseText);
+                if (async) {
+                    callback(ret);
+                }
+
+            } else {
+                //console.log("ServerERROR: " + request.status + "\n" + request.responseText);
+                alert("ServerERROR:" + request.status + "\n" + request.responseText);
+            }
+        };
+        request.onerror = function() {
+            //console.log("ERROR: connection ERROR\n" + url);
+            alert("Connection ERROR!\n" + url);
+        };
+        if (method.toUpperCase() == 'POST') {
+            request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
+            request.send(rdata);
+        } else {
+            //request.withCredentials = true;
+            request.send();
         }
-        
-      } else {
-        //console.log("ServerERROR: " + request.status + "\n" + request.responseText);
-        alert("ServerERROR:" + request.status + "\n" + request.responseText);
-      }
-    };
-    request.onerror = function(){
-      //console.log("ERROR: connection ERROR\n" + url);
-      alert("Connection ERROR!\n" + url);
-    };
-    if (method.toUpperCase() == 'POST'){
-      request.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
-      request.send(rdata);
-    } else {
-      //request.withCredentials = true;
-      request.send();
+        return ret;
+    },
+    asyncNoEvent: function(data) {
+        //console.log("query done");
+        //console.log(data);
+        //console.log("done");
     }
-    return ret;
-  },
-  asyncNoEvent: function(data){
-    console.log("query done");
-    console.log(data);
-    console.log("done");
-  }
-  
+
 }
\ No newline at end of file
diff --git a/htdocs/js/webdatabase.js b/htdocs/js/webdatabase.js
deleted file mode 100644 (file)
index c85cd03..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-var appdb = {\r
-               dbfile: null,\r
-               url: null,\r
-               dbquery: function(sQuery){\r
-                       var type='querysorted';\r
-                       var result= {sqldata:[]};\r
-                       //console.log(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery));\r
-                       //dump(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n");\r
-                       $.ajax({\r
-                               encoding:"UTF-8",\r
-                               url:this.url + '&db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) ,\r
-                               crossDomain: true,\r
-                               success: function (data){\r
-                                       //dump(data + "\n");\r
-                                               result=data.result;\r
-                                       },\r
-                                       error: function(data){\r
-                                               alert("Error:" + JSON.stringify(data));\r
-                                               console.log("Error:" + JSON.stringify(data));\r
-                                       },\r
-                               async:false\r
-                       });\r
-                       return result;\r
-               },\r
-               dbqueryarray: function(sQuery){\r
-                       var type='queryarray';\r
-                       var result= {sqldata:[]};\r
-                       //console.log(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery));\r
-                       //alert(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n");\r
-                       $.ajax({\r
-                               encoding:"UTF-8",\r
-                               url:this.url + '&db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) ,\r
-                               crossDomain: true,\r
-                               success: function (data){\r
-                                               result=data.result;\r
-                                       },\r
-                               error: function(data){\r
-                                       alert("Error:" + JSON.stringify(data));\r
-                                       console.log("Error:" + JSON.stringify(data));\r
-                               },\r
-                               async:false\r
-                       });\r
-                       return result;\r
-               },\r
-               dbexec: function(sQuery){\r
-                       var type='exec';\r
-                       var result= {sqldata:[]};\r
-                       //dump(this.url + 'db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) + "\n");\r
-                       console.log(this.url + '&db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) );\r
-                       $.ajax({\r
-                               encoding:"UTF-8",\r
-                               url:this.url + '&db=' + this.dbfile + '&type=' + type + '&sql=' +encodeURIComponent(sQuery) ,\r
-                               crossDomain: true,\r
-                               success: function (data){\r
-                                               result=data.result;\r
-                                       },\r
-                                       error: function(data){\r
-                                               alert("Error:" + JSON.stringify(data));\r
-                                               console.log("Error:" + JSON.stringify(data));\r
-                                       },\r
-                               async:false\r
-                       });\r
-                       return result;\r
-               },\r
-//             b64EncodeUnicode: function (str) {\r
-//                 // first we use encodeURIComponent to get percent-encoded UTF-8,\r
-//                 // then we convert the percent encodings into raw bytes which\r
-//                 // can be fed into btoa.\r
-//                 return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\r
-//                     function toSolidBytes(match, p1) {\r
-//                         return String.fromCharCode('0x' + p1);\r
-//                 }));\r
-//             },\r
-               generate_uuid: function(){\r
-                       return this.s4() + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + this.s4() + this.s4();\r
-               },\r
-               s4: function(){\r
-                       return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\r
-               }\r
-}
\ No newline at end of file