414 lines
13 KiB
JavaScript
414 lines
13 KiB
JavaScript
/*
|
|
* My97 DatePicker 4.2
|
|
* SITE: http://dp.my97.net
|
|
* BLOG: http://my97.cnblogs.com
|
|
* MAIL: smallcarrot@163.com
|
|
*/
|
|
var $dp, WdatePicker; (function () {
|
|
var $ = {
|
|
|
|
$wdate: true,
|
|
$crossFrame: false,
|
|
$dpPath: "",
|
|
position: {},
|
|
lang: "auto",
|
|
skin: "default",
|
|
dateFmt: "yyyy-MM-dd",
|
|
realDateFmt: "yyyy-MM-dd",
|
|
realTimeFmt: "HH:mm:ss",
|
|
realFullFmt: "%Date %Time",
|
|
minDate: "1900-01-01 00:00:00",
|
|
maxDate: "2099-12-31 23:59:59",
|
|
startDate: "",
|
|
alwaysUseStartDate: false,
|
|
yearOffset: 1911,
|
|
isShowWeek: false,
|
|
highLineWeekDay: true,
|
|
isShowClear: true,
|
|
isShowToday: true,
|
|
isShowOthers: true,
|
|
readOnly: false,
|
|
errDealMode: 0,
|
|
autoPickDate: null,
|
|
qsEnabled: true,
|
|
|
|
disabledDates: null,
|
|
disabledDays: null,
|
|
opposite: false,
|
|
onpicking: null,
|
|
onpicked: null,
|
|
onclearing: null,
|
|
oncleared: null,
|
|
eCont: null,
|
|
vel: null,
|
|
errMsg: "",
|
|
quickSel: [],
|
|
has: {}
|
|
};
|
|
WdatePicker = S;
|
|
var V = window,
|
|
N = "document",
|
|
H = "documentElement",
|
|
A = "getElementsByTagName",
|
|
T, _, R, G, Z;
|
|
switch (navigator.appName) {
|
|
case "Microsoft Internet Explorer":
|
|
R = true;
|
|
break;
|
|
case "Opera":
|
|
Z = true;
|
|
break;
|
|
default:
|
|
G = true;
|
|
break
|
|
}
|
|
T = V;
|
|
if ($.$crossFrame) {
|
|
try {
|
|
while (T.parent[N] != T[N] && T.parent[N][A]("frameset").length == 0) T = T.parent
|
|
} catch (P) { }
|
|
}
|
|
_ = J();
|
|
if ($.$wdate) K(_ + "skin/WdatePicker.css");
|
|
var L;
|
|
if (T.$dp) {
|
|
try {
|
|
L = (T.$dp.$("MY") == "lIkEmY97")
|
|
} catch (P) {
|
|
L = P.number == -2146823277 ? true : false
|
|
}
|
|
}
|
|
if (!T.$dp || L) {
|
|
$dp = Q({
|
|
ff: G,
|
|
ie: R,
|
|
opera: Z,
|
|
el: null,
|
|
win: V,
|
|
status: L ? 2 : 0,
|
|
defMinDate: $.minDate,
|
|
defMaxDate: $.maxDate,
|
|
$: function (_) {
|
|
try {
|
|
this.win[N]
|
|
} catch ($) {
|
|
return "lIkEmY97"
|
|
}
|
|
return (typeof _ == "string") ? this.win[N].getElementById(_) : _
|
|
},
|
|
$D: function ($, _) {
|
|
return this.$DV(this.$($).value, _)
|
|
},
|
|
$DV: function (_, $) {
|
|
if (_ != "") {
|
|
this.dt = $dp.cal.splitDate(_, $dp.cal.dateFmt);
|
|
if ($) for (var A in $) {
|
|
if (this.dt[A] === undefined) this.errMsg = "invalid property:" + A;
|
|
this.dt[A] += $[A]
|
|
}
|
|
if (this.dt.refresh()) return this.dt
|
|
}
|
|
return ""
|
|
},
|
|
show: function () {
|
|
if (this.dd) this.dd.style.display = "block"
|
|
},
|
|
hide: function () {
|
|
if (this.dd) this.dd.style.display = "none"
|
|
},
|
|
attachEvent: C
|
|
});
|
|
if (!L) X(T,
|
|
function () {
|
|
S(null, true)
|
|
})
|
|
} else $dp = T.$dp;
|
|
if (!V[N].docMD) {
|
|
C(V[N], "onmousedown", B);
|
|
V[N].docMD = true
|
|
}
|
|
if (!T[N].docMD) {
|
|
C(T[N], "onmousedown", B);
|
|
T[N].docMD = true
|
|
}
|
|
C(V, "onunload",
|
|
function () {
|
|
$dp.hide()
|
|
});
|
|
function Q(_) {
|
|
T.$dp = T.$dp || {};
|
|
for (var $ in _) T.$dp[$] = _[$];
|
|
return T.$dp
|
|
}
|
|
function C(A, $, _) {
|
|
if (R) A.attachEvent($, _);
|
|
else {
|
|
var B = $.replace(/on/, "");
|
|
_._ieEmuEventHandler = function ($) {
|
|
return _($)
|
|
};
|
|
A.addEventListener(B, _._ieEmuEventHandler, false)
|
|
}
|
|
}
|
|
function J() {
|
|
var _, A, $ = document.getElementsByTagName("script");
|
|
for (var B = 0; B < $.length; B++) {
|
|
_ = $[B].src.substring(0, $[B].src.toLowerCase().indexOf("wdatepicker.js"));
|
|
A = _.lastIndexOf("/");
|
|
if (A > 0) _ = _.substring(0, A + 1);
|
|
if (_) break
|
|
}
|
|
return _
|
|
}
|
|
function D(F) {
|
|
var E, C;
|
|
if (F.substring(0, 1) != "/" && F.indexOf("://") == -1) {
|
|
E = T.location.href;
|
|
C = location.href;
|
|
if (E.indexOf("?") > -1) E = E.substring(0, E.indexOf("?"));
|
|
if (C.indexOf("?") > -1) C = C.substring(0, C.indexOf("?"));
|
|
var _ = "",
|
|
D = "",
|
|
A = "",
|
|
H, G, B = "";
|
|
for (H = 0; H < Math.max(E.length, C.length); H++) if (E.charAt(H).toLowerCase() != C.charAt(H).toLowerCase()) {
|
|
G = H;
|
|
while (E.charAt(G) != "/") {
|
|
if (G == 0) break;
|
|
G -= 1
|
|
}
|
|
_ = E.substring(G + 1, E.length);
|
|
_ = _.substring(0, _.lastIndexOf("/"));
|
|
D = C.substring(G + 1, C.length);
|
|
D = D.substring(0, D.lastIndexOf("/"));
|
|
break
|
|
}
|
|
if (_ != "") for (H = 0; H < _.split("/").length; H++) B += "../";
|
|
if (D != "") B += D + "/";
|
|
F = B + F
|
|
}
|
|
$.$dpPath = F
|
|
}
|
|
function K(C, $, D) {
|
|
var B = V[N],
|
|
E = B[A]("HEAD").item(0),
|
|
_ = B.createElement("link");
|
|
_.href = C;
|
|
_.rel = "stylesheet";
|
|
_.type = "text/css";
|
|
if ($) _.title = $;
|
|
if (D) _.charset = D;
|
|
E.appendChild(_)
|
|
}
|
|
function X($, _) {
|
|
C($, "onload", _)
|
|
}
|
|
function E($) {
|
|
$ = $ || T;
|
|
var B = 0,
|
|
_ = 0;
|
|
while ($ != T) {
|
|
var D = $.parent[N][A]("iframe");
|
|
for (var F = 0; F < D.length; F++) {
|
|
try {
|
|
if (D[F].contentWindow == $) {
|
|
var E = U(D[F]);
|
|
B += E.left;
|
|
_ += E.top;
|
|
break
|
|
}
|
|
} catch (C) { }
|
|
}
|
|
$ = $.parent
|
|
}
|
|
return {
|
|
"leftM": B,
|
|
"topM": _
|
|
}
|
|
}
|
|
function U(E) {
|
|
if (R) return E.getBoundingClientRect();
|
|
else {
|
|
var A = {
|
|
ROOT_TAG: /^body|html$/i,
|
|
OP_SCROLL: /^(?:inline|table-row)$/i
|
|
},
|
|
G = null,
|
|
_ = E.offsetTop,
|
|
F = E.offsetLeft,
|
|
D = E.offsetWidth,
|
|
B = E.offsetHeight,
|
|
C = E.offsetParent;
|
|
if (C != E) while (C) {
|
|
F += C.offsetLeft;
|
|
_ += C.offsetTop;
|
|
if (C.tagName.toLowerCase() == "body") G = C.ownerDocument.defaultView;
|
|
C = C.offsetParent
|
|
}
|
|
C = E.parentNode;
|
|
while (C.tagName && !A.ROOT_TAG.test(C.tagName)) {
|
|
if (C.scrollTop || C.scrollLeft) if (!A.OP_SCROLL.test(C.style.display)) if (!Z || C.style.overflow !== "visible") {
|
|
F -= C.scrollLeft;
|
|
_ -= C.scrollTop
|
|
}
|
|
C = C.parentNode
|
|
}
|
|
var $ = Y(G);
|
|
F -= $.left;
|
|
_ -= $.top;
|
|
D += F;
|
|
B += _;
|
|
return {
|
|
"left": F,
|
|
"top": _,
|
|
"right": D,
|
|
"bottom": B
|
|
}
|
|
}
|
|
}
|
|
function M($) {
|
|
$ = $ || T;
|
|
var _ = $[N];
|
|
_ = _[H] && _[H].clientHeight && _[H].clientHeight <= _.body.clientHeight ? _[H] : _.body;
|
|
return {
|
|
"width": _.clientWidth,
|
|
"height": _.clientHeight
|
|
}
|
|
}
|
|
function Y($) {
|
|
$ = $ || T;
|
|
var B = $[N],
|
|
A = B[H],
|
|
_ = B.body;
|
|
B = (A && A.scrollTop != null && (A.scrollTop > _.scrollLeft || A.scrollLeft > _.scrollLeft)) ? A : _;
|
|
return {
|
|
"top": B.scrollTop,
|
|
"left": B.scrollLeft
|
|
}
|
|
}
|
|
function B(_) {
|
|
src = _ ? (_.srcElement || _.target) : null;
|
|
if ($dp && $dp.dd && $dp.dd.style.display == "block" && src != $dp.el) {
|
|
var A = $dp.el,
|
|
B = $dp.cal,
|
|
$ = $dp.el[$dp.elProp];
|
|
if ($ != null) {
|
|
$dp.$w.hideSel();
|
|
if ($ != "" && !$dp.readOnly) B.date.loadFromDate(B.splitDate($, B.dateFmt));
|
|
if ($ == "" || (B.isDate(B.date) && B.isTime(B.date) && B.checkValid(B.date))) {
|
|
B.mark(true);
|
|
if ($ != "") B.update();
|
|
else B.setRealValue("");
|
|
$dp.hide()
|
|
} else B.mark(false)
|
|
} else $dp.hide()
|
|
}
|
|
}
|
|
var O = [];
|
|
function W() {
|
|
$dp.status = 2;
|
|
F()
|
|
}
|
|
function F() {
|
|
if (O.length > 0) {
|
|
var $ = O.shift();
|
|
$.el = {
|
|
innerHTML: ""
|
|
};
|
|
$.eCont = $dp.$($.eCont);
|
|
$.autoPickDate = true;
|
|
$.qsEnabled = false;
|
|
I($)
|
|
}
|
|
}
|
|
function S(C, $) {
|
|
$dp.win = V;
|
|
C = C || {};
|
|
if ($) {
|
|
$dp.status = 1;
|
|
I({
|
|
el: {
|
|
innerHTML: ""
|
|
}
|
|
},
|
|
true)
|
|
} else if (C.eCont) {
|
|
O.push(C);
|
|
if ($dp.status == 2) F()
|
|
} else {
|
|
if ($dp.status == 0) $dp.status = 1;
|
|
if ($dp.status != 2) return;
|
|
var B, A = _();
|
|
if (A) {
|
|
B = A.srcElement || A.target;
|
|
A.cancelBubble = true
|
|
}
|
|
C.el = $dp.$(C.el || B);
|
|
if (!C.el || C.el && C.el.disabled || (C.el == $dp.el && $dp.dd.style.display != "none" && $dp.dd.style.left != "-1970px")) return;
|
|
I(C)
|
|
}
|
|
function _() {
|
|
if (G) {
|
|
func = _.caller;
|
|
while (func != null) {
|
|
var $ = func.arguments[0];
|
|
if ($ && ($ + "").indexOf("Event") >= 0) return $;
|
|
func = func.caller
|
|
}
|
|
return null
|
|
}
|
|
return event
|
|
}
|
|
}
|
|
function I(G, A) {
|
|
for (var F in $) if (F.substring(0, 1) != "$") $dp[F] = $[F];
|
|
for (F in G) if ($dp[F] === undefined) $dp.errMsg = "invalid property:" + F;
|
|
else $dp[F] = G[F];
|
|
$dp.elProp = $dp.el && $dp.el.nodeName == "INPUT" ? "value" : "innerHTML";
|
|
if ($dp.el[$dp.elProp] == null) return;
|
|
if ($dp.lang == "auto") $dp.lang = R ? navigator.browserLanguage.toLowerCase() : navigator.language.toLowerCase();
|
|
if (!$dp.dd || $dp.eCont || ($dp.lang && $dp.realLang && $dp.realLang.name != $dp.lang)) {
|
|
if ($dp.dd && !$dp.eCont) T[N].body.removeChild($dp.dd);
|
|
if ($.$dpPath == "") D(_);
|
|
var B = "<iframe src=\"" + $.$dpPath + "My97DatePicker.htm\" frameborder=\"0\" border=\"0\" scrolling=\"no\"></iframe>";
|
|
if ($dp.eCont) {
|
|
$dp.eCont.innerHTML = B;
|
|
X($dp.eCont.childNodes[0], W)
|
|
} else {
|
|
$dp.dd = T[N].createElement("DIV");
|
|
$dp.dd.style.cssText = "position:absolute;z-index:19700";
|
|
$dp.dd.innerHTML = B;
|
|
T[N].body.appendChild($dp.dd);
|
|
X($dp.dd.childNodes[0], W);
|
|
if (A) $dp.dd.style.left = $dp.dd.style.top = "-1970px";
|
|
else {
|
|
$dp.show();
|
|
C()
|
|
}
|
|
}
|
|
} else if ($dp.cal) {
|
|
$dp.show();
|
|
$dp.cal.init();
|
|
C()
|
|
}
|
|
function C() {
|
|
var F = $dp.position.left,
|
|
B = $dp.position.top,
|
|
G = U($dp.el),
|
|
$ = E(V),
|
|
C = M(T),
|
|
A = Y(T),
|
|
D = $dp.dd.offsetHeight,
|
|
_ = $dp.dd.offsetWidth;
|
|
if (isNaN(B)) {
|
|
if (B == "above" || (B != "under" && (($.topM + G.bottom + D > C.height) && ($.topM + G.top - D > 0)))) B = A.top + $.topM + G.top - D - 3;
|
|
else B = A.top + $.topM + G.bottom;
|
|
B += R ? -1 : 1
|
|
} else B += A.top + $.topM;
|
|
if (isNaN(F)) F = A.left + Math.min($.leftM + G.left, C.width - _ - 5) - (R ? 2 : 0);
|
|
else F += A.left + $.leftM;
|
|
$dp.dd.style.top = B + "px";
|
|
$dp.dd.style.left = F + "px"
|
|
}
|
|
}
|
|
})() |