# HG changeset patch
# User bsw
# Date 1612211557 -3600
# Node ID f84824aa529bdf09b3a9d6ce5dde6b81a929fd60
# Parent 89818dc70cb609aa435245259dea2931350a27d7
Removed gregor library
diff -r 89818dc70cb6 -r f84824aa529b app/main/_layout/default.html
--- a/app/main/_layout/default.html Mon Feb 01 21:32:03 2021 +0100
+++ b/app/main/_layout/default.html Mon Feb 01 21:32:37 2021 +0100
@@ -6,7 +6,6 @@
-
diff -r 89818dc70cb6 -r f84824aa529b env/util/gregor.lua
--- a/env/util/gregor.lua Mon Feb 01 21:32:03 2021 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-function util.gregor(el_id, relaxed)
- ui.script{ script =
- 'gregor_addGui({' ..
- 'element_id: "' .. el_id .. '",' ..
- 'month_names: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],' ..
- 'weekday_names: ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],' ..
- 'week_mode: "iso",' ..
- 'week_numbers: "left",' ..
- (relaxed and 'relaxed: true,' or '') ..
- '});'
- }
-end
diff -r 89818dc70cb6 -r f84824aa529b static/gregor.js/gregor.css
--- a/static/gregor.js/gregor.css Mon Feb 01 21:32:03 2021 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-.gregor_sheet {
- border: 1px solid black;
- border-collapse: collapse;
- margin: 0;
- padding: 0;
- background: #fff;
- color: #000;
-}
-.gregor_sheet th, .gregor_sheet td {
- margin: 0;
- font-size: 70%;
-}
-.gregor_year, .gregor_month {
- background-color: #ddd;
- border-bottom: 1px solid black;
- font-weight: normal;
- text-align: center;
-}
-.gregor_year a, .gregor_month a {
- color: #000;
- text-decoration: none;
-}
-.gregor_year a:hover, .gregor_month a:hover {
- color: #f00;
-}
-.gregor_weekday {
- font-size: 80%;
- padding-top: 0.5em;
-}
-.gregor_day {
- padding-bottom: 0.35em;
-}
-
-.gregor_weekday,
-.gregor_day {
- padding-left: 0.25em;
- padding-right: 0.25em;
-}
-.gregor_weeks_left .gregor_weekday,
-.gregor_weeks_left .gregor_day {
- padding-left: 0;
- padding-right: 0.5em;
-}
-.gregor_weeks_right .gregor_weekday,
-.gregor_weeks_right .gregor_day {
- padding-left: 0.5em;
- padding-right: 0;
-}
-.gregor_weekday {
- text-align: center;
-}
-.gregor_weeks_left .gregor_week {
- padding-left: 0.25em;
- padding-right: 0.5em;
-}
-.gregor_weeks_right .gregor_week {
- padding-left: 1em;
- padding-right: 0.25em;
-}
-.gregor_week {
- color: #666;
- font-size: 80%;
- font-weight: normal;
- text-align: right;
-}
-td.gregor_day {
- text-align: right;
-}
-td.gregor_day a {
- background-color: #ddd;
- color: #000;
- display: block;
- padding-bottom: 0.25ex;
- padding-right: 0.25em;
- padding-top: 0.25ex;
- text-decoration: none;
- width: 2em;
-}
-td.gregor_day.gregor_sat a {
- background-color: #bbb;
-}
-td.gregor_day.gregor_sun a {
- background-color: #ea9;
-}
-td.gregor_day.gregor_today a {
- font-weight: bold;
-}
-td.gregor_day.gregor_selected a {
- background-color: #444;
- color: #fff;
-}
-
diff -r 89818dc70cb6 -r f84824aa529b static/gregor.js/gregor.js
--- a/static/gregor.js/gregor.js Mon Feb 01 21:32:03 2021 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,849 +0,0 @@
-//
-// Copyright (c) 2009 Public Software Group e. V., Berlin
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-//
-// All date calculations are based on the gregorian calender, also for
-// dates before 1582 (before the gegorian calendar was introduced).
-// The supported range is from January 1st 0001 up to December 31st 9999.
-//
-// gregor_daycount({year: , month: , day: }) returns
-// the number of days between the given date and January 1st 0001 (greg.).
-//
-// gregor_completeDate({year: , month: , day: }) returns
-// a structure (an object) with the following properties:
-// - daycount (days since January 1st 0001, see gregor_daycount)
-// - year (with century)
-// - month (from 1 to 12)
-// - day (from 1 to 28, 29, 30 or 31)
-// - iso_string (string with format YYYY-MM-DD)
-// - us_weekday (from 0 for Sunday to 6 for Monday)
-// - iso_weekday (from 0 for Monday to 6 for Sunday)
-// - iso_weekyear (Year containing greater part of week st. w. Monday)
-// - iso_week (from 1 to 52 or 53)
-// - us_week (from 1 to 53 or 54)
-//
-// The structure (the object) passed as parameter to gregor_daycount or
-// gregor_completeDate may describe a date in the following ways:
-// - daycount
-// - year, month, day
-// - year, us_week, us_weekday
-// - year, iso_week, iso_weekday
-// - iso_weekyear, iso_week, iso_weekday
-//
-// gregor_sheet({...}) returns a calendar sheet as DOM object. The
-// structure (the object) passed to the function as an argument is altered
-// by the function and used to store state variables. Initially it can
-// contain the following fields:
-// - year (year to show, defaults to todays year)
-// - month (month to show, defaults to todays month)
-// - today (structure describing a day, e.g. year, month, day)
-// - selected (structure describing a day, e.g. year, month, day)
-// - navigation ("enabled", "disabled", "hidden", default "enabled")
-// - week_mode ("iso" or "us", defaults to "iso")
-// - week_numbers ("left", "right" or null, defaults to null)
-// - month_names (e.g. ["January", "Feburary", ...])
-// - weekday_names (e.g. ["Mon", "Tue", ...] or ["Sun", "Mon", ...])
-// - day_callback (function to render a cell)
-// - select_callback (function to be called, when a date was selected)
-// - element (for internal use only)
-// If "today" is undefined, it is automatically intitialized with the
-// current clients date. If "selected" is undefined or null, no date is
-// be initially selected. It is mandatory to provide month_names and
-// weekday_names.
-//
-// gregor_addGui({...}) alters a referenced input field in a way that
-// focussing on it causes a calendar being shown at its right side, where a
-// date can be selected. The structure (the object) passed to this function
-// is only evaluated once, and never modified. All options except "element"
-// of the gregor_sheet({...}) function may be used as options to
-// gregor_addGui({...}) as well. In addition an "element_id" must be
-// provided as argument, containing the id of a text input field. The
-// behaviour caused by the options "selected" and "select_callback" are
-// slightly different: If "selected" === undefined, then the current value
-// of the text field referenced by "element_id" will be parsed and used as
-// date selection. If "selected" === null, then no date will be initially
-// selected, and the text field will be cleared. The "select_callback"
-// function is always called once with the pre-selected date (or with null,
-// if no date is initially selected). Whenever the selected date is changed
-// or unselected later, the callback function is called again with the new
-// date (or with null, in case of deselection). When the relaxed argument is set
-// the calendar will not normalize the parsed date. Thats usefull if you wan't to
-// allow relaxed input.
-//
-// EXAMPLE:
-//
-//
-//
-//
-
-
-
-
-// Internal constants and helper functions for date calculation
-
-
-gregor_c1 = 365; // days of a non-leap year
-gregor_c4 = 4 * gregor_c1 + 1; // days of a full 4 year cycle
-gregor_c100 = 25 * gregor_c4 - 1; // days of a full 100 year cycle
-gregor_c400 = 4 * gregor_c100 + 1; // days of a full 400 year cycle
-
-gregor_normalMonthOffsets = [
- 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
-];
-
-function gregor_getMonthOffset(year, month) {
- if (
- (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) &&
- month > 2
- ) return gregor_normalMonthOffsets[month-1] + 1;
- else return gregor_normalMonthOffsets[month-1];
-}
-
-function gregor_formatInteger(int, digits) {
- var result = int.toFixed();
- if (digits != null) {
- while (result.length < digits) result = "0" + result;
- }
- return result;
-}
-
-
-
-// Calculate days since January 1st 0001 (Gegorian) for a given date
-
-
-function gregor_daycount(obj) {
- if (
- obj.daycount >= 0 && obj.daycount <= 3652058 && obj.daycount % 1 == 0
- ) {
- return obj.daycount;
- } else if (
- obj.year >= 1 && obj.year <= 9999 && obj.year % 1 == 0 &&
- obj.month >= 1 && obj.month <= 12 && obj.month % 1 == 0 &&
- obj.day >= 0 && obj.day <= 31 && obj.day % 1 == 0
- ) {
- var n400 = Math.floor((obj.year-1) / 400);
- var r400 = (obj.year-1) % 400;
- var n100 = Math.floor(r400 / 100);
- var r100 = r400 % 100;
- var n4 = Math.floor(r100 / 4);
- var n1 = r100 % 4;
- return (
- gregor_c400 * n400 +
- gregor_c100 * n100 +
- gregor_c4 * n4 +
- gregor_c1 * n1 +
- gregor_getMonthOffset(obj.year, obj.month) + (obj.day - 1)
- );
- } else if (
- (
- (
- obj.year >= 1 && obj.year <= 9999 &&
- obj.year % 1 == 0 && obj.iso_weekyear == null
- ) || (
- obj.iso_weekyear >= 1 && obj.iso_weekyear <= 9999 &&
- obj.iso_weekyear % 1 == 0 && obj.year == null
- )
- ) &&
- obj.iso_week >= 0 && obj.iso_week <= 53 && obj.iso_week % 1 == 0 &&
- obj.iso_weekday >= 0 && obj.iso_weekday <= 6 &&
- obj.iso_weekday % 1 == 0
- ) {
- var jan4th = gregor_daycount({
- year: (obj.year != null) ? obj.year : obj.iso_weekyear,
- month: 1,
- day: 4
- });
- var monday0 = jan4th - (jan4th % 7) - 7; // monday of week 0
- return monday0 + 7 * obj.iso_week + obj.iso_weekday;
- } else if (
- obj.year >= 1 && obj.year <= 9999 && obj.year % 1 == 0 &&
- obj.us_week >= 0 && obj.us_week <= 54 && obj.us_week % 1 == 0 &&
- obj.us_weekday >= 0 && obj.us_weekday <= 6 && obj.us_weekday % 1 == 0
- ) {
- var jan1st = gregor_daycount({
- year: obj.year,
- month: 1,
- day: 1
- });
- var sunday0 = jan1st - ((jan1st+1) % 7) - 7; // sunday of week 0
- return sunday0 + 7 * obj.us_week + obj.us_weekday;
- }
-}
-
-
-
-// Calculate all calendar related numbers for a given date
-
-
-function gregor_completeDate(obj) {
- if (
- obj.daycount >= 0 && obj.daycount <= 3652058 && obj.daycount % 1 == 0
- ) {
- var daycount = obj.daycount;
- var n400 = Math.floor(daycount / gregor_c400);
- var r400 = daycount % gregor_c400;
- var n100 = Math.floor(r400 / gregor_c100);
- var r100 = r400 % gregor_c100;
- if (n100 == 4) { n100 = 3; r100 = gregor_c100; }
- var n4 = Math.floor(r100 / gregor_c4);
- var r4 = r100 % gregor_c4;
- var n1 = Math.floor(r4 / gregor_c1);
- var r1 = r4 % gregor_c1;
- if (n1 == 4) { n1 = 3; r1 = gregor_c1; }
- var year = 1 + 400 * n400 + 100 * n100 + 4 * n4 + n1;
- var month = 1 + Math.floor(r1 / 31);
- var monthOffset = gregor_getMonthOffset(year, month);
- if (month < 12) {
- var nextMonthOffset = gregor_getMonthOffset(year, month + 1);
- if (r1 >= nextMonthOffset) {
- month++;
- monthOffset = nextMonthOffset;
- }
- }
- var day = 1 + r1 - monthOffset;
- var iso_string = ("" +
- gregor_formatInteger(year, 4) + "-" +
- gregor_formatInteger(month, 2) + "-" +
- gregor_formatInteger(day, 2)
- );
- var us_weekday = (daycount+1) % 7;
- var iso_weekday = daycount % 7;
- var iso_weekyear = year;
- if (
- month == 1 && (
- (day == 3 && iso_weekday == 6) ||
- (day == 2 && iso_weekday >= 5) ||
- (day == 1 && iso_weekday >= 4)
- )
- ) iso_weekyear--;
- else if (
- month == 12 && (
- (day == 29 && iso_weekday == 0) ||
- (day == 30 && iso_weekday <= 1) ||
- (day == 31 && iso_weekday <= 2)
- )
- ) iso_weekyear++;
- var jan4th = gregor_daycount({year: iso_weekyear, month: 1, day: 4});
- var monday0 = jan4th - (jan4th % 7) - 7; // monday of week 0
- var iso_week = Math.floor((daycount - monday0) / 7);
- var jan1st = gregor_daycount({year: year, month: 1, day: 1});
- var sunday0 = jan1st - ((jan1st+1) % 7) - 7; // sunday of week 0
- var us_week = Math.floor((daycount - sunday0) / 7);
- return {
- daycount: daycount,
- year: year,
- month: month,
- day: day,
- iso_string: iso_string,
- us_weekday: (daycount+1) % 7, // 0 = Sunday
- iso_weekday: daycount % 7, // 0 = Monday
- iso_weekyear: iso_weekyear,
- iso_week: iso_week,
- us_week: us_week
- };
- } else if (obj.daycount == null) {
- var daycount = gregor_daycount(obj);
- if (daycount != null) {
- return gregor_completeDate({daycount: gregor_daycount(obj)});
- }
- }
-}
-
-
-
-// Test gregor_daycount and gregor_completeDate for consistency
-// (Debugging only)
-
-
-function gregor_test() {
- for (i=650000; i<900000; i++) {
- var obj = gregor_completeDate({daycount: i});
- var j;
- j = gregor_daycount({
- year: obj.year,
- month: obj.month,
- day: obj.day
- });
- if (i != j) { alert("ERROR"); return; }
- j = gregor_daycount({
- iso_weekyear: obj.iso_weekyear,
- iso_week: obj.iso_week,
- iso_weekday: obj.iso_weekday
- });
- if (i != j) { alert("ERROR"); return; }
- j = gregor_daycount({
- year: obj.year,
- iso_week:
- (obj.iso_weekyear == obj.year + 1) ? 53 :
- (obj.iso_weekyear == obj.year - 1) ? 0 :
- obj.iso_week,
- iso_weekday: obj.iso_weekday
- });
- if (i != j) { alert("ERROR"); return; }
- j = gregor_daycount({
- year: obj.year,
- us_week: obj.us_week,
- us_weekday: obj.us_weekday
- });
- if (i != j) { alert("ERROR"); return; }
- }
- alert("SUCCESS");
-}
-
-
-
-// Graphical calendar
-
-
-gregor_iso_weekday_css = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
-
-function gregor_sheet(args) {
-
- // setting args.today and args.selected
- if (args.today === undefined) {
- var js_date = new Date();
- args.today = gregor_completeDate({
- year: js_date.getFullYear(),
- month: js_date.getMonth() + 1,
- day: js_date.getDate()
- });
- } else if (args.today != null) {
- args.today = gregor_completeDate(args.today);
- }
- if (args.selected == "today") {
- args.selected = args.today;
- } else if (args.selected != null) {
- args.selected = gregor_completeDate(args.selected);
- }
-
- // setting args.year and args.month
- if (args.year == null) {
- if (args.selected != null) args.year = args.selected.year;
- else args.year = args.today.year;
- }
- if (args.month == null) {
- if (args.selected != null) args.month = args.selected.month;
- else args.month = args.today.month;
- }
-
- // setting first_day
- var first_day = gregor_completeDate({
- year: args.year,
- month: args.month,
- day: 1
- });
- if (first_day == null) return;
-
- // checking args.navigation, args.week_mode and args.week_numbers
- if (args.navigation == null) args.navigation = "enabled";
- else if (
- args.navigation != "enabled" &&
- args.navigation != "disabled" &&
- args.navigation != "hidden"
- ) return;
- if (args.week_mode == null) args.week_mode = "iso";
- else if (args.week_mode != "iso" && args.week_mode != "us") return;
- if (
- args.week_numbers != null &&
- args.week_numbers != "left" &&
- args.week_numbers != "right"
- ) return;
-
- // checking args.month.names and args.weekday_names
- if (args.month_names.length != 12) return;
- if (args.weekday_names.length != 7) return;
-
- // calculating number of days in month
- var count;
- if (args.year < 9999 || args.month < 12) {
- count = gregor_daycount({
- year: (args.month == 12) ? (args.year + 1) : args.year,
- month: (args.month == 12) ? 1 : (args.month + 1),
- day: 1
- }) - first_day.daycount;
- } else {
- // workaround for year 9999
- count = 31;
- }
-
- // locale variables for UI construction
- var table, row, cell, element;
-
- // take table element from args.element,
- // if neccessary create and store it
- if (args.element == null) {
- table = document.createElement("table");
- args.element = table;
- } else {
- table = args.element;
- while (table.firstChild) table.removeChild(table.firstChild);
- }
-
- // set CSS class of table according to args.week_numbers
- if (args.week_numbers == "left") {
- table.className = "gregor_sheet gregor_weeks_left";
- } else if (args.week_numbers == "right") {
- table.className = "gregor_sheet gregor_weeks_right";
- } else {
- table.className = "gregor_sheet gregor_weeks_none";
- }
-
- // begin of table head
- var thead = document.createElement("thead");
-
- // navigation
- if (args.navigation != "hidden") {
-
- // UI head row containing the year
- row = document.createElement("tr");
- row.className = "gregor_year_row";
- cell = document.createElement("th");
- cell.className = "gregor_year";
- cell.colSpan = args.week_numbers ? 8 : 7;
- if (args.navigation == "enabled") {
- element = document.createElement("a");
- element.className = "gregor_turn gregor_turn_left";
- element.style.cssFloat = "left";
- element.style.styleFloat = "left";
- element.href = "#";
- element.onclick = function() {
- if (args.year > 1) args.year--;
- gregor_sheet(args);
- return false;
- }
- element.ondblclick = element.onclick;
- element.appendChild(document.createTextNode("<<"));
- cell.appendChild(element);
- element = document.createElement("a");
- element.className = "gregor_turn gregor_turn_right";
- element.style.cssFloat = "right";
- element.style.styleFloat = "right";
- element.href = "#";
- element.onclick = function() {
- if (args.year < 9999) args.year++;
- gregor_sheet(args);
- return false;
- }
- element.ondblclick = element.onclick;
- element.appendChild(document.createTextNode(">>"));
- cell.appendChild(element);
- }
- cell.appendChild(document.createTextNode(first_day.year));
- row.appendChild(cell);
- thead.appendChild(row);
-
- // UI head row containing the month
- row = document.createElement("tr");
- row.className = "gregor_month_row";
- cell = document.createElement("th");
- cell.className = "gregor_month";
- cell.colSpan = args.week_numbers ? 8 : 7;
- if (args.navigation == "enabled") {
- element = document.createElement("a");
- element.className = "gregor_turn gregor_turn_left";
- element.style.cssFloat = "left";
- element.style.styleFloat = "left";
- element.href = "#";
- element.onclick = function() {
- if (args.year > 1 || args.month > 1) {
- args.month--;
- if (args.month < 1) {
- args.month = 12;
- args.year--;
- }
- }
- gregor_sheet(args);
- return false;
- }
- element.ondblclick = element.onclick;
- element.appendChild(document.createTextNode("<<"));
- cell.appendChild(element);
- element = document.createElement("a");
- element.className = "gregor_turn gregor_turn_right";
- element.style.cssFloat = "right";
- element.style.styleFloat = "right";
- element.href = "#";
- element.onclick = function() {
- if (args.year < 9999 || args.month < 12) {
- args.month++;
- if (args.month > 12) {
- args.month = 1;
- args.year++;
- }
- }
- gregor_sheet(args);
- return false;
- }
- element.ondblclick = element.onclick;
- element.appendChild(document.createTextNode(">>"));
- cell.appendChild(element);
- }
- cell.appendChild(document.createTextNode(
- args.month_names[first_day.month-1]
- ));
- row.appendChild(cell);
- thead.appendChild(row);
-
- // end of navigation
- }
-
- // UI weekday row
- row = document.createElement("tr");
- row.className = "gregor_weekday_row";
- if (args.week_numbers == "left") {
- cell = document.createElement("th");
- cell.className = "gregor_corner";
- row.appendChild(cell);
- }
- for (var i=0; i<7; i++) {
- cell = document.createElement("th");
- cell.className = (
- "gregor_weekday gregor_" +
- gregor_iso_weekday_css[(args.week_mode == "us") ? ((i+6)%7) : i]
- );
- cell.appendChild(document.createTextNode(args.weekday_names[i]));
- row.appendChild(cell);
- }
- if (args.week_numbers == "right") {
- cell = document.createElement("th");
- cell.className = "gregor_corner";
- row.appendChild(cell);
- }
- thead.appendChild(row);
-
- // end of table head and begin of table body
- table.appendChild(thead);
- var tbody = document.createElement("tbody");
-
- // definition of insert_week function
- var week = (
- (args.week_mode == "us") ? first_day.us_week : first_day.iso_week
- );
- insert_week = function() {
- cell = document.createElement("th");
- cell.className = "gregor_week";
- cell.appendChild(document.createTextNode(
- (week < 10) ? ("0" + week) : week)
- );
- week++;
- if (
- args.week_mode == "iso" && (
- (
- args.month == 1 && week > 52
- ) || (
- args.month == 12 && week == 53 && (
- first_day.iso_weekday == 0 ||
- first_day.iso_weekday == 5 ||
- first_day.iso_weekday == 6
- )
- )
- )
- ) week = 1;
- row.appendChild(cell);
- }
-
- // output data fields
- row = document.createElement("tr");
- if (args.week_numbers == "left") insert_week();
- var filler_count = (
- (args.week_mode == "us") ? first_day.us_weekday : first_day.iso_weekday
- );
- for (var i=0; i 2) {
- year = parseInt(numericPart, 10);
- }
- } else if (formatPart.match(/^M+$/)) {
- month = parseInt(numericPart, 10);
- } else if (formatPart.match(/^D+$/)) {
- day = parseInt(numericPart, 10);
- } else {
- //alert("Not implemented.");
- return null;
- }
- }
- return gregor_completeDate({year: year, month: month, day: day});
-}
-
-function gregor_addGui(args) {
-
- // copy argument structure
- var state = {};
- for (key in args) state[key] = args[key];
-
- // unset state.element, which should never be set anyway
- state.element = null;
-
- // save original values of "year" and "month" options
- var original_year = state.year;
- var original_month = state.month;
-
- // get text field element
- var element = document.getElementById(state.element_id);
- state.element_id = null;
-
- // setup state.today, state.selected and state.format options
- if (state.today === undefined) {
- var js_date = new Date();
- state.today = gregor_completeDate({
- year: js_date.getFullYear(),
- month: js_date.getMonth() + 1,
- day: js_date.getDate()
- });
- } else if (state.today != null) {
- state.today = gregor_completeDate(args.today);
- }
- if (state.selected == "today") {
- state.selected = state.today;
- } else if (args.selected != null) {
- state.selected = gregor_completeDate(state.selected);
- }
- if (state.format == null) state.format = "YYYY-MM-DD";
-
- // using state.future to calculate maxYear (for 2 digit year conversions)
- var maxYear = (state.today == null) ? null : (
- state.today.year +
- ((state.future == null) ? 12 : state.future)
- );
-
- // hook into state.select_callback
- var select_callback = state.select_callback;
- state.select_callback = function(date) {
- element.value = gregor_formatDate(state.format, date);
- if (select_callback) select_callback(date);
- };
- // function to parse text field and update calendar sheet state
- var updateSheet = function(terminated) {
- var date = gregor_parseDate(
- state.format, element.value, terminated, maxYear
- );
- if (date) {
- state.year = null;
- state.month = null;
- }
- state.selected = date;
- gregor_sheet(state);
- };
-
- // Initial synchronization
- if (state.selected === undefined) updateSheet(true);
- if (!state.relaxed)
- element.value = gregor_formatDate(state.format, state.selected);
-
- if (select_callback) select_callback(state.selected);
-
- // variables storing popup status
- var visible = false;
- var focus = false;
- var protection = false;
-
- // event handlers for text field
- element.onfocus = function() {
- focus = true;
- if (!visible) {
- state.year = original_year;
- state.month = original_month;
- gregor_sheet(state);
- state.element.style.position = "absolute";
- state.element.style.top = gregor_getAbsoluteTop(element) + element.offsetHeight;
- state.element.style.left = gregor_getAbsoluteLeft(element);
- state.element.onmousedown = function() {
- protection = true;
- };
- state.element.onmouseup = function() {
- protection = false;
- element.focus();
- };
- state.element.onmouseout = state.element.onmouseup;
- element.parentNode.appendChild(state.element);
- visible = true;
- }
- };
- element.onblur = function() {
- focus = false;
- window.setTimeout(function() {
- if (visible && !focus && !protection) {
- updateSheet(true);
- if(!state.relaxed)
- element.value = gregor_formatDate(state.format, state.selected);
- if (select_callback) select_callback(state.selected);
- state.element.parentNode.removeChild(state.element);
- visible = false;
- protection = false;
- }
- }, 1);
- };
- element.onkeyup = function() {
- updateSheet(false);
- if (select_callback) select_callback(state.selected);
- };
-
-}
-