diff --git a/build-ryzjsext.bat b/build-ryzjsext.bat
new file mode 100644
index 0000000..e0c65ac
--- /dev/null
+++ b/build-ryzjsext.bat
@@ -0,0 +1,14 @@
+del ryzjsext.min.js
+del ryzjsext.min.tmp
+
+type ryzjsext-version.txt >> ryzjsext.min.js
+
+cd javascript-extensions
+
+"C:\B\Portable Files (dev)\Google Closure Compiler\closure-compiler-v20231112.jar" --js *.js --js_output_file ../ryzjsext.min.tmp
+
+cd..
+
+type ryzjsext.min.tmp >> ryzjsext.min.js
+
+del ryzjsext.min.tmp
\ No newline at end of file
diff --git a/ryz-js-ext/ryz-js-ext-array.js b/javascript-extensions/ryz-js-ext-array.js
similarity index 100%
rename from ryz-js-ext/ryz-js-ext-array.js
rename to javascript-extensions/ryz-js-ext-array.js
diff --git a/ryz-js-ext/ryz-js-ext-boolean.js b/javascript-extensions/ryz-js-ext-boolean.js
similarity index 100%
rename from ryz-js-ext/ryz-js-ext-boolean.js
rename to javascript-extensions/ryz-js-ext-boolean.js
diff --git a/ryz-js-ext/ryz-js-ext-date.js b/javascript-extensions/ryz-js-ext-date.js
similarity index 100%
rename from ryz-js-ext/ryz-js-ext-date.js
rename to javascript-extensions/ryz-js-ext-date.js
diff --git a/ryz-js-ext/ryz-js-ext-document.js b/javascript-extensions/ryz-js-ext-document.js
similarity index 100%
rename from ryz-js-ext/ryz-js-ext-document.js
rename to javascript-extensions/ryz-js-ext-document.js
diff --git a/ryz-js-ext/ryz-js-ext-math.js b/javascript-extensions/ryz-js-ext-math.js
similarity index 100%
rename from ryz-js-ext/ryz-js-ext-math.js
rename to javascript-extensions/ryz-js-ext-math.js
diff --git a/ryz-js-ext/ryz-js-ext-string.js b/javascript-extensions/ryz-js-ext-string.js
similarity index 100%
rename from ryz-js-ext/ryz-js-ext-string.js
rename to javascript-extensions/ryz-js-ext-string.js
diff --git a/ryz-js-ext/ryz-js-ext-window.js b/javascript-extensions/ryz-js-ext-window.js
similarity index 100%
rename from ryz-js-ext/ryz-js-ext-window.js
rename to javascript-extensions/ryz-js-ext-window.js
diff --git a/ryz-gantts.js b/ryz-gantts.js
index 1e87f64..94ef031 100644
--- a/ryz-gantts.js
+++ b/ryz-gantts.js
@@ -280,6 +280,31 @@ class RyzGantt {
}
}
+ // Calculate work-hours
+ for (var i=0; i
-
+
diff --git a/ryzjsext-version.txt b/ryzjsext-version.txt
new file mode 100644
index 0000000..5db3d74
--- /dev/null
+++ b/ryzjsext-version.txt
@@ -0,0 +1,4 @@
+/**
+ * Ray's JavaScript Extension
+ * @version v0.1.0.051 (2023/12/24 0115)
+ */
diff --git a/ryzjsext.min.js b/ryzjsext.min.js
index b3c4306..4c62448 100644
--- a/ryzjsext.min.js
+++ b/ryzjsext.min.js
@@ -1,4 +1,17 @@
/**
* Ray's JavaScript Extension
- * @version v0.1.0.021 (2023/12/11 0056)
+ * @version v0.1.0.051 (2023/12/24 0115)
*/
+Array.prototype.addRange=function(a){if(null==a)return this;for(let b=0;b{b+=this.count(c.propName,c.value)});return b};
+Array.prototype.index=function(a,b){for(let c=0;ca?this.splice(0,0,b):a>=this.length?this.push(b):this.splice(a,0,b);return this};Array.prototype.joinIfNotNullOrWhitespace=function(a){let b="";for(let c=0;cc[a]?1:0});return this};Array.prototype.orderByDesc=function(a){this.sort(function(b,c){return b[a]c[a]?-1:0});return this};
+Array.prototype.remove=function(a){let b=[];for(let c=0;ca||a>=this.length)return this;this.splice(a,1);return this};Array.prototype.removeRange=function(a){for(let b=0;b{b=b.select(c.propName,c.value)});return b};Boolean.isFalse=function(a){return String.isNullOrUndefined(a)?!0:a.toString().containsCI("false","f","y","0","x")};Boolean.isTrue=function(a){return String.isNullOrUndefined(a)?!1:a.toString().containsCI("true","t","n","1","o")};Boolean.ifTrue=function(a,b,c){return Boolean.isTrue(a)?b:c};Date.addDays=function(a,b){a=new Date(a);a.addDays(b);return a};Date.addMonths=function(a,b){a=new Date(a);a.addMonths(b);return a};Date.addYears=function(a,b){a=new Date(a);a.addYears(b);return a};Date.today=function(){let a=new Date;a.setHours(0);a.setMinutes(0);a.setSeconds(0);a.setMilliseconds(0);return a};Date.prototype.addDays=function(a){this.setDate(this.getDate()+parseInt(a))};Date.prototype.addMonths=function(a){this.setMonth(this.getMonth()+parseInt(a))};
+Date.prototype.addYears=function(a){this.setFullYear(this.getFullYear()+parseInt(a))};
+Date.prototype.toCString=function(a){a=a.replace("fffffff",this.getMilliseconds().toString().padStart(7,"0"));a=a.replace("ffffff",this.getMilliseconds().toString().padStart(6,"0"));a=a.replace("fffff",this.getMilliseconds().toString().padStart(5,"0"));a=a.replace("yyyy",this.getFullYear().toString().padStart(4,"0"));a=a.replace("MMMM","{1}");a=a.replace("dddd","{2}");a=a.replace("ffff",this.getMilliseconds().toString().padStart(4,"0"));a=a.replace("yyy",this.getFullYear().toString().padStart(3,"0"));
+a=a.replace("MMM","{3}");a=a.replace("ddd","{4}");a=a.replace("fff",this.getMilliseconds().toString().padStart(3,"0"));a=a.replace("zzz","");a=a.replace("yy",this.getFullYear().toString().slice(-2));a=a.replace("MM",(this.getMonth()+1).toString().padStart(2,"0"));a=a.replace("dd",this.getDate().toString().padStart(2,"0"));a=a.replace("HH",this.getHours().toString().padStart(2,"0"));a=a.replace("hh",(12=a.trim().length:0>=a.toString().trim().length};String.joinIfNotNullOrWhitespace=function(a,...b){let c="";for(let d=0;d$1")};String.prototype.toTitleCase=function(){let a;a=this.replace(/([A-Z]{1})/g," $1");a=a.trim();return a=a.charAt(0).toUpperCase()+a.substr(1)};String.prototype.getFilename=function(){return this.substring(this.lastIndexOf("/")+1)};Window.goToTop=function(){Window.scrollTo(0,0)};
+Window.fragment={get:function(){if(!window.location.hash)return null;const a=window.location.hash.indexOf("?");return 0>a?window.location.hash.substring(1):window.location.hash.substring(1,a)},getQuery:function(){if(!window.location.hash)return null;var a=window.location.hash;a=a.indexOf("?");if(0>a)return null;a=hasQueryString.substring(a+1);a=new URLSearchParams(a);const b={};for(const [c,d]of a.entries())b[c]=d;return b},clear:function(){location.hash="";history.replaceState("","",location.pathname)}};