1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402 |
- /***
- MochiKit.Base 1.4
- See <http://mochikit.com/> for documentation, downloads, license, etc.
- (c) 2005 Bob Ippolito. All rights Reserved.
- ***/
- if (typeof(dojo) != 'undefined') {
- dojo.provide("MochiKit.Base");
- }
- if (typeof(MochiKit) == 'undefined') {
- MochiKit = {};
- }
- if (typeof(MochiKit.Base) == 'undefined') {
- MochiKit.Base = {};
- }
- if (typeof(MochiKit.__export__) == "undefined") {
- MochiKit.__export__ = (MochiKit.__compat__ ||
- (typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined')
- );
- }
- MochiKit.Base.VERSION = "1.4";
- MochiKit.Base.NAME = "MochiKit.Base";
- /** @id MochiKit.Base.update */
- MochiKit.Base.update = function (self, obj/*, ... */) {
- if (self === null) {
- self = {};
- }
- for (var i = 1; i < arguments.length; i++) {
- var o = arguments[i];
- if (typeof(o) != 'undefined' && o !== null) {
- for (var k in o) {
- self[k] = o[k];
- }
- }
- }
- return self;
- };
- MochiKit.Base.update(MochiKit.Base, {
- __repr__: function () {
- return "[" + this.NAME + " " + this.VERSION + "]";
- },
- toString: function () {
- return this.__repr__();
- },
- /** @id MochiKit.Base.camelize */
- camelize: function (selector) {
- /* from dojo.style.toCamelCase */
- var arr = selector.split('-');
- var cc = arr[0];
- for (var i = 1; i < arr.length; i++) {
- cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
- }
- return cc;
- },
- /** @id MochiKit.Base.counter */
- counter: function (n/* = 1 */) {
- if (arguments.length === 0) {
- n = 1;
- }
- return function () {
- return n++;
- };
- },
-
- /** @id MochiKit.Base.clone */
- clone: function (obj) {
- var me = arguments.callee;
- if (arguments.length == 1) {
- me.prototype = obj;
- return new me();
- }
- },
-
- _flattenArray: function (res, lst) {
- for (var i = 0; i < lst.length; i++) {
- var o = lst[i];
- if (o instanceof Array) {
- arguments.callee(res, o);
- } else {
- res.push(o);
- }
- }
- return res;
- },
-
- /** @id MochiKit.Base.flattenArray */
- flattenArray: function (lst) {
- return MochiKit.Base._flattenArray([], lst);
- },
-
- /** @id MochiKit.Base.flattenArguments */
- flattenArguments: function (lst/* ...*/) {
- var res = [];
- var m = MochiKit.Base;
- var args = m.extend(null, arguments);
- while (args.length) {
- var o = args.shift();
- if (o && typeof(o) == "object" && typeof(o.length) == "number") {
- for (var i = o.length - 1; i >= 0; i--) {
- args.unshift(o[i]);
- }
- } else {
- res.push(o);
- }
- }
- return res;
- },
- /** @id MochiKit.Base.extend */
- extend: function (self, obj, /* optional */skip) {
- // Extend an array with an array-like object starting
- // from the skip index
- if (!skip) {
- skip = 0;
- }
- if (obj) {
- // allow iterable fall-through, but skip the full isArrayLike
- // check for speed, this is called often.
- var l = obj.length;
- if (typeof(l) != 'number' /* !isArrayLike(obj) */) {
- if (typeof(MochiKit.Iter) != "undefined") {
- obj = MochiKit.Iter.list(obj);
- l = obj.length;
- } else {
- throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
- }
- }
- if (!self) {
- self = [];
- }
- for (var i = skip; i < l; i++) {
- self.push(obj[i]);
- }
- }
- // This mutates, but it's convenient to return because
- // it's often used like a constructor when turning some
- // ghetto array-like to a real array
- return self;
- },
- /** @id MochiKit.Base.updatetree */
- updatetree: function (self, obj/*, ...*/) {
- if (self === null) {
- self = {};
- }
- for (var i = 1; i < arguments.length; i++) {
- var o = arguments[i];
- if (typeof(o) != 'undefined' && o !== null) {
- for (var k in o) {
- var v = o[k];
- if (typeof(self[k]) == 'object' && typeof(v) == 'object') {
- arguments.callee(self[k], v);
- } else {
- self[k] = v;
- }
- }
- }
- }
- return self;
- },
- /** @id MochiKit.Base.setdefault */
- setdefault: function (self, obj/*, ...*/) {
- if (self === null) {
- self = {};
- }
- for (var i = 1; i < arguments.length; i++) {
- var o = arguments[i];
- for (var k in o) {
- if (!(k in self)) {
- self[k] = o[k];
- }
- }
- }
- return self;
- },
- /** @id MochiKit.Base.keys */
- keys: function (obj) {
- var rval = [];
- for (var prop in obj) {
- rval.push(prop);
- }
- return rval;
- },
-
- /** @id MochiKit.Base.values */
- values: function (obj) {
- var rval = [];
- for (var prop in obj) {
- rval.push(obj[prop]);
- }
- return rval;
- },
- /** @id MochiKit.Base.items */
- items: function (obj) {
- var rval = [];
- var e;
- for (var prop in obj) {
- var v;
- try {
- v = obj[prop];
- } catch (e) {
- continue;
- }
- rval.push([prop, v]);
- }
- return rval;
- },
- _newNamedError: function (module, name, func) {
- func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name);
- module[name] = func;
- },
- /** @id MochiKit.Base.operator */
- operator: {
- // unary logic operators
- /** @id MochiKit.Base.truth */
- truth: function (a) { return !!a; },
- /** @id MochiKit.Base.lognot */
- lognot: function (a) { return !a; },
- /** @id MochiKit.Base.identity */
- identity: function (a) { return a; },
- // bitwise unary operators
- /** @id MochiKit.Base.not */
- not: function (a) { return ~a; },
- /** @id MochiKit.Base.neg */
- neg: function (a) { return -a; },
- // binary operators
- /** @id MochiKit.Base.add */
- add: function (a, b) { return a + b; },
- /** @id MochiKit.Base.sub */
- sub: function (a, b) { return a - b; },
- /** @id MochiKit.Base.div */
- div: function (a, b) { return a / b; },
- /** @id MochiKit.Base.mod */
- mod: function (a, b) { return a % b; },
- /** @id MochiKit.Base.mul */
- mul: function (a, b) { return a * b; },
- // bitwise binary operators
- /** @id MochiKit.Base.and */
- and: function (a, b) { return a & b; },
- /** @id MochiKit.Base.or */
- or: function (a, b) { return a | b; },
- /** @id MochiKit.Base.xor */
- xor: function (a, b) { return a ^ b; },
- /** @id MochiKit.Base.lshift */
- lshift: function (a, b) { return a << b; },
- /** @id MochiKit.Base.rshift */
- rshift: function (a, b) { return a >> b; },
- /** @id MochiKit.Base.zrshift */
- zrshift: function (a, b) { return a >>> b; },
- // near-worthless built-in comparators
- /** @id MochiKit.Base.eq */
- eq: function (a, b) { return a == b; },
- /** @id MochiKit.Base.ne */
- ne: function (a, b) { return a != b; },
- /** @id MochiKit.Base.gt */
- gt: function (a, b) { return a > b; },
- /** @id MochiKit.Base.ge */
- ge: function (a, b) { return a >= b; },
- /** @id MochiKit.Base.lt */
- lt: function (a, b) { return a < b; },
- /** @id MochiKit.Base.le */
- le: function (a, b) { return a <= b; },
- // strict built-in comparators
- seq: function (a, b) { return a === b; },
- sne: function (a, b) { return a !== b; },
- // compare comparators
- /** @id MochiKit.Base.ceq */
- ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; },
- /** @id MochiKit.Base.cne */
- cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; },
- /** @id MochiKit.Base.cgt */
- cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; },
- /** @id MochiKit.Base.cge */
- cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; },
- /** @id MochiKit.Base.clt */
- clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; },
- /** @id MochiKit.Base.cle */
- cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; },
- // binary logical operators
- /** @id MochiKit.Base.logand */
- logand: function (a, b) { return a && b; },
- /** @id MochiKit.Base.logor */
- logor: function (a, b) { return a || b; },
- /** @id MochiKit.Base.contains */
- contains: function (a, b) { return b in a; }
- },
- /** @id MochiKit.Base.forwardCall */
- forwardCall: function (func) {
- return function () {
- return this[func].apply(this, arguments);
- };
- },
- /** @id MochiKit.Base.itemgetter */
- itemgetter: function (func) {
- return function (arg) {
- return arg[func];
- };
- },
- /** @id MochiKit.Base.typeMatcher */
- typeMatcher: function (/* typ */) {
- var types = {};
- for (var i = 0; i < arguments.length; i++) {
- var typ = arguments[i];
- types[typ] = typ;
- }
- return function () {
- for (var i = 0; i < arguments.length; i++) {
- if (!(typeof(arguments[i]) in types)) {
- return false;
- }
- }
- return true;
- };
- },
- /** @id MochiKit.Base.isNull */
- isNull: function (/* ... */) {
- for (var i = 0; i < arguments.length; i++) {
- if (arguments[i] !== null) {
- return false;
- }
- }
- return true;
- },
- /** @id MochiKit.Base.isUndefinedOrNull */
- isUndefinedOrNull: function (/* ... */) {
- for (var i = 0; i < arguments.length; i++) {
- var o = arguments[i];
- if (!(typeof(o) == 'undefined' || o === null)) {
- return false;
- }
- }
- return true;
- },
- /** @id MochiKit.Base.isEmpty */
- isEmpty: function (obj) {
- return !MochiKit.Base.isNotEmpty.apply(this, arguments);
- },
- /** @id MochiKit.Base.isNotEmpty */
- isNotEmpty: function (obj) {
- for (var i = 0; i < arguments.length; i++) {
- var o = arguments[i];
- if (!(o && o.length)) {
- return false;
- }
- }
- return true;
- },
- /** @id MochiKit.Base.isArrayLike */
- isArrayLike: function () {
- for (var i = 0; i < arguments.length; i++) {
- var o = arguments[i];
- var typ = typeof(o);
- if (
- (typ != 'object' && !(typ == 'function' && typeof(o.item) == 'function')) ||
- o === null ||
- typeof(o.length) != 'number' ||
- o.nodeType === 3
- ) {
- return false;
- }
- }
- return true;
- },
- /** @id MochiKit.Base.isDateLike */
- isDateLike: function () {
- for (var i = 0; i < arguments.length; i++) {
- var o = arguments[i];
- if (typeof(o) != "object" || o === null
- || typeof(o.getTime) != 'function') {
- return false;
- }
- }
- return true;
- },
- /** @id MochiKit.Base.xmap */
- xmap: function (fn/*, obj... */) {
- if (fn === null) {
- return MochiKit.Base.extend(null, arguments, 1);
- }
- var rval = [];
- for (var i = 1; i < arguments.length; i++) {
- rval.push(fn(arguments[i]));
- }
- return rval;
- },
- /** @id MochiKit.Base.map */
- map: function (fn, lst/*, lst... */) {
- var m = MochiKit.Base;
- var itr = MochiKit.Iter;
- var isArrayLike = m.isArrayLike;
- if (arguments.length <= 2) {
- // allow an iterable to be passed
- if (!isArrayLike(lst)) {
- if (itr) {
- // fast path for map(null, iterable)
- lst = itr.list(lst);
- if (fn === null) {
- return lst;
- }
- } else {
- throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
- }
- }
- // fast path for map(null, lst)
- if (fn === null) {
- return m.extend(null, lst);
- }
- // disabled fast path for map(fn, lst)
- /*
- if (false && typeof(Array.prototype.map) == 'function') {
- // Mozilla fast-path
- return Array.prototype.map.call(lst, fn);
- }
- */
- var rval = [];
- for (var i = 0; i < lst.length; i++) {
- rval.push(fn(lst[i]));
- }
- return rval;
- } else {
- // default for map(null, ...) is zip(...)
- if (fn === null) {
- fn = Array;
- }
- var length = null;
- for (i = 1; i < arguments.length; i++) {
- // allow iterables to be passed
- if (!isArrayLike(arguments[i])) {
- if (itr) {
- return itr.list(itr.imap.apply(null, arguments));
- } else {
- throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
- }
- }
- // find the minimum length
- var l = arguments[i].length;
- if (length === null || length > l) {
- length = l;
- }
- }
- rval = [];
- for (i = 0; i < length; i++) {
- var args = [];
- for (var j = 1; j < arguments.length; j++) {
- args.push(arguments[j][i]);
- }
- rval.push(fn.apply(this, args));
- }
- return rval;
- }
- },
- /** @id MochiKit.Base.xfilter */
- xfilter: function (fn/*, obj... */) {
- var rval = [];
- if (fn === null) {
- fn = MochiKit.Base.operator.truth;
- }
- for (var i = 1; i < arguments.length; i++) {
- var o = arguments[i];
- if (fn(o)) {
- rval.push(o);
- }
- }
- return rval;
- },
- /** @id MochiKit.Base.filter */
- filter: function (fn, lst, self) {
- var rval = [];
- // allow an iterable to be passed
- var m = MochiKit.Base;
- if (!m.isArrayLike(lst)) {
- if (MochiKit.Iter) {
- lst = MochiKit.Iter.list(lst);
- } else {
- throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
- }
- }
- if (fn === null) {
- fn = m.operator.truth;
- }
- if (typeof(Array.prototype.filter) == 'function') {
- // Mozilla fast-path
- return Array.prototype.filter.call(lst, fn, self);
- } else if (typeof(self) == 'undefined' || self === null) {
- for (var i = 0; i < lst.length; i++) {
- var o = lst[i];
- if (fn(o)) {
- rval.push(o);
- }
- }
- } else {
- for (i = 0; i < lst.length; i++) {
- o = lst[i];
- if (fn.call(self, o)) {
- rval.push(o);
- }
- }
- }
- return rval;
- },
- _wrapDumbFunction: function (func) {
- return function () {
- // fast path!
- switch (arguments.length) {
- case 0: return func();
- case 1: return func(arguments[0]);
- case 2: return func(arguments[0], arguments[1]);
- case 3: return func(arguments[0], arguments[1], arguments[2]);
- }
- var args = [];
- for (var i = 0; i < arguments.length; i++) {
- args.push("arguments[" + i + "]");
- }
- return eval("(func(" + args.join(",") + "))");
- };
- },
- /** @id MochiKit.Base.methodcaller */
- methodcaller: function (func/*, args... */) {
- var args = MochiKit.Base.extend(null, arguments, 1);
- if (typeof(func) == "function") {
- return function (obj) {
- return func.apply(obj, args);
- };
- } else {
- return function (obj) {
- return obj[func].apply(obj, args);
- };
- }
- },
-
- /** @id MochiKit.Base.method */
- method: function (self, func) {
- var m = MochiKit.Base;
- return m.bind.apply(this, m.extend([func, self], arguments, 2));
- },
- /** @id MochiKit.Base.compose */
- compose: function (f1, f2/*, f3, ... fN */) {
- var fnlist = [];
- var m = MochiKit.Base;
- if (arguments.length === 0) {
- throw new TypeError("compose() requires at least one argument");
- }
- for (var i = 0; i < arguments.length; i++) {
- var fn = arguments[i];
- if (typeof(fn) != "function") {
- throw new TypeError(m.repr(fn) + " is not a function");
- }
- fnlist.push(fn);
- }
- return function () {
- var args = arguments;
- for (var i = fnlist.length - 1; i >= 0; i--) {
- args = [fnlist[i].apply(this, args)];
- }
- return args[0];
- };
- },
-
- /** @id MochiKit.Base.bind */
- bind: function (func, self/* args... */) {
- if (typeof(func) == "string") {
- func = self[func];
- }
- var im_func = func.im_func;
- var im_preargs = func.im_preargs;
- var im_self = func.im_self;
- var m = MochiKit.Base;
- if (typeof(func) == "function" && typeof(func.apply) == "undefined") {
- // this is for cases where JavaScript sucks ass and gives you a
- // really dumb built-in function like alert() that doesn't have
- // an apply
- func = m._wrapDumbFunction(func);
- }
- if (typeof(im_func) != 'function') {
- im_func = func;
- }
- if (typeof(self) != 'undefined') {
- im_self = self;
- }
- if (typeof(im_preargs) == 'undefined') {
- im_preargs = [];
- } else {
- im_preargs = im_preargs.slice();
- }
- m.extend(im_preargs, arguments, 2);
- var newfunc = function () {
- var args = arguments;
- var me = arguments.callee;
- if (me.im_preargs.length > 0) {
- args = m.concat(me.im_preargs, args);
- }
- var self = me.im_self;
- if (!self) {
- self = this;
- }
- return me.im_func.apply(self, args);
- };
- newfunc.im_self = im_self;
- newfunc.im_func = im_func;
- newfunc.im_preargs = im_preargs;
- return newfunc;
- },
- /** @id MochiKit.Base.bindMethods */
- bindMethods: function (self) {
- var bind = MochiKit.Base.bind;
- for (var k in self) {
- var func = self[k];
- if (typeof(func) == 'function') {
- self[k] = bind(func, self);
- }
- }
- },
- /** @id MochiKit.Base.registerComparator */
- registerComparator: function (name, check, comparator, /* optional */ override) {
- MochiKit.Base.comparatorRegistry.register(name, check, comparator, override);
- },
- _primitives: {'boolean': true, 'string': true, 'number': true},
- /** @id MochiKit.Base.compare */
- compare: function (a, b) {
- if (a == b) {
- return 0;
- }
- var aIsNull = (typeof(a) == 'undefined' || a === null);
- var bIsNull = (typeof(b) == 'undefined' || b === null);
- if (aIsNull && bIsNull) {
- return 0;
- } else if (aIsNull) {
- return -1;
- } else if (bIsNull) {
- return 1;
- }
- var m = MochiKit.Base;
- // bool, number, string have meaningful comparisons
- var prim = m._primitives;
- if (!(typeof(a) in prim && typeof(b) in prim)) {
- try {
- return m.comparatorRegistry.match(a, b);
- } catch (e) {
- if (e != m.NotFound) {
- throw e;
- }
- }
- }
- if (a < b) {
- return -1;
- } else if (a > b) {
- return 1;
- }
- // These types can't be compared
- var repr = m.repr;
- throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared");
- },
- /** @id MochiKit.Base.compareDateLike */
- compareDateLike: function (a, b) {
- return MochiKit.Base.compare(a.getTime(), b.getTime());
- },
- /** @id MochiKit.Base.compareArrayLike */
- compareArrayLike: function (a, b) {
- var compare = MochiKit.Base.compare;
- var count = a.length;
- var rval = 0;
- if (count > b.length) {
- rval = 1;
- count = b.length;
- } else if (count < b.length) {
- rval = -1;
- }
- for (var i = 0; i < count; i++) {
- var cmp = compare(a[i], b[i]);
- if (cmp) {
- return cmp;
- }
- }
- return rval;
- },
- /** @id MochiKit.Base.registerRepr */
- registerRepr: function (name, check, wrap, /* optional */override) {
- MochiKit.Base.reprRegistry.register(name, check, wrap, override);
- },
- /** @id MochiKit.Base.repr */
- repr: function (o) {
- if (typeof(o) == "undefined") {
- return "undefined";
- } else if (o === null) {
- return "null";
- }
- try {
- if (typeof(o.__repr__) == 'function') {
- return o.__repr__();
- } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) {
- return o.repr();
- }
- return MochiKit.Base.reprRegistry.match(o);
- } catch (e) {
- try {
- if (typeof(o.NAME) == 'string' && (
- o.toString == Function.prototype.toString ||
- o.toString == Object.prototype.toString
- )) {
- return o.NAME;
- }
- } catch (e) {
- }
- }
- try {
- var ostring = (o + "");
- } catch (e) {
- return "[" + typeof(o) + "]";
- }
- if (typeof(o) == "function") {
- o = ostring.replace(/^\s+/, "");
- var idx = o.indexOf("{");
- if (idx != -1) {
- o = o.substr(0, idx) + "{...}";
- }
- }
- return ostring;
- },
- /** @id MochiKit.Base.reprArrayLike */
- reprArrayLike: function (o) {
- var m = MochiKit.Base;
- return "[" + m.map(m.repr, o).join(", ") + "]";
- },
- /** @id MochiKit.Base.reprString */
- reprString: function (o) {
- return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
- ).replace(/[\f]/g, "\\f"
- ).replace(/[\b]/g, "\\b"
- ).replace(/[\n]/g, "\\n"
- ).replace(/[\t]/g, "\\t"
- ).replace(/[\r]/g, "\\r");
- },
- /** @id MochiKit.Base.reprNumber */
- reprNumber: function (o) {
- return o + "";
- },
- /** @id MochiKit.Base.registerJSON */
- registerJSON: function (name, check, wrap, /* optional */override) {
- MochiKit.Base.jsonRegistry.register(name, check, wrap, override);
- },
- /** @id MochiKit.Base.evalJSON */
- evalJSON: function () {
- return eval("(" + arguments[0] + ")");
- },
- /** @id MochiKit.Base.serializeJSON */
- serializeJSON: function (o) {
- var objtype = typeof(o);
- if (objtype == "number" || objtype == "boolean") {
- return o + "";
- } else if (o === null) {
- return "null";
- }
- var m = MochiKit.Base;
- var reprString = m.reprString;
- if (objtype == "string") {
- return reprString(o);
- }
- // recurse
- var me = arguments.callee;
- // short-circuit for objects that support "json" serialization
- // if they return "self" then just pass-through...
- var newObj;
- if (typeof(o.__json__) == "function") {
- newObj = o.__json__();
- if (o !== newObj) {
- return me(newObj);
- }
- }
- if (typeof(o.json) == "function") {
- newObj = o.json();
- if (o !== newObj) {
- return me(newObj);
- }
- }
- // array
- if (objtype != "function" && typeof(o.length) == "number") {
- var res = [];
- for (var i = 0; i < o.length; i++) {
- var val = me(o[i]);
- if (typeof(val) != "string") {
- val = "undefined";
- }
- res.push(val);
- }
- return "[" + res.join(", ") + "]";
- }
- // look in the registry
- try {
- newObj = m.jsonRegistry.match(o);
- if (o !== newObj) {
- return me(newObj);
- }
- } catch (e) {
- if (e != m.NotFound) {
- // something really bad happened
- throw e;
- }
- }
- // undefined is outside of the spec
- if (objtype == "undefined") {
- throw new TypeError("undefined can not be serialized as JSON");
- }
- // it's a function with no adapter, bad
- if (objtype == "function") {
- return null;
- }
- // generic object code path
- res = [];
- for (var k in o) {
- var useKey;
- if (typeof(k) == "number") {
- useKey = '"' + k + '"';
- } else if (typeof(k) == "string") {
- useKey = reprString(k);
- } else {
- // skip non-string or number keys
- continue;
- }
- val = me(o[k]);
- if (typeof(val) != "string") {
- // skip non-serializable values
- continue;
- }
- res.push(useKey + ":" + val);
- }
- return "{" + res.join(", ") + "}";
- },
-
- /** @id MochiKit.Base.objEqual */
- objEqual: function (a, b) {
- return (MochiKit.Base.compare(a, b) === 0);
- },
- /** @id MochiKit.Base.arrayEqual */
- arrayEqual: function (self, arr) {
- if (self.length != arr.length) {
- return false;
- }
- return (MochiKit.Base.compare(self, arr) === 0);
- },
- /** @id MochiKit.Base.concat */
- concat: function (/* lst... */) {
- var rval = [];
- var extend = MochiKit.Base.extend;
- for (var i = 0; i < arguments.length; i++) {
- extend(rval, arguments[i]);
- }
- return rval;
- },
- /** @id MochiKit.Base.keyComparator */
- keyComparator: function (key/* ... */) {
- // fast-path for single key comparisons
- var m = MochiKit.Base;
- var compare = m.compare;
- if (arguments.length == 1) {
- return function (a, b) {
- return compare(a[key], b[key]);
- };
- }
- var compareKeys = m.extend(null, arguments);
- return function (a, b) {
- var rval = 0;
- // keep comparing until something is inequal or we run out of
- // keys to compare
- for (var i = 0; (rval === 0) && (i < compareKeys.length); i++) {
- var key = compareKeys[i];
- rval = compare(a[key], b[key]);
- }
- return rval;
- };
- },
- /** @id MochiKit.Base.reverseKeyComparator */
- reverseKeyComparator: function (key) {
- var comparator = MochiKit.Base.keyComparator.apply(this, arguments);
- return function (a, b) {
- return comparator(b, a);
- };
- },
- /** @id MochiKit.Base.partial */
- partial: function (func) {
- var m = MochiKit.Base;
- return m.bind.apply(this, m.extend([func, undefined], arguments, 1));
- },
-
- /** @id MochiKit.Base.listMinMax */
- listMinMax: function (which, lst) {
- if (lst.length === 0) {
- return null;
- }
- var cur = lst[0];
- var compare = MochiKit.Base.compare;
- for (var i = 1; i < lst.length; i++) {
- var o = lst[i];
- if (compare(o, cur) == which) {
- cur = o;
- }
- }
- return cur;
- },
- /** @id MochiKit.Base.objMax */
- objMax: function (/* obj... */) {
- return MochiKit.Base.listMinMax(1, arguments);
- },
-
- /** @id MochiKit.Base.objMin */
- objMin: function (/* obj... */) {
- return MochiKit.Base.listMinMax(-1, arguments);
- },
- /** @id MochiKit.Base.findIdentical */
- findIdentical: function (lst, value, start/* = 0 */, /* optional */end) {
- if (typeof(end) == "undefined" || end === null) {
- end = lst.length;
- }
- if (typeof(start) == "undefined" || start === null) {
- start = 0;
- }
- for (var i = start; i < end; i++) {
- if (lst[i] === value) {
- return i;
- }
- }
- return -1;
- },
- /** @id MochiKit.Base.mean */
- mean: function(/* lst... */) {
- /* http://www.nist.gov/dads/HTML/mean.html */
- var sum = 0;
- var m = MochiKit.Base;
- var args = m.extend(null, arguments);
- var count = args.length;
- while (args.length) {
- var o = args.shift();
- if (o && typeof(o) == "object" && typeof(o.length) == "number") {
- count += o.length - 1;
- for (var i = o.length - 1; i >= 0; i--) {
- sum += o[i];
- }
- } else {
- sum += o;
- }
- }
- if (count <= 0) {
- throw new TypeError('mean() requires at least one argument');
- }
- return sum/count;
- },
-
- /** @id MochiKit.Base.median */
- median: function(/* lst... */) {
- /* http://www.nist.gov/dads/HTML/median.html */
- var data = MochiKit.Base.flattenArguments(arguments);
- if (data.length === 0) {
- throw new TypeError('median() requires at least one argument');
- }
- data.sort(compare);
- if (data.length % 2 == 0) {
- var upper = data.length / 2;
- return (data[upper] + data[upper - 1]) / 2;
- } else {
- return data[(data.length - 1) / 2];
- }
- },
- /** @id MochiKit.Base.findValue */
- findValue: function (lst, value, start/* = 0 */, /* optional */end) {
- if (typeof(end) == "undefined" || end === null) {
- end = lst.length;
- }
- if (typeof(start) == "undefined" || start === null) {
- start = 0;
- }
- var cmp = MochiKit.Base.compare;
- for (var i = start; i < end; i++) {
- if (cmp(lst[i], value) === 0) {
- return i;
- }
- }
- return -1;
- },
-
- /** @id MochiKit.Base.nodeWalk */
- nodeWalk: function (node, visitor) {
- var nodes = [node];
- var extend = MochiKit.Base.extend;
- while (nodes.length) {
- var res = visitor(nodes.shift());
- if (res) {
- extend(nodes, res);
- }
- }
- },
-
- /** @id MochiKit.Base.nameFunctions */
- nameFunctions: function (namespace) {
- var base = namespace.NAME;
- if (typeof(base) == 'undefined') {
- base = '';
- } else {
- base = base + '.';
- }
- for (var name in namespace) {
- var o = namespace[name];
- if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') {
- try {
- o.NAME = base + name;
- } catch (e) {
- // pass
- }
- }
- }
- },
- /** @id MochiKit.Base.queryString */
- queryString: function (names, values) {
- // check to see if names is a string or a DOM element, and if
- // MochiKit.DOM is available. If so, drop it like it's a form
- // Ugliest conditional in MochiKit? Probably!
- if (typeof(MochiKit.DOM) != "undefined" && arguments.length == 1
- && (typeof(names) == "string" || (
- typeof(names.nodeType) != "undefined" && names.nodeType > 0
- ))
- ) {
- var kv = MochiKit.DOM.formContents(names);
- names = kv[0];
- values = kv[1];
- } else if (arguments.length == 1) {
- var o = names;
- names = [];
- values = [];
- for (var k in o) {
- var v = o[k];
- if (typeof(v) == "function") {
- continue;
- } else if (typeof(v) != "string" &&
- typeof(v.length) == "number") {
- for (var i = 0; i < v.length; i++) {
- names.push(k);
- values.push(v[i]);
- }
- } else {
- names.push(k);
- values.push(v);
- }
- }
- }
- var rval = [];
- var len = Math.min(names.length, values.length);
- var urlEncode = MochiKit.Base.urlEncode;
- for (var i = 0; i < len; i++) {
- v = values[i];
- if (typeof(v) != 'undefined' && v !== null) {
- rval.push(urlEncode(names[i]) + "=" + urlEncode(v));
- }
- }
- return rval.join("&");
- },
- /** @id MochiKit.Base.parseQueryString */
- parseQueryString: function (encodedString, useArrays) {
- // strip a leading '?' from the encoded string
- var qstr = (encodedString[0] == "?") ? encodedString.substring(1) :
- encodedString;
- var pairs = qstr.replace(/\+/g, "%20").split(/(\&\;|\&\#38\;|\&|\&)/);
- var o = {};
- var decode;
- if (typeof(decodeURIComponent) != "undefined") {
- decode = decodeURIComponent;
- } else {
- decode = unescape;
- }
- if (useArrays) {
- for (var i = 0; i < pairs.length; i++) {
- var pair = pairs[i].split("=");
- if (pair.length !== 2) {
- continue;
- }
- var name = decode(pair[0]);
- var arr = o[name];
- if (!(arr instanceof Array)) {
- arr = [];
- o[name] = arr;
- }
- arr.push(decode(pair[1]));
- }
- } else {
- for (i = 0; i < pairs.length; i++) {
- pair = pairs[i].split("=");
- if (pair.length !== 2) {
- continue;
- }
- o[decode(pair[0])] = decode(pair[1]);
- }
- }
- return o;
- }
- });
-
- /** @id MochiKit.Base.AdapterRegistry */
- MochiKit.Base.AdapterRegistry = function () {
- this.pairs = [];
- };
- MochiKit.Base.AdapterRegistry.prototype = {
- /** @id MochiKit.Base.AdapterRegistry.prototype.register */
- register: function (name, check, wrap, /* optional */ override) {
- if (override) {
- this.pairs.unshift([name, check, wrap]);
- } else {
- this.pairs.push([name, check, wrap]);
- }
- },
- /** @id MochiKit.Base.AdapterRegistry.prototype.match */
- match: function (/* ... */) {
- for (var i = 0; i < this.pairs.length; i++) {
- var pair = this.pairs[i];
- if (pair[1].apply(this, arguments)) {
- return pair[2].apply(this, arguments);
- }
- }
- throw MochiKit.Base.NotFound;
- },
- /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */
- unregister: function (name) {
- for (var i = 0; i < this.pairs.length; i++) {
- var pair = this.pairs[i];
- if (pair[0] == name) {
- this.pairs.splice(i, 1);
- return true;
- }
- }
- return false;
- }
- };
- MochiKit.Base.EXPORT = [
- "flattenArray",
- "noop",
- "camelize",
- "counter",
- "clone",
- "extend",
- "update",
- "updatetree",
- "setdefault",
- "keys",
- "values",
- "items",
- "NamedError",
- "operator",
- "forwardCall",
- "itemgetter",
- "typeMatcher",
- "isCallable",
- "isUndefined",
- "isUndefinedOrNull",
- "isNull",
- "isEmpty",
- "isNotEmpty",
- "isArrayLike",
- "isDateLike",
- "xmap",
- "map",
- "xfilter",
- "filter",
- "methodcaller",
- "compose",
- "bind",
- "bindMethods",
- "NotFound",
- "AdapterRegistry",
- "registerComparator",
- "compare",
- "registerRepr",
- "repr",
- "objEqual",
- "arrayEqual",
- "concat",
- "keyComparator",
- "reverseKeyComparator",
- "partial",
- "merge",
- "listMinMax",
- "listMax",
- "listMin",
- "objMax",
- "objMin",
- "nodeWalk",
- "zip",
- "urlEncode",
- "queryString",
- "serializeJSON",
- "registerJSON",
- "evalJSON",
- "parseQueryString",
- "findValue",
- "findIdentical",
- "flattenArguments",
- "method",
- "average",
- "mean",
- "median"
- ];
- MochiKit.Base.EXPORT_OK = [
- "nameFunctions",
- "comparatorRegistry",
- "reprRegistry",
- "jsonRegistry",
- "compareDateLike",
- "compareArrayLike",
- "reprArrayLike",
- "reprString",
- "reprNumber"
- ];
- MochiKit.Base._exportSymbols = function (globals, module) {
- if (!MochiKit.__export__) {
- return;
- }
- var all = module.EXPORT_TAGS[":all"];
- for (var i = 0; i < all.length; i++) {
- globals[all[i]] = module[all[i]];
- }
- };
- MochiKit.Base.__new__ = function () {
- // A singleton raised when no suitable adapter is found
- var m = this;
- // convenience
- /** @id MochiKit.Base.noop */
- m.noop = m.operator.identity;
-
- // Backwards compat
- m.forward = m.forwardCall;
- m.find = m.findValue;
- if (typeof(encodeURIComponent) != "undefined") {
- /** @id MochiKit.Base.urlEncode */
- m.urlEncode = function (unencoded) {
- return encodeURIComponent(unencoded).replace(/\'/g, '%27');
- };
- } else {
- m.urlEncode = function (unencoded) {
- return escape(unencoded
- ).replace(/\+/g, '%2B'
- ).replace(/\"/g,'%22'
- ).rval.replace(/\'/g, '%27');
- };
- }
- /** @id MochiKit.Base.NamedError */
- m.NamedError = function (name) {
- this.message = name;
- this.name = name;
- };
- m.NamedError.prototype = new Error();
- m.update(m.NamedError.prototype, {
- repr: function () {
- if (this.message && this.message != this.name) {
- return this.name + "(" + m.repr(this.message) + ")";
- } else {
- return this.name + "()";
- }
- },
- toString: m.forwardCall("repr")
- });
- /** @id MochiKit.Base.NotFound */
- m.NotFound = new m.NamedError("MochiKit.Base.NotFound");
- /** @id MochiKit.Base.listMax */
- m.listMax = m.partial(m.listMinMax, 1);
- /** @id MochiKit.Base.listMin */
- m.listMin = m.partial(m.listMinMax, -1);
- /** @id MochiKit.Base.isCallable */
- m.isCallable = m.typeMatcher('function');
- /** @id MochiKit.Base.isUndefined */
- m.isUndefined = m.typeMatcher('undefined');
- /** @id MochiKit.Base.merge */
- m.merge = m.partial(m.update, null);
- /** @id MochiKit.Base.zip */
- m.zip = m.partial(m.map, null);
- /** @id MochiKit.Base.average */
- m.average = m.mean;
- /** @id MochiKit.Base.comparatorRegistry */
- m.comparatorRegistry = new m.AdapterRegistry();
- m.registerComparator("dateLike", m.isDateLike, m.compareDateLike);
- m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike);
- /** @id MochiKit.Base.reprRegistry */
- m.reprRegistry = new m.AdapterRegistry();
- m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike);
- m.registerRepr("string", m.typeMatcher("string"), m.reprString);
- m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber);
- /** @id MochiKit.Base.jsonRegistry */
- m.jsonRegistry = new m.AdapterRegistry();
- var all = m.concat(m.EXPORT, m.EXPORT_OK);
- m.EXPORT_TAGS = {
- ":common": m.concat(m.EXPORT_OK),
- ":all": all
- };
- m.nameFunctions(this);
- };
- MochiKit.Base.__new__();
- //
- // XXX: Internet Explorer blows
- //
- if (MochiKit.__export__) {
- compare = MochiKit.Base.compare;
- compose = MochiKit.Base.compose;
- serializeJSON = MochiKit.Base.serializeJSON;
- }
- MochiKit.Base._exportSymbols(this, MochiKit.Base);
|