|
namespace("kivi", function(ns) {
|
|
"use strict";
|
|
|
|
ns._locale = {};
|
|
ns._date_format = {
|
|
sep: '.',
|
|
y: 2,
|
|
m: 1,
|
|
d: 0
|
|
};
|
|
ns._time_format = {
|
|
sep: ':',
|
|
h: 0,
|
|
m: 1,
|
|
};
|
|
ns._number_format = {
|
|
decimalSep: ',',
|
|
thousandSep: '.'
|
|
};
|
|
|
|
ns.setup_formats = function(params) {
|
|
var res = (params.dates || "").match(/^([ymd]+)([^a-z])([ymd]+)[^a-z]([ymd]+)$/);
|
|
if (res) {
|
|
ns._date_format = { sep: res[2] };
|
|
ns._date_format[res[1].substr(0, 1)] = 0;
|
|
ns._date_format[res[3].substr(0, 1)] = 1;
|
|
ns._date_format[res[4].substr(0, 1)] = 2;
|
|
}
|
|
|
|
res = (params.times || "").match(/^([hm]+)([^a-z])([hm]+)$/);
|
|
if (res) {
|
|
ns._time_format = { sep: res[2] };
|
|
ns._time_format[res[1].substr(0, 1)] = 0;
|
|
ns._time_format[res[3].substr(0, 1)] = 1;
|
|
}
|
|
|
|
res = (params.numbers || "").match(/^\d*([^\d]?)\d+([^\d])\d+$/);
|
|
if (res)
|
|
ns._number_format = {
|
|
decimalSep: res[2],
|
|
thousandSep: res[1]
|
|
};
|
|
};
|
|
|
|
ns.parse_date = function(date) {
|
|
if (date === undefined)
|
|
return undefined;
|
|
|
|
if (date === '')
|
|
return null;
|
|
|
|
if (date === '0' || date === '00')
|
|
return new Date();
|
|
|
|
var parts = date.replace(/\s+/g, "").split(ns._date_format.sep);
|
|
var today = new Date();
|
|
|
|
// without separator?
|
|
// assume fixed pattern, and extract parts again
|
|
if (parts.length == 1) {
|
|
date = parts[0];
|
|
parts = date.match(/../g);
|
|
if (date.length == 8) {
|
|
parts[ns._date_format.y] += parts.splice(ns._date_format.y + 1, 1)
|
|
}
|
|
else
|
|
if (date.length == 6 || date.length == 4) {
|
|
}
|
|
else
|
|
if (date.length == 1 || date.length == 2) {
|
|
parts = []
|
|
parts[ ns._date_format.y ] = today.getFullYear();
|
|
parts[ ns._date_format.m ] = today.getMonth() + 1;
|
|
parts[ ns._date_format.d ] = date;
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
if (parts.length == 3) {
|
|
var year = +parts[ ns._date_format.y ] || 0 * 1 || (new Date()).getFullYear();
|
|
if (year > 9999)
|
|
return undefined;
|
|
if (year < 100) {
|
|
year += year > 70 ? 1900 : 2000;
|
|
}
|
|
date = new Date(
|
|
year,
|
|
(parts[ ns._date_format.m ] || (today.getMonth() + 1)) * 1 - 1, // Months are 0-based.
|
|
(parts[ ns._date_format.d ] || today.getDate()) * 1
|
|
);
|
|
} else if (parts.length == 2) {
|
|
date = new Date(
|
|
(new Date()).getFullYear(),
|
|
(parts[ (ns._date_format.m > ns._date_format.d) * 1 ] || (today.getMonth() + 1)) * 1 - 1, // Months are 0-based.
|
|
(parts[ (ns._date_format.d > ns._date_format.m) * 1 ] || today.getDate()) * 1
|
|
);
|
|
} else
|
|
return undefined;
|
|
|
|
return isNaN(date.getTime()) ? undefined : date;
|
|
};
|
|
|
|
ns.format_date = function(date) {
|
|
if (isNaN(date.getTime()))
|
|
return undefined;
|
|
|
|
var parts = [ "", "", "" ]
|
|
parts[ ns._date_format.y ] = date.getFullYear();
|
|
parts[ ns._date_format.m ] = (date.getMonth() < 9 ? "0" : "") + (date.getMonth() + 1); // Months are 0-based, but days are 1-based.
|
|
parts[ ns._date_format.d ] = (date.getDate() < 10 ? "0" : "") + date.getDate();
|
|
return parts.join(ns._date_format.sep);
|
|
};
|
|
|
|
ns.parse_time = function(time) {
|
|
var now = new Date();
|
|
|
|
if (time === undefined)
|
|
return undefined;
|
|
|
|
if (time === '')
|
|
return null;
|
|
|
|
if (time === '0')
|
|
return now;
|
|
|
|
// special case 1: military time in fixed "hhmm" format
|
|
if (time.length == 4) {
|
|
var res = time.match(/(\d\d)(\d\d)/);
|
|
if (res) {
|
|
now.setHours(res[1], res[2]);
|
|
return now;
|
|
} else {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
var parts = time.replace(/\s+/g, "").split(ns._time_format.sep);
|
|
if (parts.length == 2) {
|
|
for (var idx in parts) {
|
|
if (Number.isNaN(Number.parseInt(parts[idx])))
|
|
return undefined;
|
|
}
|
|
now.setHours(parts[ns._time_format.h], parts[ns._time_format.m]);
|
|
return now;
|
|
} else
|
|
return undefined;
|
|
}
|
|
|
|
ns.format_time = function(date) {
|
|
if (isNaN(date.getTime()))
|
|
return undefined;
|
|
|
|
var parts = [ "", "" ]
|
|
parts[ ns._time_format.h ] = date.getHours().toString().padStart(2, '0');
|
|
parts[ ns._time_format.m ] = date.getMinutes().toString().padStart(2, '0');
|
|
return parts.join(ns._time_format.sep);
|
|
};
|
|
|
|
ns.parse_amount = function(amount) {
|
|
if (amount === undefined)
|
|
return undefined;
|
|
|
|
|