2018-08-04 21:46:25 +00:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
global.W = {
|
|
|
|
extend: function () {
|
|
|
|
var lTarget = arguments[0] || {};
|
|
|
|
var lIndex = 1;
|
|
|
|
var lLength = arguments.length;
|
|
|
|
var lDeep = false;
|
|
|
|
var lOptions, lName, lSrc, lCopy, lCopyIsArray, lClone;
|
|
|
|
|
|
|
|
// Handle a deep copy situation
|
|
|
|
if (typeof lTarget === "boolean") {
|
|
|
|
lDeep = lTarget;
|
|
|
|
lTarget = arguments[1] || {};
|
|
|
|
// skip the boolean and the target
|
|
|
|
lIndex = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle case when target is a string or something (possible in deep
|
|
|
|
// copy)
|
|
|
|
if (typeof lTarget !== "object" && typeof lTarget != "function") {
|
|
|
|
lTarget = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lLength === lIndex) {
|
|
|
|
lTarget = this;
|
|
|
|
--lIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (; lIndex < lLength; lIndex++) {
|
|
|
|
// Only deal with non-null/undefined values
|
|
|
|
if ((lOptions = arguments[lIndex]) != undefined) {
|
|
|
|
// Extend the base object
|
|
|
|
for (lName in lOptions) {
|
|
|
|
lSrc = lTarget[lName];
|
|
|
|
lCopy = lOptions[lName];
|
|
|
|
|
|
|
|
// Prevent never-ending loop
|
|
|
|
if (lTarget === lCopy) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Recurse if we're merging plain objects or arrays
|
|
|
|
if (lDeep && lCopy && (Object.isObject(lCopy) || (lCopyIsArray = Array.isArray(lCopy)))) {
|
|
|
|
if (lCopyIsArray) {
|
|
|
|
lCopyIsArray = false;
|
|
|
|
lClone = lSrc && Array.isArray(lSrc) ? lSrc : [];
|
|
|
|
|
|
|
|
} else {
|
|
|
|
lClone = lSrc && Object.isObject(lSrc) ? lSrc : {};
|
|
|
|
}
|
|
|
|
|
|
|
|
// Never move original objects, clone them
|
|
|
|
lTarget[lName] = Object.extend(lDeep, lClone, lCopy);
|
|
|
|
|
|
|
|
// Don't bring in undefined values
|
|
|
|
} else {
|
|
|
|
if (lCopy !== undefined) {
|
|
|
|
lTarget[lName] = lCopy;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return the modified object
|
|
|
|
return lTarget;
|
2019-01-26 18:54:22 +00:00
|
|
|
},
|
|
|
|
touchToMouse: function (e) {
|
|
|
|
e.preventDefault();
|
|
|
|
if (e.touches.length > 1 || (e.type == "touchend" && e.touches.length > 0))
|
|
|
|
return;
|
|
|
|
|
|
|
|
var type = null;
|
|
|
|
var touch = null;
|
|
|
|
var src = e.currentTarget;
|
|
|
|
switch (e.type) {
|
|
|
|
case "touchstart":
|
|
|
|
type = "mousedown";
|
|
|
|
touch = e.changedTouches[0];
|
|
|
|
|
|
|
|
break;
|
|
|
|
case "touchmove":
|
|
|
|
type = "mousemove";
|
|
|
|
touch = e.changedTouches[0];
|
|
|
|
src = window;
|
|
|
|
break;
|
|
|
|
case "touchend":
|
|
|
|
type = "mouseup";
|
|
|
|
touch = e.changedTouches[0];
|
|
|
|
src = window;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
var event = new MouseEvent(type, {
|
|
|
|
button: 0,
|
|
|
|
screenX: touch.screenX,
|
|
|
|
screenY: touch.screenY,
|
|
|
|
clientX: touch.clientX,
|
|
|
|
clientY: touch.clientY
|
|
|
|
});
|
|
|
|
src.dispatchEvent(event);
|
2018-08-04 21:46:25 +00:00
|
|
|
}
|
|
|
|
};
|