mirror of
https://github.com/liriliri/eruda.git
synced 2026-04-05 10:28:34 +08:00
2080 lines
49 KiB
JavaScript
2080 lines
49 KiB
JavaScript
// Built by eustia.
|
|
module.exports = (function ()
|
|
{
|
|
var _ = {};
|
|
|
|
/* ------------------------------ last ------------------------------ */
|
|
|
|
var last;
|
|
|
|
_.last = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* last: Gets the last element of array.
|
|
* array(array): The array to query.
|
|
* return(*): Returns the last element of array.
|
|
*/
|
|
|
|
last = function (arr)
|
|
{
|
|
var len = arr ? arr.length : 0;
|
|
|
|
return len ? arr[len - 1] : undefined;
|
|
};
|
|
|
|
return last;
|
|
})();
|
|
|
|
/* ------------------------------ isUndef ------------------------------ */
|
|
|
|
var isUndef;
|
|
|
|
_.isUndef = (function ()
|
|
{
|
|
/* function
|
|
*
|
|
* isUndef: Checks if value is undefined.
|
|
* value(*): The value to check.
|
|
* return(boolean): Returns true if value is undefined, else false.
|
|
*
|
|
* ```javascript
|
|
* _.isUndef(void 0) // -> true
|
|
* _.isUndef(null) // -> false
|
|
* ```
|
|
*
|
|
* Just a shortcut for **x === undefined**, doesn't matter that much whether you
|
|
* use it or not.
|
|
*/
|
|
|
|
isUndef = function (value) { return value === void 0 };
|
|
|
|
return isUndef;
|
|
})();
|
|
|
|
/* ------------------------------ isObj ------------------------------ */
|
|
|
|
var isObj;
|
|
|
|
_.isObj = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* isObj: Checks if value is the language type of Object.
|
|
* value(*): The value to check.
|
|
* return(boolean): Returns true if value is an object, else false.
|
|
*/
|
|
|
|
isObj = function (val)
|
|
{
|
|
var type = typeof val;
|
|
|
|
return type === 'function' || type === 'object';
|
|
};
|
|
|
|
return isObj;
|
|
})();
|
|
|
|
/* ------------------------------ camelize ------------------------------ */
|
|
|
|
var camelize;
|
|
|
|
_.camelize = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* camelCase: Convert string to "camelCase" text.
|
|
*/
|
|
|
|
camelize = function (str, char)
|
|
{
|
|
char = char || '-';
|
|
|
|
return str.replace(new RegExp(char + '+(.)?', 'g'), function (match, char)
|
|
{
|
|
return char ? char.toUpperCase() : '';
|
|
});
|
|
};
|
|
|
|
return camelize;
|
|
})();
|
|
|
|
/* ------------------------------ dasherize ------------------------------ */
|
|
|
|
var dasherize;
|
|
|
|
_.dasherize = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
*
|
|
* dasherize: Convert string to "dashCase".
|
|
*/
|
|
|
|
dasherize = function (str)
|
|
{
|
|
return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
|
};
|
|
|
|
return dasherize;
|
|
})();
|
|
|
|
/* ------------------------------ inherits ------------------------------ */
|
|
|
|
var inherits;
|
|
|
|
_.inherits = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* inherits: Inherit the prototype methods from one constructor into another.
|
|
* Class(function): Child Class.
|
|
* SuperClass(function): Super Class.
|
|
*/
|
|
|
|
var objCreate = Object.create;
|
|
|
|
function noop() {}
|
|
|
|
inherits = function (Class, SuperClass)
|
|
{
|
|
if (objCreate) return Class.prototype = objCreate(SuperClass.prototype);
|
|
|
|
noop.prototype = SuperClass.prototype;
|
|
Class.prototype = new noop();
|
|
};
|
|
|
|
return inherits;
|
|
})();
|
|
|
|
/* ------------------------------ has ------------------------------ */
|
|
|
|
var has;
|
|
|
|
_.has = (function ()
|
|
{
|
|
/* function
|
|
* has: Checks if key is a direct property.
|
|
* object(object): The object to query.
|
|
* key(string): The path to check.
|
|
* return(boolean): Returns true if key is a direct property, else false.
|
|
*/
|
|
|
|
var hasOwnProp = Object.prototype.hasOwnProperty;
|
|
|
|
has = function (obj, key)
|
|
{
|
|
return hasOwnProp.call(obj, key);
|
|
};
|
|
|
|
return has;
|
|
})();
|
|
|
|
/* ------------------------------ slice ------------------------------ */
|
|
|
|
var slice;
|
|
|
|
_.slice = (function ()
|
|
{
|
|
// TODO
|
|
|
|
var arrProto = Array.prototype;
|
|
|
|
slice = function (arr, start, end)
|
|
{
|
|
return arrProto.slice.call(arr, start, end);
|
|
};
|
|
|
|
return slice;
|
|
})();
|
|
|
|
/* ------------------------------ _createAssigner ------------------------------ */
|
|
|
|
var _createAssigner;
|
|
|
|
_._createAssigner = (function ()
|
|
{
|
|
|
|
_createAssigner = function (keysFunc, defaults)
|
|
{
|
|
return function (obj)
|
|
{
|
|
var len = arguments.length;
|
|
|
|
if (defaults) obj = Object(obj);
|
|
|
|
if (len < 2 || obj == null) return obj;
|
|
|
|
for (var i = 1; i < len; i++)
|
|
{
|
|
var src = arguments[i],
|
|
keys = keysFunc(src),
|
|
keysLen = keys.length;
|
|
|
|
for (var j = 0; j < keysLen; j++)
|
|
{
|
|
var key = keys[j];
|
|
if (!defaults || isUndef(obj[key])) obj[key] = src[key];
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
};
|
|
};
|
|
|
|
return _createAssigner;
|
|
})();
|
|
|
|
/* ------------------------------ allKeys ------------------------------ */
|
|
|
|
var allKeys;
|
|
|
|
_.allKeys = (function ()
|
|
{
|
|
/* function
|
|
* allKeys: Retrieve all the names of object's own and inherited properties.
|
|
* object(object): The object to query.
|
|
* return(array): Returns the array of all property names.
|
|
*
|
|
* ```javascript
|
|
* var obj = Object.create({ a: 0 });
|
|
* obj.b = 1;
|
|
* _.allKeys(obj) // -> ['a', 'b']
|
|
* ```
|
|
*
|
|
* > Members of Object's prototype won't be retrieved.
|
|
*/
|
|
|
|
allKeys = function (obj)
|
|
{
|
|
var ret = [], key;
|
|
|
|
for (key in obj) ret.push(key);
|
|
|
|
return ret;
|
|
};
|
|
|
|
return allKeys;
|
|
})();
|
|
|
|
/* ------------------------------ extend ------------------------------ */
|
|
|
|
var extend;
|
|
|
|
_.extend = (function ()
|
|
{
|
|
// TODO
|
|
|
|
extend = _createAssigner(allKeys);
|
|
|
|
return extend;
|
|
})();
|
|
|
|
/* ------------------------------ indexOf ------------------------------ */
|
|
|
|
var indexOf;
|
|
|
|
_.indexOf = (function ()
|
|
{
|
|
// TODO
|
|
|
|
indexOf = function (arr, val)
|
|
{
|
|
return Array.prototype.indexOf.call(arr, val);
|
|
};
|
|
|
|
return indexOf;
|
|
})();
|
|
|
|
/* ------------------------------ defaults ------------------------------ */
|
|
|
|
var defaults;
|
|
|
|
_.defaults = (function ()
|
|
{
|
|
// TODO
|
|
|
|
defaults = _createAssigner(allKeys, true);
|
|
|
|
return defaults;
|
|
})();
|
|
|
|
/* ------------------------------ keys ------------------------------ */
|
|
|
|
var keys;
|
|
|
|
_.keys = (function ()
|
|
{
|
|
/* function
|
|
* keys: Creates an array of the own enumerable property names of object.
|
|
* object(object): The object to query.
|
|
* return(array): Returns the array of property names.
|
|
*/
|
|
|
|
keys = Object.keys || function (obj)
|
|
{
|
|
var ret = [], key;
|
|
|
|
for (key in obj)
|
|
{
|
|
if (has(obj, key)) ret.push(key);
|
|
}
|
|
|
|
return ret;
|
|
};
|
|
|
|
return keys;
|
|
})();
|
|
|
|
/* ------------------------------ evalCss ------------------------------ */
|
|
|
|
var evalCss;
|
|
|
|
_.evalCss = (function ()
|
|
{
|
|
evalCss = function (css)
|
|
{
|
|
var style = document.createElement('style');
|
|
style.textContent = css;
|
|
style.type = 'text/css';
|
|
document.body.appendChild(style);
|
|
};
|
|
|
|
return evalCss;
|
|
})();
|
|
|
|
/* ------------------------------ extendOwn ------------------------------ */
|
|
|
|
var extendOwn;
|
|
|
|
_.extendOwn = (function ()
|
|
{
|
|
// TODO
|
|
|
|
extendOwn = _createAssigner(keys);
|
|
|
|
return extendOwn;
|
|
})();
|
|
|
|
/* ------------------------------ objToStr ------------------------------ */
|
|
|
|
var objToStr;
|
|
|
|
_.objToStr = (function ()
|
|
{
|
|
/* function
|
|
* objToStr: Alias of Object.prototype.toString.
|
|
* value(*): The source value.
|
|
* return(string): String representation of the given value.
|
|
*/
|
|
|
|
var ObjToStr = Object.prototype.toString;
|
|
|
|
objToStr = function (val)
|
|
{
|
|
return ObjToStr.call(val);
|
|
};
|
|
|
|
return objToStr;
|
|
})();
|
|
|
|
/* ------------------------------ isArr ------------------------------ */
|
|
|
|
var isArr;
|
|
|
|
_.isArr = (function ()
|
|
{
|
|
/* function
|
|
* isArr: Check if value is an array.
|
|
* value(*): The value to check.
|
|
* return(boolean): True if value is an array, else false.
|
|
*/
|
|
|
|
isArr = Array.isArray || function (val)
|
|
{
|
|
return objToStr(val) === '[object Array]';
|
|
};
|
|
|
|
return isArr;
|
|
})();
|
|
|
|
/* ------------------------------ isNum ------------------------------ */
|
|
|
|
var isNum;
|
|
|
|
_.isNum = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* isNum: Checks if value is classified as a Number primitive or object.
|
|
* value(*): The value to check.
|
|
* return(boolean): Returns true if value is correctly classified, else false.
|
|
*/
|
|
|
|
isNum = function (value) { return objToStr(value) === '[object Number]' };
|
|
|
|
return isNum;
|
|
})();
|
|
|
|
/* ------------------------------ cookie ------------------------------ */
|
|
|
|
var cookie;
|
|
|
|
_.cookie = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* module
|
|
* cookie: Simple api for handling browser cookies.
|
|
*/
|
|
|
|
var defOpts = { path: '/' };
|
|
|
|
function setCookie(key, val, options)
|
|
{
|
|
if (arguments.length > 1)
|
|
{
|
|
options = extend(defOpts, options);
|
|
|
|
if (isNum(options.expires))
|
|
{
|
|
var expires = new Date();
|
|
expires.setMilliseconds(expires.getMilliseconds() + options.expires * 864e+5);
|
|
options.expires = expires;
|
|
}
|
|
|
|
val = encodeURIComponent(String(val));
|
|
key = encodeURIComponent(key);
|
|
|
|
document.cookie = [
|
|
key, '=', val,
|
|
options.expires && '; expires=' + options.expires.toUTCString(),
|
|
options.path && '; path=' + options.path,
|
|
options.domain && '; domain=' + options.domain,
|
|
options.secure ? '; secure' : ''
|
|
].join('');
|
|
|
|
return cookie;
|
|
}
|
|
|
|
var cookies = document.cookie ? document.cookie.split('; ') : [],
|
|
result = key ? undefined : {};
|
|
|
|
for (var i = 0, len = cookies.length; i < len; i++)
|
|
{
|
|
var c = cookies[i],
|
|
parts = c.split('='),
|
|
name = decodeURIComponent(parts.shift());
|
|
|
|
c = parts.join('=');
|
|
c = decodeURIComponent(c);
|
|
|
|
if (key === name)
|
|
{
|
|
result = c;
|
|
break;
|
|
}
|
|
|
|
if (!key) result[name] = c;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
cookie = {
|
|
/* member
|
|
* cookie.get: Read cookie.
|
|
* key(string): The cookie name.
|
|
* return(string): Returns cookie value if exists, eles undefined.
|
|
*/
|
|
get: setCookie,
|
|
/* member
|
|
* cookie.set: Set cookie.
|
|
* key(string): The cookie name.
|
|
* val(string): The cookie value.
|
|
* options(Object): Options.
|
|
*/
|
|
set: setCookie,
|
|
remove: function (key, options)
|
|
{
|
|
options = options || {};
|
|
options.expires = -1;
|
|
return setCookie(key, '', options);
|
|
}
|
|
};
|
|
|
|
return cookie;
|
|
})();
|
|
|
|
/* ------------------------------ isArrLike ------------------------------ */
|
|
|
|
var isArrLike;
|
|
|
|
_.isArrLike = (function ()
|
|
{
|
|
// TODO
|
|
|
|
var MAX_ARR_IDX = Math.pow(2, 53) - 1;
|
|
|
|
isArrLike = function (val)
|
|
{
|
|
if (!has(val, 'length')) return false;
|
|
|
|
var len = val.length;
|
|
|
|
return isNum(len) && len >= 0 && len <= MAX_ARR_IDX;
|
|
};
|
|
|
|
return isArrLike;
|
|
})();
|
|
|
|
/* ------------------------------ each ------------------------------ */
|
|
|
|
var each;
|
|
|
|
_.each = (function ()
|
|
{
|
|
// TODO
|
|
|
|
each = function (obj, iteratee, ctx)
|
|
{
|
|
var i, len;
|
|
|
|
if (isArrLike(obj))
|
|
{
|
|
for (i = 0, len = obj.length; i < len; i++) iteratee.call(ctx, obj[i], i, obj);
|
|
} else
|
|
{
|
|
var _keys = keys(obj);
|
|
for (i = 0, len = _keys.length; i < len; i++)
|
|
{
|
|
iteratee.call(ctx, obj[_keys[i]], _keys[i], obj);
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
};
|
|
|
|
return each;
|
|
})();
|
|
|
|
/* ------------------------------ values ------------------------------ */
|
|
|
|
var values;
|
|
|
|
_.values = (function ()
|
|
{
|
|
/* function
|
|
* values: Creates an array of the own enumerable property values of object.
|
|
* object(object): The object to query.
|
|
* return(array): The array of property values.
|
|
*
|
|
* ```javascript
|
|
* values({one: 1, two: 2}); // -> [1, 2]
|
|
* ```
|
|
*/
|
|
|
|
values = function (obj)
|
|
{
|
|
var ret = [];
|
|
|
|
each(obj, function (val) { ret.push(val) });
|
|
|
|
return ret;
|
|
};
|
|
|
|
return values;
|
|
})();
|
|
|
|
/* ------------------------------ contain ------------------------------ */
|
|
|
|
var contain;
|
|
|
|
_.contain = (function ()
|
|
{
|
|
// TODO
|
|
|
|
contain = function (arr, val)
|
|
{
|
|
if (!isArrLike(arr)) arr = values(arr);
|
|
|
|
return indexOf(arr, val) >= 0;
|
|
};
|
|
|
|
return contain;
|
|
})();
|
|
|
|
/* ------------------------------ isStr ------------------------------ */
|
|
|
|
var isStr;
|
|
|
|
_.isStr = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* isStr: Checks if value is classified as a String primitive or object.
|
|
* value(*): The value to check.
|
|
* return(boolean): Returns true if value is correctly classified, else false.
|
|
*/
|
|
|
|
isStr = function (value) { return objToStr(value) === '[object String]' };
|
|
|
|
return isStr;
|
|
})();
|
|
|
|
/* ------------------------------ isErr ------------------------------ */
|
|
|
|
var isErr;
|
|
|
|
_.isErr = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* isErr: Checks if value is an Error.
|
|
* value(*): The value to check.
|
|
* return(boolean): Returns true if value is an error object, else false.
|
|
*/
|
|
|
|
isErr = function (val) { return objToStr(val) === '[object Error]' };
|
|
|
|
return isErr;
|
|
})();
|
|
|
|
/* ------------------------------ isFn ------------------------------ */
|
|
|
|
var isFn;
|
|
|
|
_.isFn = (function ()
|
|
{
|
|
/* function
|
|
* isFn: Check if value is a function.
|
|
* value(*): The value to check.
|
|
* return(boolean): True if value is a function, else false.
|
|
*/
|
|
|
|
isFn = function (val)
|
|
{
|
|
return objToStr(val) === '[object Function]';
|
|
};
|
|
|
|
return isFn;
|
|
})();
|
|
|
|
/* ------------------------------ isMatch ------------------------------ */
|
|
|
|
var isMatch;
|
|
|
|
_.isMatch = (function ()
|
|
{
|
|
// TODO
|
|
|
|
isMatch = function (obj, attrs)
|
|
{
|
|
var _keys = keys(attrs),
|
|
len = _keys.length;
|
|
|
|
if (obj == null) return !len;
|
|
|
|
obj = Object(obj);
|
|
|
|
for (var i = 0; i < len; i++)
|
|
{
|
|
var key = keys[i];
|
|
if (attrs[key] !== obj[key] || !(key in obj)) return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
return isMatch;
|
|
})();
|
|
|
|
/* ------------------------------ isRegExp ------------------------------ */
|
|
|
|
var isRegExp;
|
|
|
|
_.isRegExp = (function ()
|
|
{
|
|
// TODO
|
|
|
|
isRegExp = function (value)
|
|
{
|
|
return objToStr(value) === '[object RegExp]';
|
|
};
|
|
|
|
return isRegExp;
|
|
})();
|
|
|
|
/* ------------------------------ loadJs ------------------------------ */
|
|
|
|
var loadJs;
|
|
|
|
_.loadJs = (function ()
|
|
{
|
|
loadJs = function (url, cb)
|
|
{
|
|
var script = document.createElement('script');
|
|
script.src = url;
|
|
script.onload = function ()
|
|
{
|
|
var isNotLoaded = script.readyState &&
|
|
script.readyState != "complete" &&
|
|
script.readyState != "loaded";
|
|
|
|
cb && cb(!isNotLoaded);
|
|
};
|
|
document.body.appendChild(script);
|
|
};
|
|
|
|
return loadJs;
|
|
})();
|
|
|
|
/* ------------------------------ ltrim ------------------------------ */
|
|
|
|
var ltrim;
|
|
|
|
_.ltrim = (function ()
|
|
{
|
|
// TODO
|
|
|
|
var regSpace = /^\s+/;
|
|
|
|
ltrim = function (str, chars)
|
|
{
|
|
if (chars == null) return str.replace(regSpace, '');
|
|
|
|
var start = 0,
|
|
len = str.length,
|
|
charLen = chars.length,
|
|
found = true,
|
|
i, c;
|
|
|
|
while (found && start < len)
|
|
{
|
|
found = false;
|
|
i = -1;
|
|
c = str.charAt(start);
|
|
|
|
while (++i < charLen)
|
|
{
|
|
if (c === chars[i])
|
|
{
|
|
found = true;
|
|
start++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return (start >= len) ? '' : str.substr(start, len);
|
|
};
|
|
|
|
return ltrim;
|
|
})();
|
|
|
|
/* ------------------------------ matcher ------------------------------ */
|
|
|
|
var matcher;
|
|
|
|
_.matcher = (function ()
|
|
{
|
|
// TODO
|
|
|
|
matcher = function (attrs)
|
|
{
|
|
attrs = extendOwn({}, attrs);
|
|
|
|
return function (obj)
|
|
{
|
|
return isMatch(obj, attrs);
|
|
};
|
|
};
|
|
|
|
return matcher;
|
|
})();
|
|
|
|
/* ------------------------------ now ------------------------------ */
|
|
|
|
var now;
|
|
|
|
_.now = (function ()
|
|
{
|
|
/* function
|
|
* now: Gets the number of milliseconds that have elapsed since the Unix epoch.
|
|
* return(number): Current timestamp.
|
|
*/
|
|
|
|
now = Date.now || function ()
|
|
{
|
|
return new Date().getTime();
|
|
};
|
|
|
|
return now;
|
|
})();
|
|
|
|
/* ------------------------------ optimizeCb ------------------------------ */
|
|
|
|
var optimizeCb;
|
|
|
|
_.optimizeCb = (function ()
|
|
{
|
|
|
|
optimizeCb = function (func, ctx, argCount)
|
|
{
|
|
if (isUndef(ctx)) return func;
|
|
|
|
switch (argCount == null ? 3 : argCount)
|
|
{
|
|
case 1: return function (val)
|
|
{
|
|
return func.call(ctx, val);
|
|
};
|
|
case 3: return function (val, idx, collection)
|
|
{
|
|
return func.call(ctx, val, idx, collection);
|
|
};
|
|
case 4: return function (accumulator, val, idx, collection)
|
|
{
|
|
return func.call(ctx, accumulator, val, idx, collection);
|
|
}
|
|
}
|
|
|
|
return function ()
|
|
{
|
|
return func.apply(ctx, arguments);
|
|
};
|
|
};
|
|
|
|
return optimizeCb;
|
|
})();
|
|
|
|
/* ------------------------------ safeCb ------------------------------ */
|
|
|
|
var safeCb;
|
|
|
|
_.safeCb = (function ()
|
|
{
|
|
/* function
|
|
* safeCb: Create callback based on input value.
|
|
*/
|
|
|
|
safeCb = function (val, ctx, argCount)
|
|
{
|
|
if (val == null) return function (val) { return val };
|
|
|
|
if (isFn(val)) return optimizeCb(val, ctx, argCount);
|
|
|
|
if (isObj(val)) return matcher(val);
|
|
|
|
return function (key)
|
|
{
|
|
return function (obj)
|
|
{
|
|
return obj == null ? undefined : obj[key];
|
|
}
|
|
};
|
|
};
|
|
|
|
return safeCb;
|
|
})();
|
|
|
|
/* ------------------------------ filter ------------------------------ */
|
|
|
|
var filter;
|
|
|
|
_.filter = (function ()
|
|
{
|
|
// TODO
|
|
|
|
filter = function (obj, predicate, ctx)
|
|
{
|
|
var ret = [];
|
|
|
|
predicate = safeCb(predicate, ctx);
|
|
|
|
each(obj, function (val, idx, list)
|
|
{
|
|
if (predicate(val, idx, list)) ret.push(val);
|
|
});
|
|
|
|
return ret;
|
|
};
|
|
|
|
return filter;
|
|
})();
|
|
|
|
/* ------------------------------ map ------------------------------ */
|
|
|
|
var map;
|
|
|
|
_.map = (function ()
|
|
{
|
|
// TODO
|
|
|
|
map = function (obj, iteratee, ctx)
|
|
{
|
|
iteratee = safeCb(iteratee, ctx);
|
|
|
|
var _keys = !isArrLike(obj) && keys(obj),
|
|
len = (_keys || obj).length,
|
|
results = Array(len);
|
|
|
|
for (var i = 0; i < len; i++)
|
|
{
|
|
var curKey = _keys ? _keys[i] : i;
|
|
results[i] = iteratee(obj[curKey], curKey, obj);
|
|
}
|
|
|
|
return results;
|
|
};
|
|
|
|
return map;
|
|
})();
|
|
|
|
/* ------------------------------ toArr ------------------------------ */
|
|
|
|
var toArr;
|
|
|
|
_.toArr = (function ()
|
|
{
|
|
|
|
toArr = function (obj)
|
|
{
|
|
if (isArr(obj)) return obj;
|
|
|
|
return isArrLike(obj) && !isStr(obj)
|
|
? map(obj, function (val) { return val })
|
|
: [obj];
|
|
};
|
|
|
|
return toArr;
|
|
})();
|
|
|
|
/* ------------------------------ Class ------------------------------ */
|
|
|
|
var Class;
|
|
|
|
_.Class = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
*
|
|
* Class: Create JavaScript class.
|
|
* methods(object): Public methods.
|
|
* statics(object): Static methods.
|
|
* return(function): Return function used to create instances.
|
|
*/
|
|
|
|
var regCallSuper = /callSuper/;
|
|
|
|
function makeClass(parent, methods, statics)
|
|
{
|
|
statics = statics || {};
|
|
|
|
var ctor = function ()
|
|
{
|
|
var args = toArr(arguments);
|
|
|
|
if (has(ctor.prototype, 'initialize') &&
|
|
!regCallSuper.test(this.initialize.toString()) &&
|
|
this.callSuper)
|
|
{
|
|
args.unshift('initialize');
|
|
this.callSuper.apply(this, args);
|
|
args.shift();
|
|
}
|
|
|
|
return this.initialize
|
|
? this.initialize.apply(this, args) || this
|
|
: this;
|
|
};
|
|
|
|
inherits(ctor, parent);
|
|
ctor.superclass = ctor.prototype.superclass = parent;
|
|
|
|
ctor.extend = function (methods, statics) { return makeClass(ctor, methods, statics) };
|
|
ctor.inherits = function (Class) { inherits(Class, ctor) };
|
|
ctor.methods = function (methods) { extend(ctor.prototype, methods); return ctor };
|
|
ctor.statics = function (statics) { extend(ctor, statics); return ctor };
|
|
|
|
ctor.methods(methods).statics(statics);
|
|
|
|
return ctor;
|
|
}
|
|
|
|
Class = function (methods, statics) { return Base.extend(methods, statics) };
|
|
|
|
var Base = Class.Base = makeClass(Object, {
|
|
className: 'Base',
|
|
callSuper: function (name)
|
|
{
|
|
var superMethod = this.superclass.prototype[name];
|
|
|
|
if (!superMethod) return;
|
|
|
|
return superMethod.apply(this, toArr(arguments).slice(1));
|
|
},
|
|
toString: function ()
|
|
{
|
|
return this.className;
|
|
}
|
|
});
|
|
|
|
return Class;
|
|
})();
|
|
|
|
/* ------------------------------ Emitter ------------------------------ */
|
|
|
|
var Emitter;
|
|
|
|
_.Emitter = (function ()
|
|
{
|
|
|
|
Emitter = Class({
|
|
initialize: function ()
|
|
{
|
|
this._events = this._events || {};
|
|
},
|
|
on: function (event, listener)
|
|
{
|
|
this._events[event] = this._events[event] || [];
|
|
this._events[event].push(listener);
|
|
|
|
return this;
|
|
},
|
|
off: function (event, listener)
|
|
{
|
|
if (!has(this._events, event)) return;
|
|
|
|
this._events[event].splice(this._events[event].indexOf(listener), 1);
|
|
|
|
return this;
|
|
},
|
|
once: function (event, listener)
|
|
{
|
|
var fired = false;
|
|
|
|
function g()
|
|
{
|
|
this.off(event, g);
|
|
if (!fired)
|
|
{
|
|
fired = true;
|
|
listener.apply(this, arguments);
|
|
}
|
|
}
|
|
|
|
this.on(event, g);
|
|
|
|
return this;
|
|
},
|
|
emit: function (event)
|
|
{
|
|
if (!has(this._events, event)) return;
|
|
|
|
var args = slice(arguments, 1);
|
|
|
|
each(this._events[event], function (val)
|
|
{
|
|
val.apply(this, args);
|
|
}, this);
|
|
|
|
return this;
|
|
}
|
|
}, {
|
|
mixin: function (obj)
|
|
{
|
|
each(['on', 'off', 'once', 'emit'], function (val)
|
|
{
|
|
obj[val] = Emitter.prototype[val];
|
|
});
|
|
|
|
obj._events = obj._events || {};
|
|
}
|
|
});
|
|
|
|
return Emitter;
|
|
})();
|
|
|
|
/* ------------------------------ delegate ------------------------------ */
|
|
|
|
var delegate;
|
|
|
|
_.delegate = (function ()
|
|
{
|
|
|
|
function retTrue() { return true }
|
|
function retFalse() { return false }
|
|
|
|
function trigger(e)
|
|
{
|
|
var handlers = this.events[e.type],
|
|
handler,
|
|
handlerQueue = formatHandlers.call(this, e, handlers);
|
|
|
|
e = new delegate.Event(e);
|
|
|
|
var i = 0, j, matched, ret;
|
|
|
|
while ((matched = handlerQueue[i++]) && !e.isPropagationStopped())
|
|
{
|
|
e.curTarget = matched.el;
|
|
j = 0;
|
|
while ((handler = matched.handlers[j++]) && !e.isImmediatePropagationStopped())
|
|
{
|
|
ret = handler.handler.apply(matched.el, [e]);
|
|
|
|
if (ret === false)
|
|
{
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function formatHandlers(e, handlers)
|
|
{
|
|
var current = e.target,
|
|
ret = [],
|
|
delegateCount = handlers.delegateCount,
|
|
selector, matches, handler, i;
|
|
|
|
if (current.nodeType)
|
|
{
|
|
for (; current !== this; current = current.parentNode || this)
|
|
{
|
|
matches = [];
|
|
for (i = 0; i < delegateCount; i++)
|
|
{
|
|
handler = handlers[i];
|
|
selector = handler.selector + ' ';
|
|
if (matches[selector] === undefined)
|
|
{
|
|
matches[selector] = contain(this.querySelectorAll(selector), current);
|
|
}
|
|
if (matches[selector]) matches.push(handler);
|
|
}
|
|
if (matches.length) ret.push({ el: current, handlers: matches});
|
|
}
|
|
}
|
|
|
|
if (delegateCount < handlers.length)
|
|
{
|
|
ret.push({
|
|
el: this,
|
|
handlers: handlers.slice(delegateCount)
|
|
});
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
delegate = {
|
|
add: function (el, type, selector, fn)
|
|
{
|
|
var handler = {
|
|
selector: selector,
|
|
handler : fn
|
|
},
|
|
handlers;
|
|
|
|
if (!el.events) el.events = {};
|
|
|
|
if (!(handlers = el.events[type]))
|
|
{
|
|
handlers = el.events[type] = [];
|
|
handlers.delegateCount = 0;
|
|
el.addEventListener(type, function (e)
|
|
{
|
|
trigger.apply(el, arguments);
|
|
}, false);
|
|
}
|
|
|
|
selector ? handlers.splice(handlers.delegateCount++, 0, handler)
|
|
: handlers.push(handler);
|
|
},
|
|
remove: function (el, type, selector, fn)
|
|
{
|
|
var events = el.events;
|
|
|
|
if (!events || !events[type]) return;
|
|
|
|
var handlers = events[type],
|
|
i = handlers.length,
|
|
handler;
|
|
|
|
while (i--)
|
|
{
|
|
handler = handlers[i];
|
|
|
|
if ((!selector || handler.selector == selector) && handler.handler == fn)
|
|
{
|
|
handlers.splice(i, 1);
|
|
if (handler.selector)
|
|
{
|
|
handlers.delegateCount--;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
Event: Class({
|
|
className: 'Event',
|
|
initialize: function Event(e) { this.origEvent = e },
|
|
isDefaultPrevented: retFalse,
|
|
isPropagationStopped: retFalse,
|
|
isImmediatePropagationStopped: retFalse,
|
|
preventDefault: function ()
|
|
{
|
|
var e = this.origEvent;
|
|
|
|
this.isDefaultPrevented = retTrue;
|
|
if (e && e.preventDefault) e.preventDefault();
|
|
},
|
|
stopPropagation: function ()
|
|
{
|
|
var e = this.origEvent;
|
|
|
|
this.isPropagationStopped = retTrue;
|
|
if (e && e.stopPropagation) e.stopPropagation();
|
|
},
|
|
stopImmediatePropagation: function ()
|
|
{
|
|
var e = this.origEvent;
|
|
|
|
this.isImmediatePropagationStopped = retTrue;
|
|
if (e && e.stopImmediatePropagation) e.stopImmediatePropagation();
|
|
this.stopPropagation();
|
|
}
|
|
})
|
|
};
|
|
|
|
return delegate;
|
|
})();
|
|
|
|
/* ------------------------------ some ------------------------------ */
|
|
|
|
var some;
|
|
|
|
_.some = (function ()
|
|
{
|
|
// TODO
|
|
|
|
some = function (obj, predicate, ctx)
|
|
{
|
|
predicate = safeCb(predicate, ctx);
|
|
|
|
var _keys = !isArrLike(obj) && keys(obj),
|
|
len = (_keys || obj).length;
|
|
|
|
for (var i = 0; i < len; i++)
|
|
{
|
|
var key = _keys ? _keys[i] : i;
|
|
if (predicate(obj[key], key, obj)) return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
return some;
|
|
})();
|
|
|
|
/* ------------------------------ Select ------------------------------ */
|
|
|
|
var Select;
|
|
|
|
_.Select = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* class
|
|
* Select: jQuery like dom manipulator.
|
|
*/
|
|
|
|
function mergeArr(first, second)
|
|
{
|
|
var len = second.length,
|
|
i = first.length;
|
|
|
|
for (var j = 0; j < len; j++) first[i++] = second[j];
|
|
|
|
first.length = i;
|
|
|
|
return first;
|
|
}
|
|
|
|
Select = Class({
|
|
className: 'Select',
|
|
initialize: function (selector)
|
|
{
|
|
this.length = 0;
|
|
|
|
if (!selector) return this;
|
|
|
|
if (isStr(selector)) return rootSelect.find(selector);
|
|
|
|
if (selector.nodeType)
|
|
{
|
|
this[0] = selector;
|
|
this.length = 1;
|
|
}
|
|
},
|
|
find: function (selector)
|
|
{
|
|
var ret = new Select;
|
|
|
|
this.each(function ()
|
|
{
|
|
mergeArr(ret, this.querySelectorAll(selector));
|
|
});
|
|
|
|
return ret;
|
|
},
|
|
each: function (fn)
|
|
{
|
|
each(this, function (element, idx)
|
|
{
|
|
fn.call(element, idx, element);
|
|
});
|
|
|
|
return this;
|
|
}
|
|
});
|
|
|
|
var rootSelect = new Select(document);
|
|
|
|
return Select;
|
|
})();
|
|
|
|
/* ------------------------------ $safeNodes ------------------------------ */
|
|
|
|
var $safeNodes;
|
|
|
|
_.$safeNodes = (function ()
|
|
{
|
|
|
|
$safeNodes = function (nodes)
|
|
{
|
|
if (isStr(nodes)) return new Select(nodes);
|
|
|
|
return toArr(nodes);
|
|
};
|
|
|
|
return $safeNodes;
|
|
})();
|
|
|
|
/* ------------------------------ $attr ------------------------------ */
|
|
|
|
var $attr;
|
|
|
|
_.$attr = (function ()
|
|
{
|
|
|
|
$attr = function (nodes, name, val)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
var isGetter = isUndef(val) && isStr(name);
|
|
if (isGetter) return getAttr(nodes[0], name);
|
|
|
|
var attrs = name;
|
|
if (!isObj(attrs))
|
|
{
|
|
attrs = {};
|
|
attrs[name] = val;
|
|
}
|
|
|
|
setAttr(nodes, attrs);
|
|
};
|
|
|
|
$attr.remove = function (nodes, names)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
names = toArr(names);
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
each(names, function (name)
|
|
{
|
|
node.removeAttribute(name);
|
|
});
|
|
});
|
|
};
|
|
|
|
function getAttr(node, name)
|
|
{
|
|
return node.getAttribute(name);
|
|
}
|
|
|
|
function setAttr(nodes, attrs)
|
|
{
|
|
each(nodes, function (node)
|
|
{
|
|
each(attrs, function (val, name)
|
|
{
|
|
node.setAttribute(name, val);
|
|
});
|
|
})
|
|
}
|
|
|
|
return $attr;
|
|
})();
|
|
|
|
/* ------------------------------ $data ------------------------------ */
|
|
|
|
var $data;
|
|
|
|
_.$data = (function ()
|
|
{
|
|
|
|
$data = function (nodes, name, val)
|
|
{
|
|
var dataName = name;
|
|
|
|
if (isStr(name)) dataName = 'data-' + name;
|
|
if (isObj(name))
|
|
{
|
|
dataName = {};
|
|
each(name, function (val, key)
|
|
{
|
|
dataName['data-' + key] = val;
|
|
});
|
|
}
|
|
|
|
return $attr(nodes, dataName, val);
|
|
};
|
|
|
|
return $data;
|
|
})();
|
|
|
|
/* ------------------------------ $class ------------------------------ */
|
|
|
|
var $class;
|
|
|
|
_.$class = (function ()
|
|
{
|
|
|
|
$class = {
|
|
add: function (nodes, name)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
var names = toArr(name);
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
var classList = [];
|
|
|
|
each(names, function (name)
|
|
{
|
|
if (!$class.has(node, name)) classList.push(name);
|
|
});
|
|
|
|
if (classList.length !== 0) node.className += ' ' + classList.join(' ');
|
|
});
|
|
},
|
|
has: function (nodes, name)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
var regName = new RegExp('(^|\\s)' + name + '(\\s|$)');
|
|
|
|
return some(nodes, function (node)
|
|
{
|
|
return regName.test(node.className);
|
|
});
|
|
},
|
|
toggle: function (nodes, name)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
if (!$class.has(node, name)) return $class.add(node, name);
|
|
|
|
$class.remove(node, name);
|
|
});
|
|
},
|
|
remove: function (nodes, name)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
var names = toArr(name);
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
each(names, function (name)
|
|
{
|
|
node.classList.remove(name);
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
return $class;
|
|
})();
|
|
|
|
/* ------------------------------ $css ------------------------------ */
|
|
|
|
var $css;
|
|
|
|
_.$css = (function ()
|
|
{
|
|
|
|
$css = function (nodes, name, val)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
var isGetter = isUndef(val) && isStr(name);
|
|
if (isGetter) return getCss(nodes[0], name);
|
|
|
|
var css = name;
|
|
if (!isObj(css))
|
|
{
|
|
css = {};
|
|
css[name] = val;
|
|
}
|
|
|
|
setCss(nodes, css);
|
|
};
|
|
|
|
function getCss(node, name)
|
|
{
|
|
return node.style[camelize(name)];
|
|
}
|
|
|
|
function setCss(nodes, css)
|
|
{
|
|
each(nodes, function (node)
|
|
{
|
|
var cssText = ';';
|
|
each(css, function (val, key)
|
|
{
|
|
cssText += dasherize(key) + ':' + addPx(key, val) + ';';
|
|
});
|
|
node.style.cssText += cssText;
|
|
});
|
|
}
|
|
|
|
var cssNumProps = [
|
|
'column-count',
|
|
'columns',
|
|
'font-weight',
|
|
'line-weight',
|
|
'opacity',
|
|
'z-index',
|
|
'zoom'
|
|
];
|
|
|
|
function addPx(key, val)
|
|
{
|
|
var needPx = isNum(val) && !contain(cssNumProps, dasherize(key));
|
|
|
|
return needPx ? val + 'px' : val;
|
|
}
|
|
|
|
return $css;
|
|
})();
|
|
|
|
/* ------------------------------ $event ------------------------------ */
|
|
|
|
var $event;
|
|
|
|
_.$event = (function ()
|
|
{
|
|
|
|
$event = {
|
|
on: eventFactory('add'),
|
|
off: eventFactory('remove')
|
|
};
|
|
|
|
function eventFactory(type)
|
|
{
|
|
return function (nodes, event, selector, handler)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
if (isUndef(handler))
|
|
{
|
|
handler = selector;
|
|
selector = undefined;
|
|
}
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
delegate[type](node, event, selector, handler);
|
|
});
|
|
};
|
|
}
|
|
|
|
return $event;
|
|
})();
|
|
|
|
/* ------------------------------ $insert ------------------------------ */
|
|
|
|
var $insert;
|
|
|
|
_.$insert = (function ()
|
|
{
|
|
|
|
$insert = {
|
|
before: insertFactory('beforebegin'),
|
|
after: insertFactory('afterend'),
|
|
append: insertFactory('beforeend'),
|
|
prepend: insertFactory('afterbegin')
|
|
};
|
|
|
|
function insertFactory(type)
|
|
{
|
|
return function (nodes, val)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
node.insertAdjacentHTML(type, val);
|
|
});
|
|
};
|
|
}
|
|
|
|
return $insert;
|
|
})();
|
|
|
|
/* ------------------------------ $offset ------------------------------ */
|
|
|
|
var $offset;
|
|
|
|
_.$offset = (function ()
|
|
{
|
|
|
|
$offset = function (nodes)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
var node = nodes[0];
|
|
|
|
var clientRect = node.getBoundingClientRect();
|
|
|
|
return {
|
|
left: clientRect.left + window.pageXOffset,
|
|
top : clientRect.top + window.pageYOffset,
|
|
width : Math.round(clientRect.width),
|
|
height: Math.round(clientRect.height)
|
|
};
|
|
};
|
|
|
|
return $offset;
|
|
})();
|
|
|
|
/* ------------------------------ $property ------------------------------ */
|
|
|
|
var $property;
|
|
|
|
_.$property = (function ()
|
|
{
|
|
|
|
$property = {
|
|
html: propFactory('innerHTML'),
|
|
text: propFactory('textContent'),
|
|
val: propFactory('value')
|
|
};
|
|
|
|
function propFactory(name)
|
|
{
|
|
return function (nodes, val)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
if (isUndef(val)) return nodes[0][name];
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
node[name] = val;
|
|
});
|
|
};
|
|
}
|
|
|
|
return $property;
|
|
})();
|
|
|
|
/* ------------------------------ $remove ------------------------------ */
|
|
|
|
var $remove;
|
|
|
|
_.$remove = (function ()
|
|
{
|
|
|
|
$remove = function (nodes)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
var parent = node.parentNode;
|
|
|
|
if (parent) parent.removeChild(node);
|
|
});
|
|
};
|
|
|
|
return $remove;
|
|
})();
|
|
|
|
/* ------------------------------ $show ------------------------------ */
|
|
|
|
var $show;
|
|
|
|
_.$show = (function ()
|
|
{
|
|
|
|
$show = function (nodes)
|
|
{
|
|
nodes = $safeNodes(nodes);
|
|
|
|
each(nodes, function (node)
|
|
{
|
|
if (isHidden(node))
|
|
{
|
|
node.style.display = getDefDisplay(node.nodeName);
|
|
}
|
|
});
|
|
};
|
|
|
|
function isHidden(node)
|
|
{
|
|
return getComputedStyle(node, '').getPropertyValue('display') == 'none';
|
|
}
|
|
|
|
var elDisplay = {};
|
|
|
|
function getDefDisplay(nodeName)
|
|
{
|
|
var el, display;
|
|
|
|
if (!elDisplay[nodeName])
|
|
{
|
|
el = document.createElement(nodeName);
|
|
document.body.appendChild(el);
|
|
display = getComputedStyle(el, '').getPropertyValue("display");
|
|
el.parentNode.removeChild(el);
|
|
display == "none" && (display = "block");
|
|
elDisplay[nodeName] = display;
|
|
}
|
|
|
|
return elDisplay[nodeName];
|
|
}
|
|
|
|
return $show;
|
|
})();
|
|
|
|
/* ------------------------------ $ ------------------------------ */
|
|
|
|
var $;
|
|
|
|
_.$ = (function ()
|
|
{
|
|
|
|
$ = function (selector)
|
|
{
|
|
return new Select(selector);
|
|
};
|
|
|
|
Select.methods({
|
|
offset: function ()
|
|
{
|
|
return $offset(this);
|
|
},
|
|
hide: function ()
|
|
{
|
|
return this.css('display', 'none');
|
|
},
|
|
show: function ()
|
|
{
|
|
$show(this);
|
|
|
|
return this;
|
|
},
|
|
first: function ()
|
|
{
|
|
return $(this[0]);
|
|
},
|
|
last: function () {
|
|
return $(last(this));
|
|
},
|
|
get: function (idx)
|
|
{
|
|
return this[idx];
|
|
},
|
|
eq: function (idx)
|
|
{
|
|
return $(idx);
|
|
},
|
|
on: function (event, selector, handler)
|
|
{
|
|
$event.on(this, event, selector, handler);
|
|
|
|
return this;
|
|
},
|
|
off: function (event, selector, handler)
|
|
{
|
|
$event.off(this, event, selector, handler);
|
|
|
|
return this;
|
|
},
|
|
html: function (val)
|
|
{
|
|
var result = $property.html(this, val);
|
|
|
|
if (isUndef(val)) return result;
|
|
|
|
return this;
|
|
},
|
|
text: function (val)
|
|
{
|
|
var result = $property.text(this, val);
|
|
|
|
if (isUndef(val)) return result;
|
|
|
|
return this;
|
|
},
|
|
val: function (val)
|
|
{
|
|
var result = $property.val(this, val);
|
|
|
|
if (isUndef(val)) return result;
|
|
|
|
return this;
|
|
},
|
|
css: function (name, val)
|
|
{
|
|
var result = $css(this, name, val);
|
|
|
|
if (isGetter(name, val)) return result;
|
|
|
|
return this;
|
|
},
|
|
attr: function (name, val)
|
|
{
|
|
var result = $attr(this, name, val);
|
|
|
|
if (isGetter(name, val)) return result;
|
|
|
|
return this;
|
|
},
|
|
data: function (name, val)
|
|
{
|
|
var result = $data(this, name, val);
|
|
|
|
if (isGetter(name, val)) return result;
|
|
|
|
return this;
|
|
},
|
|
rmAttr: function (name)
|
|
{
|
|
$attr.remove(this, name);
|
|
|
|
return this;
|
|
},
|
|
remove: function ()
|
|
{
|
|
$remove(this);
|
|
|
|
return this;
|
|
},
|
|
addClass: function (name)
|
|
{
|
|
$class.add(this, name);
|
|
|
|
return this;
|
|
},
|
|
rmClass: function (name)
|
|
{
|
|
$class.remove(this, name);
|
|
|
|
return this;
|
|
},
|
|
toggleClass: function (name)
|
|
{
|
|
$class.toggle(this, name);
|
|
|
|
return this;
|
|
},
|
|
hasClass: function (name)
|
|
{
|
|
return $class.has(this, name);
|
|
},
|
|
append: function (val)
|
|
{
|
|
$insert.append(this, val);
|
|
|
|
return this;
|
|
},
|
|
prepend: function (val)
|
|
{
|
|
$insert.prepend(this, val);
|
|
|
|
return this;
|
|
},
|
|
before: function (val)
|
|
{
|
|
$insert.before(this, val);
|
|
|
|
return this;
|
|
},
|
|
after: function (val)
|
|
{
|
|
$insert.after(this, val);
|
|
|
|
return this;
|
|
}
|
|
});
|
|
|
|
function isGetter(name, val)
|
|
{
|
|
return isUndef(val) && isStr(name);
|
|
}
|
|
|
|
return $;
|
|
})();
|
|
|
|
/* ------------------------------ orientation ------------------------------ */
|
|
|
|
var orientation;
|
|
|
|
_.orientation = (function ()
|
|
{
|
|
|
|
orientation = {};
|
|
|
|
Emitter.mixin(orientation);
|
|
|
|
window.addEventListener('orientationchange', function ()
|
|
{
|
|
setTimeout(function ()
|
|
{
|
|
orientation.emit('change');
|
|
}, 150);
|
|
}, false);
|
|
|
|
return orientation;
|
|
})();
|
|
|
|
/* ------------------------------ rtrim ------------------------------ */
|
|
|
|
var rtrim;
|
|
|
|
_.rtrim = (function ()
|
|
{
|
|
// TODO
|
|
|
|
var regSpace = /\s+$/;
|
|
|
|
rtrim = function (str, chars)
|
|
{
|
|
if (chars == null) return str.replace(regSpace, '');
|
|
|
|
var end = str.length - 1,
|
|
charLen = chars.length,
|
|
found = true,
|
|
i, c;
|
|
|
|
while (found && end >= 0)
|
|
{
|
|
found = false;
|
|
i = -1;
|
|
c = str.charAt(end);
|
|
|
|
while (++i < charLen)
|
|
{
|
|
if (c === chars[i])
|
|
{
|
|
found = true;
|
|
end--;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return (end >= 0) ? str.substring(0, end + 1) : '';
|
|
};
|
|
|
|
return rtrim;
|
|
})();
|
|
|
|
/* ------------------------------ startWith ------------------------------ */
|
|
|
|
var startWith;
|
|
|
|
_.startWith = (function ()
|
|
{
|
|
// TODO
|
|
|
|
/* function
|
|
* startWith: Checks if string starts with the given target string.
|
|
* string(string): The string to search.
|
|
* prefix(string): String prefix.
|
|
* return(boolean): Returns true if string starts with prefix, else false.
|
|
*/
|
|
|
|
startWith = function (str, prefix) { return str.indexOf(prefix) === 0 };
|
|
|
|
return startWith;
|
|
})();
|
|
|
|
/* ------------------------------ trim ------------------------------ */
|
|
|
|
var trim;
|
|
|
|
_.trim = (function ()
|
|
{
|
|
// TODO
|
|
|
|
var regSpace = /^\s+|\s+$/g;
|
|
|
|
trim = function (str, chars)
|
|
{
|
|
if (chars == null) return str.replace(regSpace, '');
|
|
|
|
return ltrim(rtrim(str, chars), chars);
|
|
};
|
|
|
|
return trim;
|
|
})();
|
|
|
|
/* ------------------------------ unique ------------------------------ */
|
|
|
|
var unique;
|
|
|
|
_.unique = (function ()
|
|
{
|
|
|
|
function isEqual(a, b) { return a === b }
|
|
|
|
unique = function (arr, compare)
|
|
{
|
|
compare = compare || isEqual;
|
|
|
|
return filter(arr, function (item, idx, arr)
|
|
{
|
|
var len = arr.length;
|
|
|
|
while (++idx < len)
|
|
{
|
|
if (compare(item, arr[idx])) return false;
|
|
}
|
|
|
|
return true;
|
|
});
|
|
};
|
|
|
|
return unique;
|
|
})();
|
|
|
|
return _;
|
|
})(); |