|
|
|
/**
|
|
|
|
* 基本函数
|
|
|
|
* Create By GUY 2014\11\17
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
_global = undefined;
|
|
|
|
if (typeof window !== "undefined") {
|
|
|
|
_global = window;
|
|
|
|
} else if (typeof global !== "undefined") {
|
|
|
|
_global = global;
|
|
|
|
} else if (typeof self !== "undefined") {
|
|
|
|
_global = self;
|
|
|
|
} else {
|
|
|
|
_global = this;
|
|
|
|
}
|
|
|
|
if (!_global.BI) {
|
|
|
|
_global.BI = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
!(function (undefined) {
|
|
|
|
var traverse = function (func, context) {
|
|
|
|
return function (value, key, obj) {
|
|
|
|
return func.call(context, key, value, obj);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
var _apply = function (name) {
|
|
|
|
return function () {
|
|
|
|
return _[name].apply(_, arguments);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
var _applyFunc = function (name) {
|
|
|
|
return function () {
|
|
|
|
var args = Array.prototype.slice.call(arguments, 0);
|
|
|
|
args[1] = _.isFunction(args[1]) ? traverse(args[1], args[2]) : args[1];
|
|
|
|
return _[name].apply(_, args);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
// Utility
|
|
|
|
_.extend(BI, {
|
|
|
|
assert: function (v, is) {
|
|
|
|
if (this.isFunction(is)) {
|
|
|
|
if (!is(v)) {
|
|
|
|
throw new Error(v + " error");
|
|
|
|
} else {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!this.isArray(is)) {
|
|
|
|
is = [is];
|
|
|
|
}
|
|
|
|
if (!this.deepContains(is, v)) {
|
|
|
|
throw new Error(v + " error");
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
|
|
|
warn: function (message) {
|
|
|
|
console.warn(message);
|
|
|
|
},
|
|
|
|
|
|
|
|
UUID: function () {
|
|
|
|
var f = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
|
|
|
|
var str = "";
|
|
|
|
for (var i = 0; i < 16; i++) {
|
|
|
|
var r = parseInt(f.length * Math.random(), 10);
|
|
|
|
str += f[r];
|
|
|
|
}
|
|
|
|
return str;
|
|
|
|
},
|
|
|
|
|
|
|
|
isWidget: function (widget) {
|
|
|
|
return widget instanceof BI.Widget || (BI.View && widget instanceof BI.View);
|
|
|
|
},
|
|
|
|
|
|
|
|
createWidgets: function (items, options, context) {
|
|
|
|
if (!BI.isArray(items)) {
|
|
|
|
throw new Error("cannot create Widgets");
|
|
|
|
}
|
|
|
|
if (BI.isWidget(options)) {
|
|
|
|
context = options;
|
|
|
|
options = {};
|
|
|
|
} else {
|
|
|
|
options || (options = {});
|
|
|
|
}
|
|
|
|
return BI.map(BI.flatten(items), function (i, item) {
|
|
|
|
return BI.createWidget(item, BI.deepClone(options));
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
createItems: function (data, innerAttr, outerAttr) {
|
|
|
|
innerAttr = BI.isArray(innerAttr) ? innerAttr : BI.makeArray(BI.flatten(data).length, innerAttr || {});
|
|
|
|
outerAttr = BI.isArray(outerAttr) ? outerAttr : BI.makeArray(BI.flatten(data).length, outerAttr || {});
|
|
|
|
return BI.map(data, function (i, item) {
|
|
|
|
if (BI.isArray(item)) {
|
|
|
|
return BI.createItems(item, innerAttr, outerAttr);
|
|
|
|
}
|
|
|
|
if (item instanceof BI.Widget) {
|
|
|
|
return BI.extend({}, innerAttr.shift(), outerAttr.shift(), {
|
|
|
|
type: null,
|
|
|
|
el: item
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (innerAttr[0] instanceof BI.Widget) {
|
|
|
|
outerAttr.shift();
|
|
|
|
return BI.extend({}, item, {
|
|
|
|
el: innerAttr.shift()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (item.el instanceof BI.Widget || (BI.View && item.el instanceof BI.View)) {
|
|
|
|
innerAttr.shift();
|
|
|
|
return BI.extend({}, outerAttr.shift(), { type: null }, item);
|
|
|
|
}
|
|
|
|
if (item.el) {
|
|
|
|
return BI.extend({}, outerAttr.shift(), item, {
|
|
|
|
el: BI.extend({}, innerAttr.shift(), item.el)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return BI.extend({}, outerAttr.shift(), {
|
|
|
|
el: BI.extend({}, innerAttr.shift(), item)
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
// 用容器包装items
|
|
|
|
packageItems: function (items, layouts) {
|
|
|
|
for (var i = layouts.length - 1; i >= 0; i--) {
|
|
|
|
items = BI.map(items, function (k, it) {
|
|
|
|
return BI.extend({}, layouts[i], {
|
|
|
|
items: [
|
|
|
|
BI.extend({}, layouts[i].el, {
|
|
|
|
el: it
|
|
|
|
})
|
|
|
|
]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return items;
|
|
|
|
},
|
|
|
|
|
|
|
|
formatEL: function (obj) {
|
|
|
|
if (obj && !obj.type && obj.el) {
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
el: obj
|
|
|
|
};
|
|
|
|
},
|
|
|
|
|
|
|
|
// 剥开EL
|
|
|
|
stripEL: function (obj) {
|
|
|
|
return obj.type && obj || obj.el || obj;
|
|
|
|
},
|
|
|
|
|
|
|
|
trans2Element: function (widgets) {
|
|
|
|
return BI.map(widgets, function (i, wi) {
|
|
|
|
return wi.element;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 集合相关方法
|
|
|
|
_.each(["where", "findWhere", "invoke", "pluck", "shuffle", "sample", "toArray", "size"], function (name) {
|
|
|
|
BI[name] = _apply(name);
|
|
|
|
});
|
|
|
|
_.each(["get", "set", "each", "map", "reduce", "reduceRight", "find", "filter", "reject", "every", "all", "some", "any", "max", "min",
|
|
|
|
"sortBy", "groupBy", "indexBy", "countBy", "partition", "clamp"], function (name) {
|
|
|
|
if (name === "any") {
|
|
|
|
BI[name] = _applyFunc("some");
|
|
|
|
} else {
|
|
|
|
BI[name] = _applyFunc(name);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
_.extend(BI, {
|
|
|
|
// 数数
|
|
|
|
count: function (from, to, predicate) {
|
|
|
|
var t;
|
|
|
|
if (predicate) {
|
|
|
|
for (t = from; t < to; t++) {
|
|
|
|
predicate(t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return to - from;
|
|
|
|
},
|
|
|
|
|
|
|
|
// 倒数
|
|
|
|
inverse: function (from, to, predicate) {
|
|
|
|
return BI.count(to, from, predicate);
|
|
|
|
},
|
|
|
|
|
|
|
|
firstKey: function (obj) {
|
|
|
|
var res = undefined;
|
|
|
|
BI.any(obj, function (key, value) {
|
|
|
|
res = key;
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
return res;
|
|
|
|
},
|
|
|
|
|
|
|
|
lastKey: function (obj) {
|
|
|
|
var res = undefined;
|
|
|
|
BI.each(obj, function (key, value) {
|
|
|
|
res = key;
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
return res;
|
|
|
|
},
|
|
|
|
|
|
|
|
firstObject: function (obj) {
|
|
|
|
var res = undefined;
|
|
|
|
BI.any(obj, function (key, value) {
|
|
|
|
res = value;
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
return res;
|
|
|
|
},
|
|
|
|
|
|
|
|
lastObject: function (obj) {
|
|
|
|
var res = undefined;
|
|
|
|
BI.each(obj, function (key, value) {
|
|
|
|
res = value;
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
return res;
|
|
|
|
},
|
|
|
|
|
|
|
|
concat: function (obj1, obj2) {
|
|
|
|
if (BI.isKey(obj1)) {
|
|
|
|
return BI.map([].slice.apply(arguments), function (idx, v) {
|
|
|
|
return v;
|
|
|
|
}).join("");
|
|
|
|
}
|
|
|
|
if (BI.isArray(obj1)) {
|
|
|
|
return _.concat.apply([], arguments);
|
|
|
|
}
|
|
|
|
if (BI.isObject(obj1)) {
|
|
|
|
return _.extend.apply({}, arguments);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
backEach: function (obj, predicate, context) {
|
|
|
|
predicate = BI.iteratee(predicate, context);
|
|
|
|
for (var index = obj.length - 1; index >= 0; index--) {
|
|
|
|
predicate(index, obj[index], obj);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
backAny: function (obj, predicate, context) {
|
|
|
|
predicate = BI.iteratee(predicate, context);
|
|
|
|
for (var index = obj.length - 1; index >= 0; index--) {
|
|
|
|
if (predicate(index, obj[index], obj)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
backEvery: function (obj, predicate, context) {
|
|
|
|
predicate = BI.iteratee(predicate, context);
|
|
|
|
for (var index = obj.length - 1; index >= 0; index--) {
|
|
|
|
if (!predicate(index, obj[index], obj)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
|
|
|
backFindKey: function (obj, predicate, context) {
|
|
|
|
predicate = BI.iteratee(predicate, context);
|
|
|
|
var keys = _.keys(obj), key;
|
|
|
|
for (var i = keys.length - 1; i >= 0; i--) {
|
|
|
|
key = keys[i];
|
|
|
|
if (predicate(obj[key], key, obj)) {
|
|
|
|
return key;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
backFind: function (obj, predicate, context) {
|
|
|
|
var key;
|
|
|
|
if (BI.isArray(obj)) {
|
|
|
|
key = BI.findLastIndex(obj, predicate, context);
|
|
|
|
} else {
|
|
|
|
key = BI.backFindKey(obj, predicate, context);
|
|
|
|
}
|
|
|
|
if (key !== void 0 && key !== -1) {
|
|
|
|
return obj[key];
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
remove: function (obj, target, context) {
|
|
|
|
var isFunction = BI.isFunction(target);
|
|
|
|
target = isFunction || BI.isArray(target) ? target : [target];
|
|
|
|
var i;
|
|
|
|
if (BI.isArray(obj)) {
|
|
|
|
for (i = 0; i < obj.length; i++) {
|
|
|
|
if ((isFunction && target.apply(context, [i, obj[i]]) === true) || (!isFunction && BI.contains(target, obj[i]))) {
|
|
|
|
obj.splice(i--, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
BI.each(obj, function (i, v) {
|
|
|
|
if ((isFunction && target.apply(context, [i, obj[i]]) === true) || (!isFunction && BI.contains(target, obj[i]))) {
|
|
|
|
delete obj[i];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
removeAt: function (obj, index) {
|
|
|
|
index = BI.isArray(index) ? index : [index];
|
|
|
|
var isArray = BI.isArray(obj), i;
|
|
|
|
for (i = 0; i < index.length; i++) {
|
|
|
|
if (isArray) {
|
|
|
|
obj[index[i]] = "$deleteIndex";
|
|
|
|
} else {
|
|
|
|
delete obj[index[i]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (isArray) {
|
|
|
|
BI.remove(obj, "$deleteIndex");
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
string2Array: function (str) {
|
|
|
|
return str.split("&-&");
|
|
|
|
},
|
|
|
|
|
|
|
|
array2String: function (array) {
|
|
|
|
return array.join("&-&");
|
|
|
|
},
|
|
|
|
|
|
|
|
abc2Int: function (str) {
|
|
|
|
var idx = 0, start = "A", str = str.toUpperCase();
|
|
|
|
for (var i = 0, len = str.length; i < len; ++i) {
|
|
|
|
idx = str.charAt(i).charCodeAt(0) - start.charCodeAt(0) + 26 * idx + 1;
|
|
|
|
if (idx > (2147483646 - str.charAt(i).charCodeAt(0) + start.charCodeAt(0)) / 26) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return idx;
|
|
|
|
},
|
|
|
|
|
|
|
|
int2Abc: function (num) {
|
|
|
|
var DIGITS = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
|
|
|
|
var idx = num, str = "";
|
|
|
|
if (num === 0) {
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
while (idx !== 0) {
|
|
|
|
var t = idx % 26;
|
|
|
|
if (t === 0) {
|
|
|
|
t = 26;
|
|
|
|
}
|
|
|
|
str = DIGITS[t - 1] + str;
|
|
|
|
idx = (idx - t) / 26;
|
|
|
|
}
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 数组相关的方法
|
|
|
|
_.each(["first", "initial", "last", "rest", "compact", "flatten", "without", "union", "intersection",
|
|
|
|
"difference", "zip", "unzip", "object", "indexOf", "lastIndexOf", "sortedIndex", "range", "take", "takeRight", "uniqBy"], function (name) {
|
|
|
|
BI[name] = _apply(name);
|
|
|
|
});
|
|
|
|
_.each(["findIndex", "findLastIndex"], function (name) {
|
|
|
|
BI[name] = _applyFunc(name);
|
|
|
|
});
|
|
|
|
_.extend(BI, {
|
|
|
|
// 构建一个长度为length的数组
|
|
|
|
makeArray: function (length, value) {
|
|
|
|
var res = [];
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
|
|
if (BI.isNull(value)) {
|
|
|
|
res.push(i);
|
|
|
|
} else {
|
|
|
|
res.push(BI.deepClone(value));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
},
|
|
|
|
|
|
|
|
makeObject: function (array, value) {
|
|
|
|
var map = {};
|
|
|
|
for (var i = 0; i < array.length; i++) {
|
|
|
|
if (BI.isNull(value)) {
|
|
|
|
map[array[i]] = array[i];
|
|
|
|
} else {
|
|
|
|
map[array[i]] = BI.deepClone(value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return map;
|
|
|
|
},
|
|
|
|
|
|
|
|
makeArrayByArray: function (array, value) {
|
|
|
|
var res = [];
|
|
|
|
if (!array) {
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
|
|
if (BI.isArray(array[i])) {
|
|
|
|
res.push(arguments.callee(array[i], value));
|
|
|
|
} else {
|
|
|
|
res.push(BI.deepClone(value));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
},
|
|
|
|
|
|
|
|
uniq: function (array, isSorted, iteratee, context) {
|
|
|
|
if (array == null) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
if (!_.isBoolean(isSorted)) {
|
|
|
|
context = iteratee;
|
|
|
|
iteratee = isSorted;
|
|
|
|
isSorted = false;
|
|
|
|
}
|
|
|
|
iteratee && (iteratee = traverse(iteratee, context));
|
|
|
|
return _.uniq.call(_, array, isSorted, iteratee, context);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 对象相关方法
|
|
|
|
_.each(["keys", "allKeys", "values", "pairs", "invert", "create", "functions", "extend", "extendOwn",
|
|
|
|
"defaults", "clone", "property", "propertyOf", "matcher", "isEqual", "isMatch", "isEmpty",
|
|
|
|
"isElement", "isNumber", "isString", "isArray", "isObject", "isPlainObject", "isArguments", "isFunction", "isFinite",
|
|
|
|
"isBoolean", "isDate", "isRegExp", "isError", "isNaN", "isUndefined", "zipObject", "cloneDeep"], function (name) {
|
|
|
|
BI[name] = _apply(name);
|
|
|
|
});
|
|
|
|
_.each(["mapObject", "findKey", "pick", "omit", "tap"], function (name) {
|
|
|
|
BI[name] = _applyFunc(name);
|
|
|
|
});
|
|
|
|
_.extend(BI, {
|
|
|
|
|
|
|
|
inherit: function (sb, sp, overrides) {
|
|
|
|
if (typeof sp === "object") {
|
|
|
|
overrides = sp;
|
|
|
|
sp = sb;
|
|
|
|
sb = function () {
|
|
|
|
return sp.apply(this, arguments);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
var F = function () {
|
|
|
|
}, spp = sp.prototype;
|
|
|
|
F.prototype = spp;
|
|
|
|
sb.prototype = new F();
|
|
|
|
sb.superclass = spp;
|
|
|
|
_.extend(sb.prototype, overrides, {
|
|
|
|
superclass: sp
|
|
|
|
});
|
|
|
|
return sb;
|
|
|
|
},
|
|
|
|
|
|
|
|
init: function () {
|
|
|
|
// 先把准备环境准备好
|
|
|
|
while (BI.prepares && BI.prepares.length > 0) {
|
|
|
|
BI.prepares.shift()();
|
|
|
|
}
|
|
|
|
while (_global.___fineuiExposedFunction && _global.___fineuiExposedFunction.length > 0) {
|
|
|
|
_global.___fineuiExposedFunction.shift()();
|
|
|
|
}
|
|
|
|
BI.initialized = true;
|
|
|
|
},
|
|
|
|
|
|
|
|
has: function (obj, keys) {
|
|
|
|
if (BI.isArray(keys)) {
|
|
|
|
if (keys.length === 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return BI.every(keys, function (i, key) {
|
|
|
|
return _.has(obj, key);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return _.has.apply(_, arguments);
|
|
|
|
},
|
|
|
|
|
|
|
|
freeze: function (value) {
|
|
|
|
// 在ES5中,如果这个方法的参数不是一个对象(一个原始值),那么它会导致 TypeError
|
|
|
|
// 在ES2015中,非对象参数将被视为要被冻结的普通对象,并被简单地返回
|
|
|
|
if (Object.freeze && BI.isObject(value)) {
|
|
|
|
return Object.freeze(value);
|
|
|
|
}
|
|
|
|
return value;
|
|
|
|
},
|
|
|
|
|
|
|
|
// 数字和字符串可以作为key
|
|
|
|
isKey: function (key) {
|
|
|
|
return BI.isNumber(key) || (BI.isString(key) && key.length > 0);
|
|
|
|
},
|
|
|
|
|
|
|
|
// 忽略大小写的等于
|
|
|
|
isCapitalEqual: function (a, b) {
|
|
|
|
a = BI.isNull(a) ? a : ("" + a).toLowerCase();
|
|
|
|
b = BI.isNull(b) ? b : ("" + b).toLowerCase();
|
|
|
|
return BI.isEqual(a, b);
|
|
|
|
},
|
|
|
|
|
|
|
|
isWidthOrHeight: function (w) {
|
|
|
|
if (typeof w === "number") {
|
|
|
|
return w >= 0;
|
|
|
|
} else if (typeof w === "string") {
|
|
|
|
return /^\d{1,3}%$/.exec(w) || w == "auto" || /^\d+px$/.exec(w);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
isNotNull: function (obj) {
|
|
|
|
return !BI.isNull(obj);
|
|
|
|
},
|
|
|
|
|
|
|
|
isNull: function (obj) {
|
|
|
|
return typeof obj === "undefined" || obj === null;
|
|
|
|
},
|
|
|
|
|
|
|
|
isEmptyArray: function (arr) {
|
|
|
|
return BI.isArray(arr) && BI.isEmpty(arr);
|
|
|
|
},
|
|
|
|
|
|
|
|
isNotEmptyArray: function (arr) {
|
|
|
|
return BI.isArray(arr) && !BI.isEmpty(arr);
|
|
|
|
},
|
|
|
|
|
|
|
|
isEmptyObject: function (obj) {
|
|
|
|
return BI.isEqual(obj, {});
|
|
|
|
},
|
|
|
|
|
|
|
|
isNotEmptyObject: function (obj) {
|
|
|
|
return BI.isPlainObject(obj) && !BI.isEmptyObject(obj);
|
|
|
|
},
|
|
|
|
|
|
|
|
isEmptyString: function (obj) {
|
|
|
|
return BI.isString(obj) && obj.length === 0;
|
|
|
|
},
|
|
|
|
|
|
|
|
isNotEmptyString: function (obj) {
|
|
|
|
return BI.isString(obj) && !BI.isEmptyString(obj);
|
|
|
|
},
|
|
|
|
|
|
|
|
isWindow: function (obj) {
|
|
|
|
return obj != null && obj == obj.window;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// deep方法
|
|
|
|
_.extend(BI, {
|
|
|
|
deepClone: _.cloneDeep,
|
|
|
|
deepExtend: _.merge,
|
|
|
|
|
|
|
|
isDeepMatch: function (object, attrs) {
|
|
|
|
var keys = BI.keys(attrs), length = keys.length;
|
|
|
|
if (object == null) {
|
|
|
|
return !length;
|
|
|
|
}
|
|
|
|
var obj = Object(object);
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
|
|
var key = keys[i];
|
|
|
|
if (!BI.isEqual(attrs[key], obj[key]) || !(key in obj)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
|
|
|
contains: function (obj, target, fromIndex) {
|
|
|
|
if (!_.isArrayLike(obj)) obj = _.values(obj);
|
|
|
|
return _.indexOf(obj, target, typeof fromIndex === "number" && fromIndex) >= 0;
|
|
|
|
},
|
|
|
|
|
|
|
|
deepContains: function (obj, copy) {
|
|
|
|
if (BI.isObject(copy)) {
|
|
|
|
return BI.any(obj, function (i, v) {
|
|
|
|
if (BI.isEqual(v, copy)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return BI.contains(obj, copy);
|
|
|
|
},
|
|
|
|
|
|
|
|
deepIndexOf: function (obj, target) {
|
|
|
|
for (var i = 0; i < obj.length; i++) {
|
|
|
|
if (BI.isEqual(target, obj[i])) {
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
},
|
|
|
|
|
|
|
|
deepRemove: function (obj, target) {
|
|
|
|
var done = false;
|
|
|
|
var i;
|
|
|
|
if (BI.isArray(obj)) {
|
|
|
|
for (i = 0; i < obj.length; i++) {
|
|
|
|
if (BI.isEqual(target, obj[i])) {
|
|
|
|
obj.splice(i--, 1);
|
|
|
|
done = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
BI.each(obj, function (i, v) {
|
|
|
|
if (BI.isEqual(target, obj[i])) {
|
|
|
|
delete obj[i];
|
|
|
|
done = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return done;
|
|
|
|
},
|
|
|
|
|
|
|
|
deepWithout: function (obj, target) {
|
|
|
|
if (BI.isArray(obj)) {
|
|
|
|
var result = [];
|
|
|
|
for (var i = 0; i < obj.length; i++) {
|
|
|
|
if (!BI.isEqual(target, obj[i])) {
|
|
|
|
result.push(obj[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
var result = {};
|
|
|
|
BI.each(obj, function (i, v) {
|
|
|
|
if (!BI.isEqual(target, obj[i])) {
|
|
|
|
result[i] = v;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return result;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
deepUnique: function (array) {
|
|
|
|
var result = [];
|
|
|
|
BI.each(array, function (i, item) {
|
|
|
|
if (!BI.deepContains(result, item)) {
|
|
|
|
result.push(item);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return result;
|
|
|
|
},
|
|
|
|
|
|
|
|
// 比较两个对象得出不一样的key值
|
|
|
|
deepDiff: function (object, other) {
|
|
|
|
object || (object = {});
|
|
|
|
other || (other = {});
|
|
|
|
var result = [];
|
|
|
|
var used = [];
|
|
|
|
for (var b in object) {
|
|
|
|
if (this.has(object, b)) {
|
|
|
|
if (!this.isEqual(object[b], other[b])) {
|
|
|
|
result.push(b);
|
|
|
|
}
|
|
|
|
used.push(b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (var b in other) {
|
|
|
|
if (this.has(other, b) && !BI.contains(used, b)) {
|
|
|
|
result.push(b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 通用方法
|
|
|
|
_.each(["uniqueId", "result", "chain", "iteratee", "escape", "unescape", "before", "after"], function (name) {
|
|
|
|
BI[name] = function () {
|
|
|
|
return _[name].apply(_, arguments);
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
// 事件相关方法
|
|
|
|
_.each(["bind", "once", "partial", "debounce", "throttle", "delay", "defer", "wrap"], function (name) {
|
|
|
|
BI[name] = function () {
|
|
|
|
return _[name].apply(_, arguments);
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
_.extend(BI, {
|
|
|
|
nextTick: (function () {
|
|
|
|
var callbacks = [];
|
|
|
|
var pending = false;
|
|
|
|
var timerFunc = void 0;
|
|
|
|
|
|
|
|
function nextTickHandler() {
|
|
|
|
pending = false;
|
|
|
|
var copies = callbacks.slice(0);
|
|
|
|
callbacks.length = 0;
|
|
|
|
for (var i = 0; i < copies.length; i++) {
|
|
|
|
copies[i]();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof Promise !== "undefined") {
|
|
|
|
var p = Promise.resolve();
|
|
|
|
timerFunc = function timerFunc() {
|
|
|
|
p.then(nextTickHandler);
|
|
|
|
};
|
|
|
|
} else if (typeof MutationObserver !== "undefined") {
|
|
|
|
var counter = 1;
|
|
|
|
var observer = new MutationObserver(nextTickHandler);
|
|
|
|
var textNode = document.createTextNode(String(counter));
|
|
|
|
observer.observe(textNode, {
|
|
|
|
characterData: true
|
|
|
|
});
|
|
|
|
timerFunc = function timerFunc() {
|
|
|
|
counter = (counter + 1) % 2;
|
|
|
|
textNode.data = String(counter);
|
|
|
|
};
|
|
|
|
} else if (typeof setImmediate !== "undefined") {
|
|
|
|
timerFunc = function timerFunc() {
|
|
|
|
setImmediate(nextTickHandler);
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
// Fallback to setTimeout.
|
|
|
|
timerFunc = function timerFunc() {
|
|
|
|
setTimeout(nextTickHandler, 0);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return function queueNextTick(cb) {
|
|
|
|
var _resolve = void 0;
|
|
|
|
var args = [].slice.call(arguments, 1);
|
|
|
|
callbacks.push(function () {
|
|
|
|
if (cb) {
|
|
|
|
try {
|
|
|
|
cb.apply(null, args);
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
|
|
|
} else if (_resolve) {
|
|
|
|
_resolve.apply(null, args);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (!pending) {
|
|
|
|
pending = true;
|
|
|
|
timerFunc();
|
|
|
|
}
|
|
|
|
// $flow-disable-line
|
|
|
|
if (!cb && typeof Promise !== 'undefined') {
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
_resolve = resolve;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
})()
|
|
|
|
});
|
|
|
|
|
|
|
|
// 数字相关方法
|
|
|
|
_.each(["random"], function (name) {
|
|
|
|
BI[name] = _apply(name);
|
|
|
|
});
|
|
|
|
_.extend(BI, {
|
|
|
|
getTime: function () {
|
|
|
|
if (_global.performance && _global.performance.now) {
|
|
|
|
return _global.performance.now();
|
|
|
|
}
|
|
|
|
if (_global.performance && _global.performance.webkitNow) {
|
|
|
|
return _global.performance.webkitNow();
|
|
|
|
}
|
|
|
|
if (Date.now) {
|
|
|
|
return Date.now();
|
|
|
|
}
|
|
|
|
return BI.getDate().getTime();
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
parseInt: function (number) {
|
|
|
|
var radix = 10;
|
|
|
|
if (/^0x/g.test(number)) {
|
|
|
|
radix = 16;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
return parseInt(number, radix);
|
|
|
|
} catch (e) {
|
|
|
|
throw new Error(number + "parse int error");
|
|
|
|
return NaN;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
parseSafeInt: function (value) {
|
|
|
|
var MAX_SAFE_INTEGER = 9007199254740991;
|
|
|
|
return value
|
|
|
|
? this.clamp(this.parseInt(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
|
|
|
|
: (value === 0 ? value : 0);
|
|
|
|
},
|
|
|
|
|
|
|
|
parseFloat: function (number) {
|
|
|
|
try {
|
|
|
|
return parseFloat(number);
|
|
|
|
} catch (e) {
|
|
|
|
throw new Error(number + "parse float error");
|
|
|
|
return NaN;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
isNaturalNumber: function (number) {
|
|
|
|
if (/^\d+$/.test(number)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
isPositiveInteger: function (number) {
|
|
|
|
if (/^\+?[1-9][0-9]*$/.test(number)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
isNegativeInteger: function (number) {
|
|
|
|
if (/^\-[1-9][0-9]*$/.test(number)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
isInteger: function (number) {
|
|
|
|
if (/^\-?\d+$/.test(number)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
isNumeric: function (number) {
|
|
|
|
return !isNaN(parseFloat(number)) && isFinite(number);
|
|
|
|
},
|
|
|
|
|
|
|
|
isFloat: function (number) {
|
|
|
|
if (/^([+-]?)\d*\.\d+$/.test(number)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
isOdd: function (number) {
|
|
|
|
if (!BI.isInteger(number)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return (number & 1) === 1;
|
|
|
|
},
|
|
|
|
|
|
|
|
isEven: function (number) {
|
|
|
|
if (!BI.isInteger(number)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return (number & 1) === 0;
|
|
|
|
},
|
|
|
|
|
|
|
|
sum: function (array, iteratee, context) {
|
|
|
|
var sum = 0;
|
|
|
|
BI.each(array, function (i, item) {
|
|
|
|
if (iteratee) {
|
|
|
|
sum += Number(iteratee.apply(context, [i, item]));
|
|
|
|
} else {
|
|
|
|
sum += Number(item);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return sum;
|
|
|
|
},
|
|
|
|
|
|
|
|
average: function (array, iteratee, context) {
|
|
|
|
var sum = BI.sum(array, iteratee, context);
|
|
|
|
return sum / array.length;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 字符串相关方法
|
|
|
|
_.extend(BI, {
|
|
|
|
trim: function () {
|
|
|
|
return _.trim.apply(_, arguments);
|
|
|
|
},
|
|
|
|
|
|
|
|
toUpperCase: function (string) {
|
|
|
|
return (string + "").toLocaleUpperCase();
|
|
|
|
},
|
|
|
|
|
|
|
|
toLowerCase: function (string) {
|
|
|
|
return (string + "").toLocaleLowerCase();
|
|
|
|
},
|
|
|
|
|
|
|
|
isEndWithBlank: function (string) {
|
|
|
|
return /(\s|\u00A0)$/.test(string);
|
|
|
|
},
|
|
|
|
|
|
|
|
isLiteral: function (exp) {
|
|
|
|
var literalValueRE = /^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/;
|
|
|
|
return literalValueRE.test(exp);
|
|
|
|
},
|
|
|
|
|
|
|
|
stripQuotes: function (str) {
|
|
|
|
var a = str.charCodeAt(0);
|
|
|
|
var b = str.charCodeAt(str.length - 1);
|
|
|
|
return a === b && (a === 0x22 || a === 0x27)
|
|
|
|
? str.slice(1, -1)
|
|
|
|
: str;
|
|
|
|
},
|
|
|
|
|
|
|
|
// background-color => backgroundColor
|
|
|
|
camelize: function (str) {
|
|
|
|
return str.replace(/-(.)/g, function (_, character) {
|
|
|
|
return character.toUpperCase();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
// backgroundColor => background-color
|
|
|
|
hyphenate: function (str) {
|
|
|
|
return str.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
|
|
},
|
|
|
|
|
|
|
|
isNotEmptyString: function (str) {
|
|
|
|
return BI.isString(str) && !BI.isEmpty(str);
|
|
|
|
},
|
|
|
|
|
|
|
|
isEmptyString: function (str) {
|
|
|
|
return BI.isString(str) && BI.isEmpty(str);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 通用加密方法
|
|
|
|
*/
|
|
|
|
encrypt: function (type, text, key) {
|
|
|
|
switch (type) {
|
|
|
|
case BI.CRYPT_TYPE.AES:
|
|
|
|
default:
|
|
|
|
return BI.aesEncrypt(text, key);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 通用解密方法
|
|
|
|
* @param type 解密方式
|
|
|
|
* @param text 文本
|
|
|
|
* @param key 种子
|
|
|
|
* @return {*}
|
|
|
|
*/
|
|
|
|
decrypt: function (type, text, key) {
|
|
|
|
switch (type) {
|
|
|
|
case BI.CRYPT_TYPE.AES:
|
|
|
|
default:
|
|
|
|
return BI.aesDecrypt(text, key);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 对字符串中的'和\做编码处理
|
|
|
|
* @static
|
|
|
|
* @param {String} string 要做编码处理的字符串
|
|
|
|
* @return {String} 编码后的字符串
|
|
|
|
*/
|
|
|
|
escape: function (string) {
|
|
|
|
return string.replace(/('|\\)/g, "\\$1");
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 让字符串通过指定字符做补齐的函数
|
|
|
|
*
|
|
|
|
* var s = BI.leftPad('123', 5, '0');//s的值为:'00123'
|
|
|
|
*
|
|
|
|
* @static
|
|
|
|
* @param {String} val 原始值
|
|
|
|
* @param {Number} size 总共需要的位数
|
|
|
|
* @param {String} ch 用于补齐的字符
|
|
|
|
* @return {String} 补齐后的字符串
|
|
|
|
*/
|
|
|
|
leftPad: function (val, size, ch) {
|
|
|
|
var result = String(val);
|
|
|
|
if (!ch) {
|
|
|
|
ch = " ";
|
|
|
|
}
|
|
|
|
while (result.length < size) {
|
|
|
|
result = ch + result;
|
|
|
|
}
|
|
|
|
return result.toString();
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 对字符串做替换的函数
|
|
|
|
*
|
|
|
|
* var cls = 'my-class', text = 'Some text';
|
|
|
|
* var res = BI.format('<div class="{0}">{1}</div>', cls, text);
|
|
|
|
* //res的值为:'<div class="my-class">Some text</div>';
|
|
|
|
*
|
|
|
|
* @static
|
|
|
|
* @param {String} format 要做替换的字符串,替换字符串1,替换字符串2...
|
|
|
|
* @return {String} 做了替换后的字符串
|
|
|
|
*/
|
|
|
|
format: function (format) {
|
|
|
|
var args = Array.prototype.slice.call(arguments, 1);
|
|
|
|
return format.replace(/\{(\d+)\}/g, function (m, i) {
|
|
|
|
return args[i];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// 日期相关方法
|
|
|
|
_.extend(BI, {
|
|
|
|
/**
|
|
|
|
* 是否是闰年
|
|
|
|
* @param year
|
|
|
|
* @returns {boolean}
|
|
|
|
*/
|
|
|
|
isLeapYear: function (year) {
|
|
|
|
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 检测是否在有效期
|
|
|
|
*
|
|
|
|
* @param YY 年
|
|
|
|
* @param MM 月
|
|
|
|
* @param DD 日
|
|
|
|
* @param minDate '1900-01-01'
|
|
|
|
* @param maxDate '2099-12-31'
|
|
|
|
* @returns {Array} 若无效返回无效状态
|
|
|
|
*/
|
|
|
|
checkDateVoid: function (YY, MM, DD, minDate, maxDate) {
|
|
|
|
var back = [];
|
|
|
|
YY = YY | 0;
|
|
|
|
MM = MM | 0;
|
|
|
|
DD = DD | 0;
|
|
|
|
minDate = BI.isString(minDate) ? minDate.match(/\d+/g) : minDate;
|
|
|
|
maxDate = BI.isString(maxDate) ? maxDate.match(/\d+/g) : maxDate;
|
|
|
|
if (YY < minDate[0]) {
|
|
|
|
back = ["y"];
|
|
|
|
} else if (YY > maxDate[0]) {
|
|
|
|
back = ["y", 1];
|
|
|
|
} else if (YY >= minDate[0] && YY <= maxDate[0]) {
|
|
|
|
if (YY == minDate[0]) {
|
|
|
|
if (MM < minDate[1]) {
|
|
|
|
back = ["m"];
|
|
|
|
} else if (MM == minDate[1]) {
|
|
|
|
if (DD < minDate[2]) {
|
|
|
|
back = ["d"];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (YY == maxDate[0]) {
|
|
|
|
if (MM > maxDate[1]) {
|
|
|
|
back = ["m", 1];
|
|
|
|
} else if (MM == maxDate[1]) {
|
|
|
|
if (DD > maxDate[2]) {
|
|
|
|
back = ["d", 1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return back;
|
|
|
|
},
|
|
|
|
|
|
|
|
checkDateLegal: function (str) {
|
|
|
|
var ar = str.match(/\d+/g);
|
|
|
|
var YY = ar[0] | 0, MM = ar[1] | 0, DD = ar[2] | 0;
|
|
|
|
if (ar.length <= 1) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (ar.length <= 2) {
|
|
|
|
return MM >= 1 && MM <= 12;
|
|
|
|
}
|
|
|
|
var MD = BI.Date._MD.slice(0);
|
|
|
|
MD[1] = BI.isLeapYear(YY) ? 29 : 28;
|
|
|
|
return MM >= 1 && MM <= 12 && DD <= MD[MM - 1];
|
|
|
|
},
|
|
|
|
|
|
|
|
parseDateTime: function (str, fmt) {
|
|
|
|
var today = BI.getDate();
|
|
|
|
var y = 0;
|
|
|
|
var m = 0;
|
|
|
|
var d = 1;
|
|
|
|
// wei : 对于fmt为‘YYYYMM’或者‘YYYYMMdd’的格式,str的值为类似'201111'的形式,因为年月之间没有分隔符,所以正则表达式分割无效,导致bug7376。
|
|
|
|
var a = str.split(/\W+/);
|
|
|
|
if (fmt.toLowerCase() == "%y%x" || fmt.toLowerCase() == "%y%x%d") {
|
|
|
|
var yearlength = 4;
|
|
|
|
var otherlength = 2;
|
|
|
|
a[0] = str.substring(0, yearlength);
|
|
|
|
a[1] = str.substring(yearlength, yearlength + otherlength);
|
|
|
|
a[2] = str.substring(yearlength + otherlength, yearlength + otherlength * 2);
|
|
|
|
}
|
|
|
|
var b = fmt.match(/%./g);
|
|
|
|
var i = 0, j = 0;
|
|
|
|
var hr = 0;
|
|
|
|
var min = 0;
|
|
|
|
var sec = 0;
|
|
|
|
for (i = 0; i < a.length; ++i) {
|
|
|
|
switch (b[i]) {
|
|
|
|
case "%d":
|
|
|
|
case "%e":
|
|
|
|
d = parseInt(a[i], 10);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "%X":
|
|
|
|
m = parseInt(a[i], 10) - 1;
|
|
|
|
break;
|
|
|
|
case "%x":
|
|
|
|
m = parseInt(a[i], 10) - 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "%Y":
|
|
|
|
case "%y":
|
|
|
|
y = parseInt(a[i], 10);
|
|
|
|
(y < 100) && (y += (y > 29) ? 1900 : 2000);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "%b":
|
|
|
|
case "%B":
|
|
|
|
for (j = 0; j < 12; ++j) {
|
|
|
|
if (BI.Date._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
|
|
|
|
m = j;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "%H":
|
|
|
|
case "%I":
|
|
|
|
case "%k":
|
|
|
|
case "%l":
|
|
|
|
hr = parseInt(a[i], 10);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "%P":
|
|
|
|
case "%p":
|
|
|
|
if (/pm/i.test(a[i]) && hr < 12) {
|
|
|
|
hr += 12;
|
|
|
|
} else if (/am/i.test(a[i]) && hr >= 12) {
|
|
|
|
hr -= 12;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "%M":
|
|
|
|
min = parseInt(a[i], 10);
|
|
|
|
case "%S":
|
|
|
|
sec = parseInt(a[i], 10);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// if (!a[i]) {
|
|
|
|
// continue;
|
|
|
|
// }
|
|
|
|
if (isNaN(y)) {
|
|
|
|
y = today.getFullYear();
|
|
|
|
}
|
|
|
|
if (isNaN(m)) {
|
|
|
|
m = today.getMonth();
|
|
|
|
}
|
|
|
|
if (isNaN(d)) {
|
|
|
|
d = today.getDate();
|
|
|
|
}
|
|
|
|
if (isNaN(hr)) {
|
|
|
|
hr = today.getHours();
|
|
|
|
}
|
|
|
|
if (isNaN(min)) {
|
|
|
|
min = today.getMinutes();
|
|
|
|
}
|
|
|
|
if (isNaN(sec)) {
|
|
|
|
sec = today.getSeconds();
|
|
|
|
}
|
|
|
|
if (y != 0) {
|
|
|
|
return BI.getDate(y, m, d, hr, min, sec);
|
|
|
|
}
|
|
|
|
y = 0;
|
|
|
|
m = -1;
|
|
|
|
d = 0;
|
|
|
|
for (i = 0; i < a.length; ++i) {
|
|
|
|
if (a[i].search(/[a-zA-Z]+/) != -1) {
|
|
|
|
var t = -1;
|
|
|
|
for (j = 0; j < 12; ++j) {
|
|
|
|
if (BI.Date._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
|
|
|
|
t = j;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (t != -1) {
|
|
|
|
if (m != -1) {
|
|
|
|
d = m + 1;
|
|
|
|
}
|
|
|
|
m = t;
|
|
|
|
}
|
|
|
|
} else if (parseInt(a[i], 10) <= 12 && m == -1) {
|
|
|
|
m = a[i] - 1;
|
|
|
|
} else if (parseInt(a[i], 10) > 31 && y == 0) {
|
|
|
|
y = parseInt(a[i], 10);
|
|
|
|
(y < 100) && (y += (y > 29) ? 1900 : 2000);
|
|
|
|
} else if (d == 0) {
|
|
|
|
d = a[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (y == 0) {
|
|
|
|
y = today.getFullYear();
|
|
|
|
}
|
|
|
|
if (m != -1 && d != 0) {
|
|
|
|
return BI.getDate(y, m, d, hr, min, sec);
|
|
|
|
}
|
|
|
|
return today;
|
|
|
|
},
|
|
|
|
|
|
|
|
getDate: function () {
|
|
|
|
var length = arguments.length;
|
|
|
|
var args = arguments;
|
|
|
|
var dt;
|
|
|
|
switch (length) {
|
|
|
|
// new Date()
|
|
|
|
case 0:
|
|
|
|
dt = new Date();
|
|
|
|
break;
|
|
|
|
// new Date(long)
|
|
|
|
case 1:
|
|
|
|
dt = new Date(args[0]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month)
|
|
|
|
case 2:
|
|
|
|
dt = new Date(args[0], args[1]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day)
|
|
|
|
case 3:
|
|
|
|
dt = new Date(args[0], args[1], args[2]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour)
|
|
|
|
case 4:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour, minute)
|
|
|
|
case 5:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3], args[4]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour, minute, second)
|
|
|
|
case 6:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour, minute, second, millisecond)
|
|
|
|
case 7:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
dt = new Date();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (BI.isNotNull(BI.timeZone) && (arguments.length === 0 || (arguments.length === 1 && BI.isNumber(arguments[0])))) {
|
|
|
|
var localTime = dt.getTime();
|
|
|
|
// BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准
|
|
|
|
var localOffset = dt.getTimezoneOffset() * 60000; // 获得当地时间偏移的毫秒数
|
|
|
|
var utc = localTime + localOffset; // utc即GMT时间标准时区
|
|
|
|
return new Date(utc + BI.timeZone);// + Pool.timeZone.offset);
|
|
|
|
}
|
|
|
|
return dt;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
getTime: function () {
|
|
|
|
var length = arguments.length;
|
|
|
|
var args = arguments;
|
|
|
|
var dt;
|
|
|
|
switch (length) {
|
|
|
|
// new Date()
|
|
|
|
case 0:
|
|
|
|
dt = new Date();
|
|
|
|
break;
|
|
|
|
// new Date(long)
|
|
|
|
case 1:
|
|
|
|
dt = new Date(args[0]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month)
|
|
|
|
case 2:
|
|
|
|
dt = new Date(args[0], args[1]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day)
|
|
|
|
case 3:
|
|
|
|
dt = new Date(args[0], args[1], args[2]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour)
|
|
|
|
case 4:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour, minute)
|
|
|
|
case 5:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3], args[4]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour, minute, second)
|
|
|
|
case 6:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5]);
|
|
|
|
break;
|
|
|
|
// new Date(year, month, day, hour, minute, second, millisecond)
|
|
|
|
case 7:
|
|
|
|
dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
dt = new Date();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (BI.isNotNull(BI.timeZone)) {
|
|
|
|
// BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准
|
|
|
|
return dt.getTime() - BI.timeZone - new Date().getTimezoneOffset() * 60000;
|
|
|
|
}
|
|
|
|
return dt.getTime();
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
})();
|