1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/mochitest/MochiKit/Base.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1401 @@ 1.4 +/*** 1.5 + 1.6 +MochiKit.Base 1.4 1.7 + 1.8 +See <http://mochikit.com/> for documentation, downloads, license, etc. 1.9 + 1.10 +(c) 2005 Bob Ippolito. All rights Reserved. 1.11 + 1.12 +***/ 1.13 + 1.14 +if (typeof(dojo) != 'undefined') { 1.15 + dojo.provide("MochiKit.Base"); 1.16 +} 1.17 +if (typeof(MochiKit) == 'undefined') { 1.18 + MochiKit = {}; 1.19 +} 1.20 +if (typeof(MochiKit.Base) == 'undefined') { 1.21 + MochiKit.Base = {}; 1.22 +} 1.23 +if (typeof(MochiKit.__export__) == "undefined") { 1.24 + MochiKit.__export__ = (MochiKit.__compat__ || 1.25 + (typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') 1.26 + ); 1.27 +} 1.28 + 1.29 +MochiKit.Base.VERSION = "1.4"; 1.30 +MochiKit.Base.NAME = "MochiKit.Base"; 1.31 +/** @id MochiKit.Base.update */ 1.32 +MochiKit.Base.update = function (self, obj/*, ... */) { 1.33 + if (self === null) { 1.34 + self = {}; 1.35 + } 1.36 + for (var i = 1; i < arguments.length; i++) { 1.37 + var o = arguments[i]; 1.38 + if (typeof(o) != 'undefined' && o !== null) { 1.39 + for (var k in o) { 1.40 + self[k] = o[k]; 1.41 + } 1.42 + } 1.43 + } 1.44 + return self; 1.45 +}; 1.46 + 1.47 +MochiKit.Base.update(MochiKit.Base, { 1.48 + __repr__: function () { 1.49 + return "[" + this.NAME + " " + this.VERSION + "]"; 1.50 + }, 1.51 + 1.52 + toString: function () { 1.53 + return this.__repr__(); 1.54 + }, 1.55 + 1.56 + /** @id MochiKit.Base.camelize */ 1.57 + camelize: function (selector) { 1.58 + /* from dojo.style.toCamelCase */ 1.59 + var arr = selector.split('-'); 1.60 + var cc = arr[0]; 1.61 + for (var i = 1; i < arr.length; i++) { 1.62 + cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1); 1.63 + } 1.64 + return cc; 1.65 + }, 1.66 + 1.67 + /** @id MochiKit.Base.counter */ 1.68 + counter: function (n/* = 1 */) { 1.69 + if (arguments.length === 0) { 1.70 + n = 1; 1.71 + } 1.72 + return function () { 1.73 + return n++; 1.74 + }; 1.75 + }, 1.76 + 1.77 + /** @id MochiKit.Base.clone */ 1.78 + clone: function (obj) { 1.79 + var me = arguments.callee; 1.80 + if (arguments.length == 1) { 1.81 + me.prototype = obj; 1.82 + return new me(); 1.83 + } 1.84 + }, 1.85 + 1.86 + _flattenArray: function (res, lst) { 1.87 + for (var i = 0; i < lst.length; i++) { 1.88 + var o = lst[i]; 1.89 + if (o instanceof Array) { 1.90 + arguments.callee(res, o); 1.91 + } else { 1.92 + res.push(o); 1.93 + } 1.94 + } 1.95 + return res; 1.96 + }, 1.97 + 1.98 + /** @id MochiKit.Base.flattenArray */ 1.99 + flattenArray: function (lst) { 1.100 + return MochiKit.Base._flattenArray([], lst); 1.101 + }, 1.102 + 1.103 + /** @id MochiKit.Base.flattenArguments */ 1.104 + flattenArguments: function (lst/* ...*/) { 1.105 + var res = []; 1.106 + var m = MochiKit.Base; 1.107 + var args = m.extend(null, arguments); 1.108 + while (args.length) { 1.109 + var o = args.shift(); 1.110 + if (o && typeof(o) == "object" && typeof(o.length) == "number") { 1.111 + for (var i = o.length - 1; i >= 0; i--) { 1.112 + args.unshift(o[i]); 1.113 + } 1.114 + } else { 1.115 + res.push(o); 1.116 + } 1.117 + } 1.118 + return res; 1.119 + }, 1.120 + 1.121 + /** @id MochiKit.Base.extend */ 1.122 + extend: function (self, obj, /* optional */skip) { 1.123 + // Extend an array with an array-like object starting 1.124 + // from the skip index 1.125 + if (!skip) { 1.126 + skip = 0; 1.127 + } 1.128 + if (obj) { 1.129 + // allow iterable fall-through, but skip the full isArrayLike 1.130 + // check for speed, this is called often. 1.131 + var l = obj.length; 1.132 + if (typeof(l) != 'number' /* !isArrayLike(obj) */) { 1.133 + if (typeof(MochiKit.Iter) != "undefined") { 1.134 + obj = MochiKit.Iter.list(obj); 1.135 + l = obj.length; 1.136 + } else { 1.137 + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); 1.138 + } 1.139 + } 1.140 + if (!self) { 1.141 + self = []; 1.142 + } 1.143 + for (var i = skip; i < l; i++) { 1.144 + self.push(obj[i]); 1.145 + } 1.146 + } 1.147 + // This mutates, but it's convenient to return because 1.148 + // it's often used like a constructor when turning some 1.149 + // ghetto array-like to a real array 1.150 + return self; 1.151 + }, 1.152 + 1.153 + 1.154 + /** @id MochiKit.Base.updatetree */ 1.155 + updatetree: function (self, obj/*, ...*/) { 1.156 + if (self === null) { 1.157 + self = {}; 1.158 + } 1.159 + for (var i = 1; i < arguments.length; i++) { 1.160 + var o = arguments[i]; 1.161 + if (typeof(o) != 'undefined' && o !== null) { 1.162 + for (var k in o) { 1.163 + var v = o[k]; 1.164 + if (typeof(self[k]) == 'object' && typeof(v) == 'object') { 1.165 + arguments.callee(self[k], v); 1.166 + } else { 1.167 + self[k] = v; 1.168 + } 1.169 + } 1.170 + } 1.171 + } 1.172 + return self; 1.173 + }, 1.174 + 1.175 + /** @id MochiKit.Base.setdefault */ 1.176 + setdefault: function (self, obj/*, ...*/) { 1.177 + if (self === null) { 1.178 + self = {}; 1.179 + } 1.180 + for (var i = 1; i < arguments.length; i++) { 1.181 + var o = arguments[i]; 1.182 + for (var k in o) { 1.183 + if (!(k in self)) { 1.184 + self[k] = o[k]; 1.185 + } 1.186 + } 1.187 + } 1.188 + return self; 1.189 + }, 1.190 + 1.191 + /** @id MochiKit.Base.keys */ 1.192 + keys: function (obj) { 1.193 + var rval = []; 1.194 + for (var prop in obj) { 1.195 + rval.push(prop); 1.196 + } 1.197 + return rval; 1.198 + }, 1.199 + 1.200 + /** @id MochiKit.Base.values */ 1.201 + values: function (obj) { 1.202 + var rval = []; 1.203 + for (var prop in obj) { 1.204 + rval.push(obj[prop]); 1.205 + } 1.206 + return rval; 1.207 + }, 1.208 + 1.209 + /** @id MochiKit.Base.items */ 1.210 + items: function (obj) { 1.211 + var rval = []; 1.212 + var e; 1.213 + for (var prop in obj) { 1.214 + var v; 1.215 + try { 1.216 + v = obj[prop]; 1.217 + } catch (e) { 1.218 + continue; 1.219 + } 1.220 + rval.push([prop, v]); 1.221 + } 1.222 + return rval; 1.223 + }, 1.224 + 1.225 + 1.226 + _newNamedError: function (module, name, func) { 1.227 + func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name); 1.228 + module[name] = func; 1.229 + }, 1.230 + 1.231 + 1.232 + /** @id MochiKit.Base.operator */ 1.233 + operator: { 1.234 + // unary logic operators 1.235 + /** @id MochiKit.Base.truth */ 1.236 + truth: function (a) { return !!a; }, 1.237 + /** @id MochiKit.Base.lognot */ 1.238 + lognot: function (a) { return !a; }, 1.239 + /** @id MochiKit.Base.identity */ 1.240 + identity: function (a) { return a; }, 1.241 + 1.242 + // bitwise unary operators 1.243 + /** @id MochiKit.Base.not */ 1.244 + not: function (a) { return ~a; }, 1.245 + /** @id MochiKit.Base.neg */ 1.246 + neg: function (a) { return -a; }, 1.247 + 1.248 + // binary operators 1.249 + /** @id MochiKit.Base.add */ 1.250 + add: function (a, b) { return a + b; }, 1.251 + /** @id MochiKit.Base.sub */ 1.252 + sub: function (a, b) { return a - b; }, 1.253 + /** @id MochiKit.Base.div */ 1.254 + div: function (a, b) { return a / b; }, 1.255 + /** @id MochiKit.Base.mod */ 1.256 + mod: function (a, b) { return a % b; }, 1.257 + /** @id MochiKit.Base.mul */ 1.258 + mul: function (a, b) { return a * b; }, 1.259 + 1.260 + // bitwise binary operators 1.261 + /** @id MochiKit.Base.and */ 1.262 + and: function (a, b) { return a & b; }, 1.263 + /** @id MochiKit.Base.or */ 1.264 + or: function (a, b) { return a | b; }, 1.265 + /** @id MochiKit.Base.xor */ 1.266 + xor: function (a, b) { return a ^ b; }, 1.267 + /** @id MochiKit.Base.lshift */ 1.268 + lshift: function (a, b) { return a << b; }, 1.269 + /** @id MochiKit.Base.rshift */ 1.270 + rshift: function (a, b) { return a >> b; }, 1.271 + /** @id MochiKit.Base.zrshift */ 1.272 + zrshift: function (a, b) { return a >>> b; }, 1.273 + 1.274 + // near-worthless built-in comparators 1.275 + /** @id MochiKit.Base.eq */ 1.276 + eq: function (a, b) { return a == b; }, 1.277 + /** @id MochiKit.Base.ne */ 1.278 + ne: function (a, b) { return a != b; }, 1.279 + /** @id MochiKit.Base.gt */ 1.280 + gt: function (a, b) { return a > b; }, 1.281 + /** @id MochiKit.Base.ge */ 1.282 + ge: function (a, b) { return a >= b; }, 1.283 + /** @id MochiKit.Base.lt */ 1.284 + lt: function (a, b) { return a < b; }, 1.285 + /** @id MochiKit.Base.le */ 1.286 + le: function (a, b) { return a <= b; }, 1.287 + 1.288 + // strict built-in comparators 1.289 + seq: function (a, b) { return a === b; }, 1.290 + sne: function (a, b) { return a !== b; }, 1.291 + 1.292 + // compare comparators 1.293 + /** @id MochiKit.Base.ceq */ 1.294 + ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; }, 1.295 + /** @id MochiKit.Base.cne */ 1.296 + cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; }, 1.297 + /** @id MochiKit.Base.cgt */ 1.298 + cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; }, 1.299 + /** @id MochiKit.Base.cge */ 1.300 + cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; }, 1.301 + /** @id MochiKit.Base.clt */ 1.302 + clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; }, 1.303 + /** @id MochiKit.Base.cle */ 1.304 + cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; }, 1.305 + 1.306 + // binary logical operators 1.307 + /** @id MochiKit.Base.logand */ 1.308 + logand: function (a, b) { return a && b; }, 1.309 + /** @id MochiKit.Base.logor */ 1.310 + logor: function (a, b) { return a || b; }, 1.311 + /** @id MochiKit.Base.contains */ 1.312 + contains: function (a, b) { return b in a; } 1.313 + }, 1.314 + 1.315 + /** @id MochiKit.Base.forwardCall */ 1.316 + forwardCall: function (func) { 1.317 + return function () { 1.318 + return this[func].apply(this, arguments); 1.319 + }; 1.320 + }, 1.321 + 1.322 + /** @id MochiKit.Base.itemgetter */ 1.323 + itemgetter: function (func) { 1.324 + return function (arg) { 1.325 + return arg[func]; 1.326 + }; 1.327 + }, 1.328 + 1.329 + /** @id MochiKit.Base.typeMatcher */ 1.330 + typeMatcher: function (/* typ */) { 1.331 + var types = {}; 1.332 + for (var i = 0; i < arguments.length; i++) { 1.333 + var typ = arguments[i]; 1.334 + types[typ] = typ; 1.335 + } 1.336 + return function () { 1.337 + for (var i = 0; i < arguments.length; i++) { 1.338 + if (!(typeof(arguments[i]) in types)) { 1.339 + return false; 1.340 + } 1.341 + } 1.342 + return true; 1.343 + }; 1.344 + }, 1.345 + 1.346 + /** @id MochiKit.Base.isNull */ 1.347 + isNull: function (/* ... */) { 1.348 + for (var i = 0; i < arguments.length; i++) { 1.349 + if (arguments[i] !== null) { 1.350 + return false; 1.351 + } 1.352 + } 1.353 + return true; 1.354 + }, 1.355 + 1.356 + /** @id MochiKit.Base.isUndefinedOrNull */ 1.357 + isUndefinedOrNull: function (/* ... */) { 1.358 + for (var i = 0; i < arguments.length; i++) { 1.359 + var o = arguments[i]; 1.360 + if (!(typeof(o) == 'undefined' || o === null)) { 1.361 + return false; 1.362 + } 1.363 + } 1.364 + return true; 1.365 + }, 1.366 + 1.367 + /** @id MochiKit.Base.isEmpty */ 1.368 + isEmpty: function (obj) { 1.369 + return !MochiKit.Base.isNotEmpty.apply(this, arguments); 1.370 + }, 1.371 + 1.372 + /** @id MochiKit.Base.isNotEmpty */ 1.373 + isNotEmpty: function (obj) { 1.374 + for (var i = 0; i < arguments.length; i++) { 1.375 + var o = arguments[i]; 1.376 + if (!(o && o.length)) { 1.377 + return false; 1.378 + } 1.379 + } 1.380 + return true; 1.381 + }, 1.382 + 1.383 + /** @id MochiKit.Base.isArrayLike */ 1.384 + isArrayLike: function () { 1.385 + for (var i = 0; i < arguments.length; i++) { 1.386 + var o = arguments[i]; 1.387 + var typ = typeof(o); 1.388 + if ( 1.389 + (typ != 'object' && !(typ == 'function' && typeof(o.item) == 'function')) || 1.390 + o === null || 1.391 + typeof(o.length) != 'number' || 1.392 + o.nodeType === 3 1.393 + ) { 1.394 + return false; 1.395 + } 1.396 + } 1.397 + return true; 1.398 + }, 1.399 + 1.400 + /** @id MochiKit.Base.isDateLike */ 1.401 + isDateLike: function () { 1.402 + for (var i = 0; i < arguments.length; i++) { 1.403 + var o = arguments[i]; 1.404 + if (typeof(o) != "object" || o === null 1.405 + || typeof(o.getTime) != 'function') { 1.406 + return false; 1.407 + } 1.408 + } 1.409 + return true; 1.410 + }, 1.411 + 1.412 + 1.413 + /** @id MochiKit.Base.xmap */ 1.414 + xmap: function (fn/*, obj... */) { 1.415 + if (fn === null) { 1.416 + return MochiKit.Base.extend(null, arguments, 1); 1.417 + } 1.418 + var rval = []; 1.419 + for (var i = 1; i < arguments.length; i++) { 1.420 + rval.push(fn(arguments[i])); 1.421 + } 1.422 + return rval; 1.423 + }, 1.424 + 1.425 + /** @id MochiKit.Base.map */ 1.426 + map: function (fn, lst/*, lst... */) { 1.427 + var m = MochiKit.Base; 1.428 + var itr = MochiKit.Iter; 1.429 + var isArrayLike = m.isArrayLike; 1.430 + if (arguments.length <= 2) { 1.431 + // allow an iterable to be passed 1.432 + if (!isArrayLike(lst)) { 1.433 + if (itr) { 1.434 + // fast path for map(null, iterable) 1.435 + lst = itr.list(lst); 1.436 + if (fn === null) { 1.437 + return lst; 1.438 + } 1.439 + } else { 1.440 + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); 1.441 + } 1.442 + } 1.443 + // fast path for map(null, lst) 1.444 + if (fn === null) { 1.445 + return m.extend(null, lst); 1.446 + } 1.447 + // disabled fast path for map(fn, lst) 1.448 + /* 1.449 + if (false && typeof(Array.prototype.map) == 'function') { 1.450 + // Mozilla fast-path 1.451 + return Array.prototype.map.call(lst, fn); 1.452 + } 1.453 + */ 1.454 + var rval = []; 1.455 + for (var i = 0; i < lst.length; i++) { 1.456 + rval.push(fn(lst[i])); 1.457 + } 1.458 + return rval; 1.459 + } else { 1.460 + // default for map(null, ...) is zip(...) 1.461 + if (fn === null) { 1.462 + fn = Array; 1.463 + } 1.464 + var length = null; 1.465 + for (i = 1; i < arguments.length; i++) { 1.466 + // allow iterables to be passed 1.467 + if (!isArrayLike(arguments[i])) { 1.468 + if (itr) { 1.469 + return itr.list(itr.imap.apply(null, arguments)); 1.470 + } else { 1.471 + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); 1.472 + } 1.473 + } 1.474 + // find the minimum length 1.475 + var l = arguments[i].length; 1.476 + if (length === null || length > l) { 1.477 + length = l; 1.478 + } 1.479 + } 1.480 + rval = []; 1.481 + for (i = 0; i < length; i++) { 1.482 + var args = []; 1.483 + for (var j = 1; j < arguments.length; j++) { 1.484 + args.push(arguments[j][i]); 1.485 + } 1.486 + rval.push(fn.apply(this, args)); 1.487 + } 1.488 + return rval; 1.489 + } 1.490 + }, 1.491 + 1.492 + /** @id MochiKit.Base.xfilter */ 1.493 + xfilter: function (fn/*, obj... */) { 1.494 + var rval = []; 1.495 + if (fn === null) { 1.496 + fn = MochiKit.Base.operator.truth; 1.497 + } 1.498 + for (var i = 1; i < arguments.length; i++) { 1.499 + var o = arguments[i]; 1.500 + if (fn(o)) { 1.501 + rval.push(o); 1.502 + } 1.503 + } 1.504 + return rval; 1.505 + }, 1.506 + 1.507 + /** @id MochiKit.Base.filter */ 1.508 + filter: function (fn, lst, self) { 1.509 + var rval = []; 1.510 + // allow an iterable to be passed 1.511 + var m = MochiKit.Base; 1.512 + if (!m.isArrayLike(lst)) { 1.513 + if (MochiKit.Iter) { 1.514 + lst = MochiKit.Iter.list(lst); 1.515 + } else { 1.516 + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); 1.517 + } 1.518 + } 1.519 + if (fn === null) { 1.520 + fn = m.operator.truth; 1.521 + } 1.522 + if (typeof(Array.prototype.filter) == 'function') { 1.523 + // Mozilla fast-path 1.524 + return Array.prototype.filter.call(lst, fn, self); 1.525 + } else if (typeof(self) == 'undefined' || self === null) { 1.526 + for (var i = 0; i < lst.length; i++) { 1.527 + var o = lst[i]; 1.528 + if (fn(o)) { 1.529 + rval.push(o); 1.530 + } 1.531 + } 1.532 + } else { 1.533 + for (i = 0; i < lst.length; i++) { 1.534 + o = lst[i]; 1.535 + if (fn.call(self, o)) { 1.536 + rval.push(o); 1.537 + } 1.538 + } 1.539 + } 1.540 + return rval; 1.541 + }, 1.542 + 1.543 + 1.544 + _wrapDumbFunction: function (func) { 1.545 + return function () { 1.546 + // fast path! 1.547 + switch (arguments.length) { 1.548 + case 0: return func(); 1.549 + case 1: return func(arguments[0]); 1.550 + case 2: return func(arguments[0], arguments[1]); 1.551 + case 3: return func(arguments[0], arguments[1], arguments[2]); 1.552 + } 1.553 + var args = []; 1.554 + for (var i = 0; i < arguments.length; i++) { 1.555 + args.push("arguments[" + i + "]"); 1.556 + } 1.557 + return eval("(func(" + args.join(",") + "))"); 1.558 + }; 1.559 + }, 1.560 + 1.561 + /** @id MochiKit.Base.methodcaller */ 1.562 + methodcaller: function (func/*, args... */) { 1.563 + var args = MochiKit.Base.extend(null, arguments, 1); 1.564 + if (typeof(func) == "function") { 1.565 + return function (obj) { 1.566 + return func.apply(obj, args); 1.567 + }; 1.568 + } else { 1.569 + return function (obj) { 1.570 + return obj[func].apply(obj, args); 1.571 + }; 1.572 + } 1.573 + }, 1.574 + 1.575 + /** @id MochiKit.Base.method */ 1.576 + method: function (self, func) { 1.577 + var m = MochiKit.Base; 1.578 + return m.bind.apply(this, m.extend([func, self], arguments, 2)); 1.579 + }, 1.580 + 1.581 + /** @id MochiKit.Base.compose */ 1.582 + compose: function (f1, f2/*, f3, ... fN */) { 1.583 + var fnlist = []; 1.584 + var m = MochiKit.Base; 1.585 + if (arguments.length === 0) { 1.586 + throw new TypeError("compose() requires at least one argument"); 1.587 + } 1.588 + for (var i = 0; i < arguments.length; i++) { 1.589 + var fn = arguments[i]; 1.590 + if (typeof(fn) != "function") { 1.591 + throw new TypeError(m.repr(fn) + " is not a function"); 1.592 + } 1.593 + fnlist.push(fn); 1.594 + } 1.595 + return function () { 1.596 + var args = arguments; 1.597 + for (var i = fnlist.length - 1; i >= 0; i--) { 1.598 + args = [fnlist[i].apply(this, args)]; 1.599 + } 1.600 + return args[0]; 1.601 + }; 1.602 + }, 1.603 + 1.604 + /** @id MochiKit.Base.bind */ 1.605 + bind: function (func, self/* args... */) { 1.606 + if (typeof(func) == "string") { 1.607 + func = self[func]; 1.608 + } 1.609 + var im_func = func.im_func; 1.610 + var im_preargs = func.im_preargs; 1.611 + var im_self = func.im_self; 1.612 + var m = MochiKit.Base; 1.613 + if (typeof(func) == "function" && typeof(func.apply) == "undefined") { 1.614 + // this is for cases where JavaScript sucks ass and gives you a 1.615 + // really dumb built-in function like alert() that doesn't have 1.616 + // an apply 1.617 + func = m._wrapDumbFunction(func); 1.618 + } 1.619 + if (typeof(im_func) != 'function') { 1.620 + im_func = func; 1.621 + } 1.622 + if (typeof(self) != 'undefined') { 1.623 + im_self = self; 1.624 + } 1.625 + if (typeof(im_preargs) == 'undefined') { 1.626 + im_preargs = []; 1.627 + } else { 1.628 + im_preargs = im_preargs.slice(); 1.629 + } 1.630 + m.extend(im_preargs, arguments, 2); 1.631 + var newfunc = function () { 1.632 + var args = arguments; 1.633 + var me = arguments.callee; 1.634 + if (me.im_preargs.length > 0) { 1.635 + args = m.concat(me.im_preargs, args); 1.636 + } 1.637 + var self = me.im_self; 1.638 + if (!self) { 1.639 + self = this; 1.640 + } 1.641 + return me.im_func.apply(self, args); 1.642 + }; 1.643 + newfunc.im_self = im_self; 1.644 + newfunc.im_func = im_func; 1.645 + newfunc.im_preargs = im_preargs; 1.646 + return newfunc; 1.647 + }, 1.648 + 1.649 + /** @id MochiKit.Base.bindMethods */ 1.650 + bindMethods: function (self) { 1.651 + var bind = MochiKit.Base.bind; 1.652 + for (var k in self) { 1.653 + var func = self[k]; 1.654 + if (typeof(func) == 'function') { 1.655 + self[k] = bind(func, self); 1.656 + } 1.657 + } 1.658 + }, 1.659 + 1.660 + /** @id MochiKit.Base.registerComparator */ 1.661 + registerComparator: function (name, check, comparator, /* optional */ override) { 1.662 + MochiKit.Base.comparatorRegistry.register(name, check, comparator, override); 1.663 + }, 1.664 + 1.665 + _primitives: {'boolean': true, 'string': true, 'number': true}, 1.666 + 1.667 + /** @id MochiKit.Base.compare */ 1.668 + compare: function (a, b) { 1.669 + if (a == b) { 1.670 + return 0; 1.671 + } 1.672 + var aIsNull = (typeof(a) == 'undefined' || a === null); 1.673 + var bIsNull = (typeof(b) == 'undefined' || b === null); 1.674 + if (aIsNull && bIsNull) { 1.675 + return 0; 1.676 + } else if (aIsNull) { 1.677 + return -1; 1.678 + } else if (bIsNull) { 1.679 + return 1; 1.680 + } 1.681 + var m = MochiKit.Base; 1.682 + // bool, number, string have meaningful comparisons 1.683 + var prim = m._primitives; 1.684 + if (!(typeof(a) in prim && typeof(b) in prim)) { 1.685 + try { 1.686 + return m.comparatorRegistry.match(a, b); 1.687 + } catch (e) { 1.688 + if (e != m.NotFound) { 1.689 + throw e; 1.690 + } 1.691 + } 1.692 + } 1.693 + if (a < b) { 1.694 + return -1; 1.695 + } else if (a > b) { 1.696 + return 1; 1.697 + } 1.698 + // These types can't be compared 1.699 + var repr = m.repr; 1.700 + throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared"); 1.701 + }, 1.702 + 1.703 + /** @id MochiKit.Base.compareDateLike */ 1.704 + compareDateLike: function (a, b) { 1.705 + return MochiKit.Base.compare(a.getTime(), b.getTime()); 1.706 + }, 1.707 + 1.708 + /** @id MochiKit.Base.compareArrayLike */ 1.709 + compareArrayLike: function (a, b) { 1.710 + var compare = MochiKit.Base.compare; 1.711 + var count = a.length; 1.712 + var rval = 0; 1.713 + if (count > b.length) { 1.714 + rval = 1; 1.715 + count = b.length; 1.716 + } else if (count < b.length) { 1.717 + rval = -1; 1.718 + } 1.719 + for (var i = 0; i < count; i++) { 1.720 + var cmp = compare(a[i], b[i]); 1.721 + if (cmp) { 1.722 + return cmp; 1.723 + } 1.724 + } 1.725 + return rval; 1.726 + }, 1.727 + 1.728 + /** @id MochiKit.Base.registerRepr */ 1.729 + registerRepr: function (name, check, wrap, /* optional */override) { 1.730 + MochiKit.Base.reprRegistry.register(name, check, wrap, override); 1.731 + }, 1.732 + 1.733 + /** @id MochiKit.Base.repr */ 1.734 + repr: function (o) { 1.735 + if (typeof(o) == "undefined") { 1.736 + return "undefined"; 1.737 + } else if (o === null) { 1.738 + return "null"; 1.739 + } 1.740 + try { 1.741 + if (typeof(o.__repr__) == 'function') { 1.742 + return o.__repr__(); 1.743 + } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) { 1.744 + return o.repr(); 1.745 + } 1.746 + return MochiKit.Base.reprRegistry.match(o); 1.747 + } catch (e) { 1.748 + try { 1.749 + if (typeof(o.NAME) == 'string' && ( 1.750 + o.toString == Function.prototype.toString || 1.751 + o.toString == Object.prototype.toString 1.752 + )) { 1.753 + return o.NAME; 1.754 + } 1.755 + } catch (e) { 1.756 + } 1.757 + } 1.758 + try { 1.759 + var ostring = (o + ""); 1.760 + } catch (e) { 1.761 + return "[" + typeof(o) + "]"; 1.762 + } 1.763 + if (typeof(o) == "function") { 1.764 + o = ostring.replace(/^\s+/, ""); 1.765 + var idx = o.indexOf("{"); 1.766 + if (idx != -1) { 1.767 + o = o.substr(0, idx) + "{...}"; 1.768 + } 1.769 + } 1.770 + return ostring; 1.771 + }, 1.772 + 1.773 + /** @id MochiKit.Base.reprArrayLike */ 1.774 + reprArrayLike: function (o) { 1.775 + var m = MochiKit.Base; 1.776 + return "[" + m.map(m.repr, o).join(", ") + "]"; 1.777 + }, 1.778 + 1.779 + /** @id MochiKit.Base.reprString */ 1.780 + reprString: function (o) { 1.781 + return ('"' + o.replace(/(["\\])/g, '\\$1') + '"' 1.782 + ).replace(/[\f]/g, "\\f" 1.783 + ).replace(/[\b]/g, "\\b" 1.784 + ).replace(/[\n]/g, "\\n" 1.785 + ).replace(/[\t]/g, "\\t" 1.786 + ).replace(/[\r]/g, "\\r"); 1.787 + }, 1.788 + 1.789 + /** @id MochiKit.Base.reprNumber */ 1.790 + reprNumber: function (o) { 1.791 + return o + ""; 1.792 + }, 1.793 + 1.794 + /** @id MochiKit.Base.registerJSON */ 1.795 + registerJSON: function (name, check, wrap, /* optional */override) { 1.796 + MochiKit.Base.jsonRegistry.register(name, check, wrap, override); 1.797 + }, 1.798 + 1.799 + 1.800 + /** @id MochiKit.Base.evalJSON */ 1.801 + evalJSON: function () { 1.802 + return eval("(" + arguments[0] + ")"); 1.803 + }, 1.804 + 1.805 + /** @id MochiKit.Base.serializeJSON */ 1.806 + serializeJSON: function (o) { 1.807 + var objtype = typeof(o); 1.808 + if (objtype == "number" || objtype == "boolean") { 1.809 + return o + ""; 1.810 + } else if (o === null) { 1.811 + return "null"; 1.812 + } 1.813 + var m = MochiKit.Base; 1.814 + var reprString = m.reprString; 1.815 + if (objtype == "string") { 1.816 + return reprString(o); 1.817 + } 1.818 + // recurse 1.819 + var me = arguments.callee; 1.820 + // short-circuit for objects that support "json" serialization 1.821 + // if they return "self" then just pass-through... 1.822 + var newObj; 1.823 + if (typeof(o.__json__) == "function") { 1.824 + newObj = o.__json__(); 1.825 + if (o !== newObj) { 1.826 + return me(newObj); 1.827 + } 1.828 + } 1.829 + if (typeof(o.json) == "function") { 1.830 + newObj = o.json(); 1.831 + if (o !== newObj) { 1.832 + return me(newObj); 1.833 + } 1.834 + } 1.835 + // array 1.836 + if (objtype != "function" && typeof(o.length) == "number") { 1.837 + var res = []; 1.838 + for (var i = 0; i < o.length; i++) { 1.839 + var val = me(o[i]); 1.840 + if (typeof(val) != "string") { 1.841 + val = "undefined"; 1.842 + } 1.843 + res.push(val); 1.844 + } 1.845 + return "[" + res.join(", ") + "]"; 1.846 + } 1.847 + // look in the registry 1.848 + try { 1.849 + newObj = m.jsonRegistry.match(o); 1.850 + if (o !== newObj) { 1.851 + return me(newObj); 1.852 + } 1.853 + } catch (e) { 1.854 + if (e != m.NotFound) { 1.855 + // something really bad happened 1.856 + throw e; 1.857 + } 1.858 + } 1.859 + // undefined is outside of the spec 1.860 + if (objtype == "undefined") { 1.861 + throw new TypeError("undefined can not be serialized as JSON"); 1.862 + } 1.863 + // it's a function with no adapter, bad 1.864 + if (objtype == "function") { 1.865 + return null; 1.866 + } 1.867 + // generic object code path 1.868 + res = []; 1.869 + for (var k in o) { 1.870 + var useKey; 1.871 + if (typeof(k) == "number") { 1.872 + useKey = '"' + k + '"'; 1.873 + } else if (typeof(k) == "string") { 1.874 + useKey = reprString(k); 1.875 + } else { 1.876 + // skip non-string or number keys 1.877 + continue; 1.878 + } 1.879 + val = me(o[k]); 1.880 + if (typeof(val) != "string") { 1.881 + // skip non-serializable values 1.882 + continue; 1.883 + } 1.884 + res.push(useKey + ":" + val); 1.885 + } 1.886 + return "{" + res.join(", ") + "}"; 1.887 + }, 1.888 + 1.889 + 1.890 + /** @id MochiKit.Base.objEqual */ 1.891 + objEqual: function (a, b) { 1.892 + return (MochiKit.Base.compare(a, b) === 0); 1.893 + }, 1.894 + 1.895 + /** @id MochiKit.Base.arrayEqual */ 1.896 + arrayEqual: function (self, arr) { 1.897 + if (self.length != arr.length) { 1.898 + return false; 1.899 + } 1.900 + return (MochiKit.Base.compare(self, arr) === 0); 1.901 + }, 1.902 + 1.903 + /** @id MochiKit.Base.concat */ 1.904 + concat: function (/* lst... */) { 1.905 + var rval = []; 1.906 + var extend = MochiKit.Base.extend; 1.907 + for (var i = 0; i < arguments.length; i++) { 1.908 + extend(rval, arguments[i]); 1.909 + } 1.910 + return rval; 1.911 + }, 1.912 + 1.913 + /** @id MochiKit.Base.keyComparator */ 1.914 + keyComparator: function (key/* ... */) { 1.915 + // fast-path for single key comparisons 1.916 + var m = MochiKit.Base; 1.917 + var compare = m.compare; 1.918 + if (arguments.length == 1) { 1.919 + return function (a, b) { 1.920 + return compare(a[key], b[key]); 1.921 + }; 1.922 + } 1.923 + var compareKeys = m.extend(null, arguments); 1.924 + return function (a, b) { 1.925 + var rval = 0; 1.926 + // keep comparing until something is inequal or we run out of 1.927 + // keys to compare 1.928 + for (var i = 0; (rval === 0) && (i < compareKeys.length); i++) { 1.929 + var key = compareKeys[i]; 1.930 + rval = compare(a[key], b[key]); 1.931 + } 1.932 + return rval; 1.933 + }; 1.934 + }, 1.935 + 1.936 + /** @id MochiKit.Base.reverseKeyComparator */ 1.937 + reverseKeyComparator: function (key) { 1.938 + var comparator = MochiKit.Base.keyComparator.apply(this, arguments); 1.939 + return function (a, b) { 1.940 + return comparator(b, a); 1.941 + }; 1.942 + }, 1.943 + 1.944 + /** @id MochiKit.Base.partial */ 1.945 + partial: function (func) { 1.946 + var m = MochiKit.Base; 1.947 + return m.bind.apply(this, m.extend([func, undefined], arguments, 1)); 1.948 + }, 1.949 + 1.950 + /** @id MochiKit.Base.listMinMax */ 1.951 + listMinMax: function (which, lst) { 1.952 + if (lst.length === 0) { 1.953 + return null; 1.954 + } 1.955 + var cur = lst[0]; 1.956 + var compare = MochiKit.Base.compare; 1.957 + for (var i = 1; i < lst.length; i++) { 1.958 + var o = lst[i]; 1.959 + if (compare(o, cur) == which) { 1.960 + cur = o; 1.961 + } 1.962 + } 1.963 + return cur; 1.964 + }, 1.965 + 1.966 + /** @id MochiKit.Base.objMax */ 1.967 + objMax: function (/* obj... */) { 1.968 + return MochiKit.Base.listMinMax(1, arguments); 1.969 + }, 1.970 + 1.971 + /** @id MochiKit.Base.objMin */ 1.972 + objMin: function (/* obj... */) { 1.973 + return MochiKit.Base.listMinMax(-1, arguments); 1.974 + }, 1.975 + 1.976 + /** @id MochiKit.Base.findIdentical */ 1.977 + findIdentical: function (lst, value, start/* = 0 */, /* optional */end) { 1.978 + if (typeof(end) == "undefined" || end === null) { 1.979 + end = lst.length; 1.980 + } 1.981 + if (typeof(start) == "undefined" || start === null) { 1.982 + start = 0; 1.983 + } 1.984 + for (var i = start; i < end; i++) { 1.985 + if (lst[i] === value) { 1.986 + return i; 1.987 + } 1.988 + } 1.989 + return -1; 1.990 + }, 1.991 + 1.992 + /** @id MochiKit.Base.mean */ 1.993 + mean: function(/* lst... */) { 1.994 + /* http://www.nist.gov/dads/HTML/mean.html */ 1.995 + var sum = 0; 1.996 + 1.997 + var m = MochiKit.Base; 1.998 + var args = m.extend(null, arguments); 1.999 + var count = args.length; 1.1000 + 1.1001 + while (args.length) { 1.1002 + var o = args.shift(); 1.1003 + if (o && typeof(o) == "object" && typeof(o.length) == "number") { 1.1004 + count += o.length - 1; 1.1005 + for (var i = o.length - 1; i >= 0; i--) { 1.1006 + sum += o[i]; 1.1007 + } 1.1008 + } else { 1.1009 + sum += o; 1.1010 + } 1.1011 + } 1.1012 + 1.1013 + if (count <= 0) { 1.1014 + throw new TypeError('mean() requires at least one argument'); 1.1015 + } 1.1016 + 1.1017 + return sum/count; 1.1018 + }, 1.1019 + 1.1020 + /** @id MochiKit.Base.median */ 1.1021 + median: function(/* lst... */) { 1.1022 + /* http://www.nist.gov/dads/HTML/median.html */ 1.1023 + var data = MochiKit.Base.flattenArguments(arguments); 1.1024 + if (data.length === 0) { 1.1025 + throw new TypeError('median() requires at least one argument'); 1.1026 + } 1.1027 + data.sort(compare); 1.1028 + if (data.length % 2 == 0) { 1.1029 + var upper = data.length / 2; 1.1030 + return (data[upper] + data[upper - 1]) / 2; 1.1031 + } else { 1.1032 + return data[(data.length - 1) / 2]; 1.1033 + } 1.1034 + }, 1.1035 + 1.1036 + /** @id MochiKit.Base.findValue */ 1.1037 + findValue: function (lst, value, start/* = 0 */, /* optional */end) { 1.1038 + if (typeof(end) == "undefined" || end === null) { 1.1039 + end = lst.length; 1.1040 + } 1.1041 + if (typeof(start) == "undefined" || start === null) { 1.1042 + start = 0; 1.1043 + } 1.1044 + var cmp = MochiKit.Base.compare; 1.1045 + for (var i = start; i < end; i++) { 1.1046 + if (cmp(lst[i], value) === 0) { 1.1047 + return i; 1.1048 + } 1.1049 + } 1.1050 + return -1; 1.1051 + }, 1.1052 + 1.1053 + /** @id MochiKit.Base.nodeWalk */ 1.1054 + nodeWalk: function (node, visitor) { 1.1055 + var nodes = [node]; 1.1056 + var extend = MochiKit.Base.extend; 1.1057 + while (nodes.length) { 1.1058 + var res = visitor(nodes.shift()); 1.1059 + if (res) { 1.1060 + extend(nodes, res); 1.1061 + } 1.1062 + } 1.1063 + }, 1.1064 + 1.1065 + 1.1066 + /** @id MochiKit.Base.nameFunctions */ 1.1067 + nameFunctions: function (namespace) { 1.1068 + var base = namespace.NAME; 1.1069 + if (typeof(base) == 'undefined') { 1.1070 + base = ''; 1.1071 + } else { 1.1072 + base = base + '.'; 1.1073 + } 1.1074 + for (var name in namespace) { 1.1075 + var o = namespace[name]; 1.1076 + if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { 1.1077 + try { 1.1078 + o.NAME = base + name; 1.1079 + } catch (e) { 1.1080 + // pass 1.1081 + } 1.1082 + } 1.1083 + } 1.1084 + }, 1.1085 + 1.1086 + 1.1087 + /** @id MochiKit.Base.queryString */ 1.1088 + queryString: function (names, values) { 1.1089 + // check to see if names is a string or a DOM element, and if 1.1090 + // MochiKit.DOM is available. If so, drop it like it's a form 1.1091 + // Ugliest conditional in MochiKit? Probably! 1.1092 + if (typeof(MochiKit.DOM) != "undefined" && arguments.length == 1 1.1093 + && (typeof(names) == "string" || ( 1.1094 + typeof(names.nodeType) != "undefined" && names.nodeType > 0 1.1095 + )) 1.1096 + ) { 1.1097 + var kv = MochiKit.DOM.formContents(names); 1.1098 + names = kv[0]; 1.1099 + values = kv[1]; 1.1100 + } else if (arguments.length == 1) { 1.1101 + var o = names; 1.1102 + names = []; 1.1103 + values = []; 1.1104 + for (var k in o) { 1.1105 + var v = o[k]; 1.1106 + if (typeof(v) == "function") { 1.1107 + continue; 1.1108 + } else if (typeof(v) != "string" && 1.1109 + typeof(v.length) == "number") { 1.1110 + for (var i = 0; i < v.length; i++) { 1.1111 + names.push(k); 1.1112 + values.push(v[i]); 1.1113 + } 1.1114 + } else { 1.1115 + names.push(k); 1.1116 + values.push(v); 1.1117 + } 1.1118 + } 1.1119 + } 1.1120 + var rval = []; 1.1121 + var len = Math.min(names.length, values.length); 1.1122 + var urlEncode = MochiKit.Base.urlEncode; 1.1123 + for (var i = 0; i < len; i++) { 1.1124 + v = values[i]; 1.1125 + if (typeof(v) != 'undefined' && v !== null) { 1.1126 + rval.push(urlEncode(names[i]) + "=" + urlEncode(v)); 1.1127 + } 1.1128 + } 1.1129 + return rval.join("&"); 1.1130 + }, 1.1131 + 1.1132 + 1.1133 + /** @id MochiKit.Base.parseQueryString */ 1.1134 + parseQueryString: function (encodedString, useArrays) { 1.1135 + // strip a leading '?' from the encoded string 1.1136 + var qstr = (encodedString[0] == "?") ? encodedString.substring(1) : 1.1137 + encodedString; 1.1138 + var pairs = qstr.replace(/\+/g, "%20").split(/(\&\;|\&\#38\;|\&|\&)/); 1.1139 + var o = {}; 1.1140 + var decode; 1.1141 + if (typeof(decodeURIComponent) != "undefined") { 1.1142 + decode = decodeURIComponent; 1.1143 + } else { 1.1144 + decode = unescape; 1.1145 + } 1.1146 + if (useArrays) { 1.1147 + for (var i = 0; i < pairs.length; i++) { 1.1148 + var pair = pairs[i].split("="); 1.1149 + if (pair.length !== 2) { 1.1150 + continue; 1.1151 + } 1.1152 + var name = decode(pair[0]); 1.1153 + var arr = o[name]; 1.1154 + if (!(arr instanceof Array)) { 1.1155 + arr = []; 1.1156 + o[name] = arr; 1.1157 + } 1.1158 + arr.push(decode(pair[1])); 1.1159 + } 1.1160 + } else { 1.1161 + for (i = 0; i < pairs.length; i++) { 1.1162 + pair = pairs[i].split("="); 1.1163 + if (pair.length !== 2) { 1.1164 + continue; 1.1165 + } 1.1166 + o[decode(pair[0])] = decode(pair[1]); 1.1167 + } 1.1168 + } 1.1169 + return o; 1.1170 + } 1.1171 +}); 1.1172 + 1.1173 +/** @id MochiKit.Base.AdapterRegistry */ 1.1174 +MochiKit.Base.AdapterRegistry = function () { 1.1175 + this.pairs = []; 1.1176 +}; 1.1177 + 1.1178 +MochiKit.Base.AdapterRegistry.prototype = { 1.1179 + /** @id MochiKit.Base.AdapterRegistry.prototype.register */ 1.1180 + register: function (name, check, wrap, /* optional */ override) { 1.1181 + if (override) { 1.1182 + this.pairs.unshift([name, check, wrap]); 1.1183 + } else { 1.1184 + this.pairs.push([name, check, wrap]); 1.1185 + } 1.1186 + }, 1.1187 + 1.1188 + /** @id MochiKit.Base.AdapterRegistry.prototype.match */ 1.1189 + match: function (/* ... */) { 1.1190 + for (var i = 0; i < this.pairs.length; i++) { 1.1191 + var pair = this.pairs[i]; 1.1192 + if (pair[1].apply(this, arguments)) { 1.1193 + return pair[2].apply(this, arguments); 1.1194 + } 1.1195 + } 1.1196 + throw MochiKit.Base.NotFound; 1.1197 + }, 1.1198 + 1.1199 + /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */ 1.1200 + unregister: function (name) { 1.1201 + for (var i = 0; i < this.pairs.length; i++) { 1.1202 + var pair = this.pairs[i]; 1.1203 + if (pair[0] == name) { 1.1204 + this.pairs.splice(i, 1); 1.1205 + return true; 1.1206 + } 1.1207 + } 1.1208 + return false; 1.1209 + } 1.1210 +}; 1.1211 + 1.1212 + 1.1213 +MochiKit.Base.EXPORT = [ 1.1214 + "flattenArray", 1.1215 + "noop", 1.1216 + "camelize", 1.1217 + "counter", 1.1218 + "clone", 1.1219 + "extend", 1.1220 + "update", 1.1221 + "updatetree", 1.1222 + "setdefault", 1.1223 + "keys", 1.1224 + "values", 1.1225 + "items", 1.1226 + "NamedError", 1.1227 + "operator", 1.1228 + "forwardCall", 1.1229 + "itemgetter", 1.1230 + "typeMatcher", 1.1231 + "isCallable", 1.1232 + "isUndefined", 1.1233 + "isUndefinedOrNull", 1.1234 + "isNull", 1.1235 + "isEmpty", 1.1236 + "isNotEmpty", 1.1237 + "isArrayLike", 1.1238 + "isDateLike", 1.1239 + "xmap", 1.1240 + "map", 1.1241 + "xfilter", 1.1242 + "filter", 1.1243 + "methodcaller", 1.1244 + "compose", 1.1245 + "bind", 1.1246 + "bindMethods", 1.1247 + "NotFound", 1.1248 + "AdapterRegistry", 1.1249 + "registerComparator", 1.1250 + "compare", 1.1251 + "registerRepr", 1.1252 + "repr", 1.1253 + "objEqual", 1.1254 + "arrayEqual", 1.1255 + "concat", 1.1256 + "keyComparator", 1.1257 + "reverseKeyComparator", 1.1258 + "partial", 1.1259 + "merge", 1.1260 + "listMinMax", 1.1261 + "listMax", 1.1262 + "listMin", 1.1263 + "objMax", 1.1264 + "objMin", 1.1265 + "nodeWalk", 1.1266 + "zip", 1.1267 + "urlEncode", 1.1268 + "queryString", 1.1269 + "serializeJSON", 1.1270 + "registerJSON", 1.1271 + "evalJSON", 1.1272 + "parseQueryString", 1.1273 + "findValue", 1.1274 + "findIdentical", 1.1275 + "flattenArguments", 1.1276 + "method", 1.1277 + "average", 1.1278 + "mean", 1.1279 + "median" 1.1280 +]; 1.1281 + 1.1282 +MochiKit.Base.EXPORT_OK = [ 1.1283 + "nameFunctions", 1.1284 + "comparatorRegistry", 1.1285 + "reprRegistry", 1.1286 + "jsonRegistry", 1.1287 + "compareDateLike", 1.1288 + "compareArrayLike", 1.1289 + "reprArrayLike", 1.1290 + "reprString", 1.1291 + "reprNumber" 1.1292 +]; 1.1293 + 1.1294 +MochiKit.Base._exportSymbols = function (globals, module) { 1.1295 + if (!MochiKit.__export__) { 1.1296 + return; 1.1297 + } 1.1298 + var all = module.EXPORT_TAGS[":all"]; 1.1299 + for (var i = 0; i < all.length; i++) { 1.1300 + globals[all[i]] = module[all[i]]; 1.1301 + } 1.1302 +}; 1.1303 + 1.1304 +MochiKit.Base.__new__ = function () { 1.1305 + // A singleton raised when no suitable adapter is found 1.1306 + var m = this; 1.1307 + 1.1308 + // convenience 1.1309 + /** @id MochiKit.Base.noop */ 1.1310 + m.noop = m.operator.identity; 1.1311 + 1.1312 + // Backwards compat 1.1313 + m.forward = m.forwardCall; 1.1314 + m.find = m.findValue; 1.1315 + 1.1316 + if (typeof(encodeURIComponent) != "undefined") { 1.1317 + /** @id MochiKit.Base.urlEncode */ 1.1318 + m.urlEncode = function (unencoded) { 1.1319 + return encodeURIComponent(unencoded).replace(/\'/g, '%27'); 1.1320 + }; 1.1321 + } else { 1.1322 + m.urlEncode = function (unencoded) { 1.1323 + return escape(unencoded 1.1324 + ).replace(/\+/g, '%2B' 1.1325 + ).replace(/\"/g,'%22' 1.1326 + ).rval.replace(/\'/g, '%27'); 1.1327 + }; 1.1328 + } 1.1329 + 1.1330 + /** @id MochiKit.Base.NamedError */ 1.1331 + m.NamedError = function (name) { 1.1332 + this.message = name; 1.1333 + this.name = name; 1.1334 + }; 1.1335 + m.NamedError.prototype = new Error(); 1.1336 + m.update(m.NamedError.prototype, { 1.1337 + repr: function () { 1.1338 + if (this.message && this.message != this.name) { 1.1339 + return this.name + "(" + m.repr(this.message) + ")"; 1.1340 + } else { 1.1341 + return this.name + "()"; 1.1342 + } 1.1343 + }, 1.1344 + toString: m.forwardCall("repr") 1.1345 + }); 1.1346 + 1.1347 + /** @id MochiKit.Base.NotFound */ 1.1348 + m.NotFound = new m.NamedError("MochiKit.Base.NotFound"); 1.1349 + 1.1350 + 1.1351 + /** @id MochiKit.Base.listMax */ 1.1352 + m.listMax = m.partial(m.listMinMax, 1); 1.1353 + /** @id MochiKit.Base.listMin */ 1.1354 + m.listMin = m.partial(m.listMinMax, -1); 1.1355 + 1.1356 + /** @id MochiKit.Base.isCallable */ 1.1357 + m.isCallable = m.typeMatcher('function'); 1.1358 + /** @id MochiKit.Base.isUndefined */ 1.1359 + m.isUndefined = m.typeMatcher('undefined'); 1.1360 + 1.1361 + /** @id MochiKit.Base.merge */ 1.1362 + m.merge = m.partial(m.update, null); 1.1363 + /** @id MochiKit.Base.zip */ 1.1364 + m.zip = m.partial(m.map, null); 1.1365 + 1.1366 + /** @id MochiKit.Base.average */ 1.1367 + m.average = m.mean; 1.1368 + 1.1369 + /** @id MochiKit.Base.comparatorRegistry */ 1.1370 + m.comparatorRegistry = new m.AdapterRegistry(); 1.1371 + m.registerComparator("dateLike", m.isDateLike, m.compareDateLike); 1.1372 + m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike); 1.1373 + 1.1374 + /** @id MochiKit.Base.reprRegistry */ 1.1375 + m.reprRegistry = new m.AdapterRegistry(); 1.1376 + m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike); 1.1377 + m.registerRepr("string", m.typeMatcher("string"), m.reprString); 1.1378 + m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber); 1.1379 + 1.1380 + /** @id MochiKit.Base.jsonRegistry */ 1.1381 + m.jsonRegistry = new m.AdapterRegistry(); 1.1382 + 1.1383 + var all = m.concat(m.EXPORT, m.EXPORT_OK); 1.1384 + m.EXPORT_TAGS = { 1.1385 + ":common": m.concat(m.EXPORT_OK), 1.1386 + ":all": all 1.1387 + }; 1.1388 + 1.1389 + m.nameFunctions(this); 1.1390 + 1.1391 +}; 1.1392 + 1.1393 +MochiKit.Base.__new__(); 1.1394 + 1.1395 +// 1.1396 +// XXX: Internet Explorer blows 1.1397 +// 1.1398 +if (MochiKit.__export__) { 1.1399 + compare = MochiKit.Base.compare; 1.1400 + compose = MochiKit.Base.compose; 1.1401 + serializeJSON = MochiKit.Base.serializeJSON; 1.1402 +} 1.1403 + 1.1404 +MochiKit.Base._exportSymbols(this, MochiKit.Base);