steal('jquery', function ($){ var isArray = $.isArray, cleanSet = function (obj, compares){ var copy = $.extend({ } , obj); for (var prop in copy){ var compare = compares[prop] === undefined? compares["*"] : compares[prop]; if (same(copy[prop], undefined, compare)) { delete copy[prop]; } } return copy; } , propCount = function (obj){ var count = 0; for (var prop in obj)count++ ; return count; } ; $.Object = { } ; var same = $.Object.same = function (a, b, compares, aParent, bParent, deep){ var aType = typeof a, aArray = isArray(a), comparesType = typeof compares, compare; if (comparesType == 'string' || compares === null ) { compares = compareMethods[compares]; comparesType = 'function'; } if (comparesType == 'function') { return compares(a, b, aParent, bParent); } compares = compares || { } ; if (deep === -1) { return aType === 'object' || a === b; } if (aType !== typeof b || aArray !== isArray(b)) { return false ; } if (a === b) { return true ; } if (aArray) { if (_AN_Read_length('length', a) !== _AN_Read_length('length', b)) { return false ; } for (var i = 0; i < _AN_Read_length('length', a); i++ ){ compare = compares[i] === undefined? compares["*"] : compares[i]; if (!same(a[i], b[i], a, b, compare)) { return false ; } } ; return true ; } else if (aType === "object" || aType === 'function') { var bCopy = $.extend({ } , b); for (var prop in a){ compare = compares[prop] === undefined? compares["*"] : compares[prop]; if (!same(a[prop], b[prop], compare, a, b, deep === false ? -1: undefined)) { return false ; } delete bCopy[prop]; } for (prop in bCopy){ if (compares[prop] === undefined || !same(undefined, b[prop], compares[prop], a, b, deep === false ? -1: undefined)) { return false ; } } return true ; } return false ; } ; $.Object.subsets = function (checkSet, sets, compares){ var len = _AN_Read_length('length', sets), subsets = [] , checkPropCount = propCount(checkSet), setLength; for (var i = 0; i < len; i++ ){ var set = sets[i]; if ($.Object.subset(checkSet, set, compares)) { subsets.push(set); } } return subsets; } ; $.Object.subset = function (subset, set, compares){ var setPropCount = 0, compares = compares || { } ; for (var prop in set){ if (!same(subset[prop], set[prop], compares[prop], subset, set)) { return false ; } } return true ; } ; var compareMethods = { "null": function (){ return true ; } , i: function (a, b){ return ("" + a).toLowerCase() == ("" + b).toLowerCase(); } } ; return $; } );