(function () {
function replaceSelectOption (select, text, value, defValue) {
if (2 > arguments.length)
throw new Error;
if (! /^(SELECT|DATALIST)$/.test (select.tagName))
throw new Error;
if (! Array.isArray (text))
throw new Error;
if ('undefined' === typeof value)
value = text;
defValue = String (defValue) || '';
var doc = select.ownerDocument;
var opt = doc.createElement ('option');
var fgm = doc.createDocumentFragment ();
var i, I, o;
while (select.hasChildNodes ())
select.removeChild (select.firstChild);
for (i = 0, I = text.length; i < I; i++) {
o = opt.cloneNode (false);
o.text = String (text[i]);
o.value = String (value[i]);
if (o.value === defValue)
o.selected = true;
fgm.appendChild (o);
}
select.appendChild (fgm);
}
function range (start, end, step) {
var result = [ ];
var i;
switch (arguments.length) {
case 2 : step = (start <= end) ? 1: -1;
case 3 : break;
default : throw new Error (); break;
}
for (i = start; i <= end; i += step)
result.push (i);
return result;
}
function replaceSelectYear () {
var D = this.date;
var s = D.start.getFullYear ();
var e = D.end.getFullYear ();
var d = D.selected.getFullYear ();
var T = [ ];
if (this.nendo) {
if (3 > D.start.getMonth ()) s -= 1;
if (3 > D.end.getMonth ()) e -= 1;
if (3 > D.selected.getMonth ()) d -= 1;
}
T = range (s, e);
if (this.yearReverse) T.reverse ();
if (this.blankSpace) T.unshift ('');
replaceSelectOption (this.select.year, T, T, d);
}
function toMonth (n) { return 12 < n ? n -12: n; }
function replaceSelectMonth () {
var DT = this.date;
var Y = parseInt (this.select.year.value, 10);
var T = [ ];
var V = [ ];
var y, m, s, e, d;
if (this.nendo) {
m = DT.start.getMonth () + 1;
y = DT.start.getFullYear () + ((4 > m) ? -1: 0);
s = (Y == y) ? (4 > m ? 12 + m: m): 4;
m = DT.end.getMonth () + 1;
y = DT.end.getFullYear () + ((4 > m) ? -1: 0);
e = (Y == y) ? (4 > m ? 12 + m: m): 15;
m = DT.selected.getMonth () + 1;
y = DT.selected.getFullYear () + ((4 > m) ? -1: 0);
d = (Y == y) ? (4 > m ? 12 + m: m): '';
V = range (s, e);
T = V.map (toMonth);
}
else {
d = DT.selected.getFullYear () === Y ? DT.selected.getMonth () +1: null;
T = V = range (
(DT.start.getFullYear () === Y ? DT.start.getMonth () +1: 1),
(DT.end.getFullYear () === Y ? DT.end.getMonth () +1 : 12)
);
}
if (this.blankSpace) {
T.unshift ('');
V.unshift ('');
}
replaceSelectOption (this.select.month, T, V, d);
}
function replaceSelectDay () {
var DT = this.date;
var Y = parseInt (this.select.year.value, 10);
var M = parseInt (this.select.month.value, 10);
var T = [ ];
var y, m, s, e, d;
if (this.nendo) {
m = DT.start.getMonth () + 1;
y = DT.start.getFullYear () + ((4 > m) ? -1: 0);
s = ((Y !== y) || (M !== (4 > m ? 12 + m: m))) ? DT.start.getDate (): 1;
m = DT.end.getMonth () + 1;
y = DT.end.getFullYear () + ((4 > m) ? -1: 0);
e = (((Y !== y) || (M !== (4 > m ? 12 + m: m))) ? new Date (Y, M, 0): DT.end).getDate ();
m = DT.selected.getMonth () + 1;
y = DT.selected.getFullYear () + ((4 > m) ? -1: 0);
d = ((Y !== y) || (M !== (4 > m ? 12 + m: m))) ? '': DT.selected.getDate ();
}
else {
s = (DT.start.getFullYear () !== Y || DT.start.getMonth () +1 !== M)
? 1
: DT.start.getDate ();
e = ((DT.end.getFullYear () !== Y || DT.end.getMonth () +1 !== M)
? new Date (Y, M, 0)
: DT.end
).getDate ();
d = (DT.selected.getFullYear () !== Y || DT.selected.getMonth () +1 !== M)
? ''
: DT.selected.getDate ();
}
T = range (s, e);
if (this.blankSpace) T.unshift ('');
replaceSelectOption (this.select.day, T, T, d);
}
function AuxiliaryFormDate (select, date, cbFunc, cbObj) {
this.select = select;
this.date = date;
this.cbFunc = cbFunc;
this.cbObj = cbObj;
}
function reset_select () {
replaceSelectYear.call (this);
handleEvent.call (this, { target: this.select.year });
}
function jump () {
var S = this.select;
var y = parseInt (S.year.value, 10);
var m, d;
if (! isNaN (y)) {
if (! S.month || ! isNaN (m = parseInt (S.month.value, 10))) {
if (! S.day || ! isNaN (d = parseInt (S.day.value, 10))) {
if (this.nendo) {
if (this.funcArgType) {
if (12 < m) {
m -= 12;
y += 1;
}
}
}
}
}
this.cbFunc.call (this.cbObj, y, m || null, d || null);
}
}
function handleEvent (event) {
var t = event.target;
var S = this.select;
var y, m, d;
if (S.year === t) {
if (S.month) {
replaceSelectMonth.call (this);
t = S.month;
}
}
if (S.month)
if (S.month === t)
if (S.day)
replaceSelectDay.call (this);
if (! this.disabled)
if ('function' === typeof this.cbFunc)
jump.call (this);
}
function create (ySelect, mSelect, dSelect, startDate, endDate, selectedDate, options, cbFunc, cbObj) {
var obj, tm0, tm1, tm2;
if (1 > arguments.length)
throw new Error;
tm0 = startDate.getTime ();
tm1 = endDate.getTime ();
tm2 = selectedDate.getTime ();
if (tm2 < tm0 || tm1 < tm2 || tm1 < tm0)
throw new Error ('日付の値が範囲外');
obj = new AuxiliaryFormDate (
{
year : ySelect,
month : mSelect,
day : dSelect
},
{
start : startDate || new Date,
end : endDate || new Date,
selected: selectedDate || new Date
},
cbFunc,
cbObj
);
obj.disabled = false;
obj.blankSpace = true;
obj.yearReverse = true;
obj.nendo = false;
obj.funcArgType = false;
if (options)
if ('object' === typeof options)
for (opt in options)
if(options.hasOwnProperty (opt))
obj[opt] = options[opt];
obj.reset ();
ySelect.addEventListener ('change', obj, false);
if (mSelect)
mSelect.addEventListener ('change', obj, false);
if (dSelect)
dSelect.addEventListener ('change', obj, false);
return obj;
}
AuxiliaryFormDate.prototype.handleEvent = handleEvent;
AuxiliaryFormDate.prototype.reset = reset_select;
AuxiliaryFormDate.create = create;
this.AuxiliaryFormDate = AuxiliaryFormDate;
}) ();