diff --git a/bookmarklet.js b/bookmarklet.js
index b68e00e..072b61c 100644
--- a/bookmarklet.js
+++ b/bookmarklet.js
@@ -1,15 +1,17 @@
-loadDependencies();
-
-console.logLevel = console.INFO;
-
-var $;
-var printScopeDeviderToken1 = "~~~~~";
-var printScopeDeviderToken2 = "Attachment"
-
-
-main();
+loadScripts(function(){
+ appendScript("//ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js", false);
+},function(){
+ addGoogleAnalytics();
+ init();
+ main();
+});
function main(){
+
+ console.logLevel = console.INFO;
+
+ printScopeDeviderToken1 = "~~~~~";
+ printScopeDeviderToken2 = "Attachment"
if($("#card-print-overlay").length > 0){
alert("Print Card already opened!");
@@ -788,15 +790,130 @@ body {
//############################################################################################################################
//############################################################################################################################
//############################################################################################################################
+function loadScripts(load, callback){
+
+ load();
-
-function loadDependencies() {
- loadJQuery();
- loadLoggingFunctions();
- loadStringFunctions();
- loadGoogleAnalytics();
+ var head = document.getElementsByTagName('head')[0];
+ var script = document.createElement('script');
+ script.src = "https://qoomon.github.io/void.js";
+ script.async = false;
+
+ // Then bind the event to the callback function.
+ // There are several events for cross browser compatibility.
+ script.onreadystatechange = callback;
+ script.onload = callback;
+
+ head.appendChild(script);
}
+function appendScript(src, async) {
+ var head = document.getElementsByTagName('head')[0];
+ console.log("add script " + src);
+ var script = document.createElement('script');
+ script.src = src;
+ script.async = async;
+ head.appendChild(script);
+}
+
+function init() {
+ loadLoggingFunctions();
+ loadStringFunctions();
+
+
+ $.expr[':']['is'] = function(node, index, props){
+ return node.textContent == props[3];
+ }
+
+ Date.prototype.format = function(format) {
+ var returnStr = '';
+ var replace = Date.replaceChars;
+ for (var i = 0; i < format.length; i++) { var curChar = format.charAt(i); if (i - 1 >= 0 && format.charAt(i - 1) == "\\") {
+ returnStr += curChar;
+ }
+ else if (replace[curChar]) {
+ returnStr += replace[curChar].call(this);
+ } else if (curChar != "\\"){
+ returnStr += curChar;
+ }
+ }
+ return returnStr;
+ };
+
+ Date.replaceChars = {
+ shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+ shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+
+ // Day
+ d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
+ D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
+ j: function() { return this.getDate(); },
+ l: function() { return Date.replaceChars.longDays[this.getDay()]; },
+ N: function() { return this.getDay() + 1; },
+ S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
+ w: function() { return this.getDay(); },
+ z: function() { var d = new Date(this.getFullYear(),0,1); return Math.ceil((this - d) / 86400000); }, // Fixed now
+ // Week
+ W: function() { var d = new Date(this.getFullYear(), 0, 1); return Math.ceil((((this - d) / 86400000) + d.getDay() + 1) / 7); }, // Fixed now
+ // Month
+ F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
+ m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); },
+ M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
+ n: function() { return this.getMonth() + 1; },
+ t: function() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), 0).getDate() }, // Fixed now, gets #days of date
+ // Year
+ L: function() { var year = this.getFullYear(); return (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)); }, // Fixed now
+ o: function() { var d = new Date(this.valueOf()); d.setDate(d.getDate() - ((this.getDay() + 6) % 7) + 3); return d.getFullYear();}, //Fixed now
+ Y: function() { return this.getFullYear(); },
+ y: function() { return ('' + this.getFullYear()).substr(2); },
+ // Time
+ a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
+ A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
+ B: function() { return Math.floor((((this.getUTCHours() + 1) % 24) + this.getUTCMinutes() / 60 + this.getUTCSeconds() / 3600) * 1000 / 24); }, // Fixed now
+ g: function() { return this.getHours() % 12 || 12; },
+ G: function() { return this.getHours(); },
+ h: function() { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); },
+ H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
+ i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
+ s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
+ u: function() { var m = this.getMilliseconds(); return (m < 10 ? '00' : (m < 100 ?
+ '0' : '')) + m; },
+ // Timezone
+ e: function() { return "Not Yet Supported"; },
+ I: function() {
+ var DST = null;
+ for (var i = 0; i < 12; ++i) {
+ var d = new Date(this.getFullYear(), i, 1);
+ var offset = d.getTimezoneOffset();
+
+ if (DST === null) DST = offset;
+ else if (offset < DST) { DST = offset; break; } else if (offset > DST) break;
+ }
+ return (this.getTimezoneOffset() == DST) | 0;
+ },
+ O: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + '00'; },
+ P: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + ':00'; }, // Fixed now
+ T: function() { var m = this.getMonth(); this.setMonth(0); var result = this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/, '$1'); this.setMonth(m); return result;},
+ Z: function() { return -this.getTimezoneOffset() * 60; },
+ // Full Date/Time
+ c: function() { return this.format("Y-m-d\\TH:i:sP"); }, // Fixed now
+ r: function() { return this.toString(); },
+ U: function() { return this.getTimep() / 1000; }
+ };
+
+}
+
+
+
+function addGoogleAnalytics() {
+ // Google Analytics
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+}
function loadLoggingFunctions() {
@@ -879,29 +996,9 @@ function loadStringFunctions() {
}
-function loadJQuery() {
- // check prior inclusion and version
- if (window.jQuery === undefined) {
- console.log("reload JQuery ");
- var script = document.createElement("script");
- script.src = "//ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js";
- scr.async = false;
- document.getElementsByTagName("head")[0].appendChild(script);
- }
- $ = jQuery.noConflict();
-}
-function loadGoogleAnalytics() {
-
- // Google Analytics
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
-}
//############################################################################################################################
@@ -1004,85 +1101,3 @@ function stringToColor(str) {
return '#'+shade(int_to_rgba(hash(str)), -10);
}
-
-$.expr[':']['is'] = function(node, index, props){
- return node.textContent == props[3];
-}
-
-Date.prototype.format = function(format) {
- var returnStr = '';
- var replace = Date.replaceChars;
- for (var i = 0; i < format.length; i++) { var curChar = format.charAt(i); if (i - 1 >= 0 && format.charAt(i - 1) == "\\") {
- returnStr += curChar;
- }
- else if (replace[curChar]) {
- returnStr += replace[curChar].call(this);
- } else if (curChar != "\\"){
- returnStr += curChar;
- }
- }
- return returnStr;
-};
-
-Date.replaceChars = {
- shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
- longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
- shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
- longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-
- // Day
- d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
- D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
- j: function() { return this.getDate(); },
- l: function() { return Date.replaceChars.longDays[this.getDay()]; },
- N: function() { return this.getDay() + 1; },
- S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
- w: function() { return this.getDay(); },
- z: function() { var d = new Date(this.getFullYear(),0,1); return Math.ceil((this - d) / 86400000); }, // Fixed now
- // Week
- W: function() { var d = new Date(this.getFullYear(), 0, 1); return Math.ceil((((this - d) / 86400000) + d.getDay() + 1) / 7); }, // Fixed now
- // Month
- F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
- m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); },
- M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
- n: function() { return this.getMonth() + 1; },
- t: function() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), 0).getDate() }, // Fixed now, gets #days of date
- // Year
- L: function() { var year = this.getFullYear(); return (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)); }, // Fixed now
- o: function() { var d = new Date(this.valueOf()); d.setDate(d.getDate() - ((this.getDay() + 6) % 7) + 3); return d.getFullYear();}, //Fixed now
- Y: function() { return this.getFullYear(); },
- y: function() { return ('' + this.getFullYear()).substr(2); },
- // Time
- a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
- A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
- B: function() { return Math.floor((((this.getUTCHours() + 1) % 24) + this.getUTCMinutes() / 60 + this.getUTCSeconds() / 3600) * 1000 / 24); }, // Fixed now
- g: function() { return this.getHours() % 12 || 12; },
- G: function() { return this.getHours(); },
- h: function() { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); },
- H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
- i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
- s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
- u: function() { var m = this.getMilliseconds(); return (m < 10 ? '00' : (m < 100 ?
-'0' : '')) + m; },
- // Timezone
- e: function() { return "Not Yet Supported"; },
- I: function() {
- var DST = null;
- for (var i = 0; i < 12; ++i) {
- var d = new Date(this.getFullYear(), i, 1);
- var offset = d.getTimezoneOffset();
-
- if (DST === null) DST = offset;
- else if (offset < DST) { DST = offset; break; } else if (offset > DST) break;
- }
- return (this.getTimezoneOffset() == DST) | 0;
- },
- O: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + '00'; },
- P: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + ':00'; }, // Fixed now
- T: function() { var m = this.getMonth(); this.setMonth(0); var result = this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/, '$1'); this.setMonth(m); return result;},
- Z: function() { return -this.getTimezoneOffset() * 60; },
- // Full Date/Time
- c: function() { return this.format("Y-m-d\\TH:i:sP"); }, // Fixed now
- r: function() { return this.toString(); },
- U: function() { return this.getTimep() / 1000; }
-};