ende 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/component.json +1 -1
  3. data/lib/assets/javascripts/aura/extensions/devise.js.coffee +7 -4
  4. data/lib/assets/javascripts/aura/extensions/routes.js.coffee +16 -8
  5. data/lib/assets/javascripts/aura/extensions/widget/lifecycleable.js.coffee +10 -5
  6. data/lib/assets/javascripts/widgets/authenticator/main.js.coffee +4 -8
  7. data/lib/assets/javascripts/widgets/authenticator/presenter.js.coffee +4 -4
  8. data/lib/assets/javascripts/widgets/authenticator/states/default.html +1 -1
  9. data/lib/assets/javascripts/widgets/tray/main.js.coffee +26 -0
  10. data/lib/ende/version.rb +1 -1
  11. data/lib/tasks/component.thor +1 -1
  12. data/vendor/assets/javascripts/ende/build.js +10008 -8202
  13. data/vendor/components/KapIT-observe-utils/component.json +16 -0
  14. data/vendor/components/KapIT-observe-utils/lib/observe-utils.js +780 -0
  15. data/vendor/components/chaijs-assertion-error/component.json +18 -0
  16. data/vendor/components/chaijs-assertion-error/index.js +110 -0
  17. data/vendor/components/chaijs-chai/component.json +47 -0
  18. data/vendor/components/chaijs-chai/index.js +1 -0
  19. data/vendor/components/chaijs-chai/lib/chai/assertion.js +130 -0
  20. data/vendor/components/chaijs-chai/lib/chai/core/assertions.js +1270 -0
  21. data/vendor/components/chaijs-chai/lib/chai/interface/assert.js +1080 -0
  22. data/vendor/components/chaijs-chai/lib/chai/interface/expect.js +12 -0
  23. data/vendor/components/chaijs-chai/lib/chai/interface/should.js +76 -0
  24. data/vendor/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +94 -0
  25. data/vendor/components/chaijs-chai/lib/chai/utils/addMethod.js +37 -0
  26. data/vendor/components/chaijs-chai/lib/chai/utils/addProperty.js +40 -0
  27. data/vendor/components/chaijs-chai/lib/chai/utils/flag.js +32 -0
  28. data/vendor/components/chaijs-chai/lib/chai/utils/getActual.js +19 -0
  29. data/vendor/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +25 -0
  30. data/vendor/components/chaijs-chai/lib/chai/utils/getMessage.js +49 -0
  31. data/vendor/components/chaijs-chai/lib/chai/utils/getName.js +20 -0
  32. data/vendor/components/chaijs-chai/lib/chai/utils/getPathValue.js +102 -0
  33. data/vendor/components/chaijs-chai/lib/chai/utils/getProperties.js +35 -0
  34. data/vendor/components/chaijs-chai/lib/chai/utils/index.js +108 -0
  35. data/vendor/components/chaijs-chai/lib/chai/utils/inspect.js +320 -0
  36. data/vendor/components/chaijs-chai/lib/chai/utils/objDisplay.js +48 -0
  37. data/vendor/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +51 -0
  38. data/vendor/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +54 -0
  39. data/vendor/components/chaijs-chai/lib/chai/utils/test.js +26 -0
  40. data/vendor/components/chaijs-chai/lib/chai/utils/transferFlags.js +44 -0
  41. data/vendor/components/chaijs-chai/lib/chai/utils/type.js +45 -0
  42. data/vendor/components/chaijs-chai/lib/chai.js +80 -0
  43. data/vendor/components/chaijs-deep-eql/component.json +18 -0
  44. data/vendor/components/chaijs-deep-eql/lib/eql.js +257 -0
  45. data/vendor/components/chaijs-type-detect/component.json +16 -0
  46. data/vendor/components/chaijs-type-detect/lib/type.js +142 -0
  47. data/vendor/components/component-bind/component.json +14 -0
  48. data/vendor/components/component-bind/index.js +24 -0
  49. data/vendor/components/component-delegate/component.json +19 -0
  50. data/vendor/components/component-delegate/index.js +42 -0
  51. data/vendor/components/component-event/component.json +13 -0
  52. data/vendor/components/component-event/index.js +40 -0
  53. data/vendor/components/component-jquery/component.json +14 -0
  54. data/vendor/components/component-jquery/index.js +9601 -0
  55. data/vendor/components/component-link-delegate/component.json +23 -0
  56. data/vendor/components/component-link-delegate/index.js +60 -0
  57. data/vendor/components/component-matches-selector/component.json +20 -0
  58. data/vendor/components/component-matches-selector/index.js +45 -0
  59. data/vendor/components/component-query/component.json +21 -0
  60. data/vendor/components/component-query/index.js +21 -0
  61. data/vendor/components/component-type/component.json +18 -0
  62. data/vendor/components/component-type/index.js +32 -0
  63. data/vendor/components/component-url/component.json +17 -0
  64. data/vendor/components/component-url/index.js +63 -0
  65. data/vendor/components/components-modernizr/component.json +18 -0
  66. data/vendor/components/components-modernizr/modernizr.js +1393 -0
  67. data/vendor/components/discore-closest/component.json +14 -0
  68. data/vendor/components/discore-closest/index.js +18 -0
  69. data/vendor/components/indefinido-advisable/component.json +21 -0
  70. data/vendor/components/indefinido-advisable/index.js +1 -0
  71. data/vendor/components/indefinido-advisable/lib/advisable.js +60 -0
  72. data/vendor/components/indefinido-indemma/component.json +40 -0
  73. data/vendor/components/indefinido-indemma/index.js +1 -0
  74. data/vendor/components/indefinido-indemma/lib/extensions/rivets.js +23 -0
  75. data/vendor/components/indefinido-indemma/lib/record/associable.js +217 -0
  76. data/vendor/components/indefinido-indemma/lib/record/maid.js +24 -0
  77. data/vendor/components/indefinido-indemma/lib/record/resource.js +104 -0
  78. data/vendor/components/indefinido-indemma/lib/record/rest.js +36 -0
  79. data/vendor/components/indefinido-indemma/lib/record/restfulable.js +326 -0
  80. data/vendor/components/indefinido-indemma/lib/record/scopable.js +279 -0
  81. data/vendor/components/indefinido-indemma/lib/record/translationable.js +19 -0
  82. data/vendor/components/indefinido-indemma/lib/record/validatable.js +216 -0
  83. data/vendor/components/indefinido-indemma/lib/record/validations/associated.js +30 -0
  84. data/vendor/components/indefinido-indemma/lib/record/validations/confirmation.js +19 -0
  85. data/vendor/components/indefinido-indemma/lib/record/validations/cpf.js +60 -0
  86. data/vendor/components/indefinido-indemma/lib/record/validations/presence.js +19 -0
  87. data/vendor/components/indefinido-indemma/lib/record/validations/remote.js +71 -0
  88. data/vendor/components/indefinido-indemma/lib/record.js +167 -0
  89. data/vendor/components/indefinido-indemma/vendor/sinon.js +4290 -0
  90. data/vendor/components/indefinido-indemma/vendor/stampit.js +392 -0
  91. data/vendor/components/indefinido-observable/component.json +25 -0
  92. data/vendor/components/indefinido-observable/components/cjohansen-sinon/sinon.js +4290 -0
  93. data/vendor/components/indefinido-observable/index.js +1 -0
  94. data/vendor/components/indefinido-observable/lib/adapters/rivets.js +26 -0
  95. data/vendor/components/indefinido-observable/lib/observable.js +320 -0
  96. data/vendor/components/indefinido-observable/vendor/shims/accessors-legacy.js +92 -0
  97. data/vendor/components/indefinido-observable/vendor/shims/accessors.js +173 -0
  98. data/vendor/components/indefinido-observable/vendor/shims/array.indexOf.js +8 -0
  99. data/vendor/components/indefinido-observable/vendor/shims/object.create.js +77 -0
  100. data/vendor/components/mikeric-rivets/component.json +15 -0
  101. data/vendor/components/mikeric-rivets/dist/rivets.js +1239 -0
  102. data/vendor/components/paulmillr-es6-shim/component.json +17 -0
  103. data/vendor/components/paulmillr-es6-shim/es6-shim.js +985 -0
  104. data/vendor/components/pluma-assimilate/component.json +25 -0
  105. data/vendor/components/pluma-assimilate/dist/assimilate.js +87 -0
  106. data/vendor/components/segmentio-extend/component.json +13 -0
  107. data/vendor/components/segmentio-extend/index.js +15 -0
  108. metadata +98 -2
@@ -0,0 +1 @@
1
+ module.exports = require('./lib/observable');
@@ -0,0 +1,26 @@
1
+ exports.adapter = {
2
+ subscribe: function(record, attribute_path, callback) {
3
+ if (record == null) {
4
+ throw new TypeError('observable.adapters.rivets.subscribe: No record provided for subscription');
5
+ }
6
+ return record.subscribe(attribute_path, callback);
7
+ },
8
+ unsubscribe: function(record, attribute_path, callback) {
9
+ if (record == null) {
10
+ throw new TypeError('observable.adapters.rivets.unsubscribe: No record provided for subscription');
11
+ }
12
+ return record.unsubscribe(attribute_path, callback);
13
+ },
14
+ read: function(record, attribute_path) {
15
+ if (record == null) {
16
+ throw new TypeError('observable.adapters.rivets.read: No record provided for subscription');
17
+ }
18
+ return record[attribute_path];
19
+ },
20
+ publish: function(record, attribute_path, value) {
21
+ if (record == null) {
22
+ throw new TypeError('observable.adapters.rivets.publish: No record provided for subscription');
23
+ }
24
+ return record[attribute_path] = value;
25
+ }
26
+ };
@@ -0,0 +1,320 @@
1
+ // TODO Better keypath support
2
+
3
+ // Shim older browsers
4
+ if (!Object.create ) require('../vendor/shims/object.create');
5
+ if (!Array.prototype.indexOf) require('../vendor/shims/array.indexOf');
6
+
7
+ // Object.defineProperty (for ie5+)
8
+ if (typeof require != 'undefined') {
9
+ require('../vendor/shims/accessors.js');
10
+
11
+ // __lookup*__ and __define*__ for browsers with defineProperty support
12
+ // TODO Figure out why gives an infinity loop
13
+ require('../vendor/shims/accessors-legacy.js');
14
+ }
15
+
16
+ // Require Dependencies
17
+ if (!window['jQuery']) jQuery = $ = require('jquery');
18
+
19
+ // Observable Implementation
20
+ var observable, requiresDomElement, check, lookup, mixin, generator, mutations;
21
+
22
+ // Support objects
23
+
24
+ // TODO implement Object.getOwnPropertyDescriptor
25
+ lookup = {
26
+ setter: Object.prototype.__lookupSetter__ || function (property) {
27
+ return this.observed && this.observed[property + '_setter'];
28
+ },
29
+ getter: Object.prototype.__lookupGetter__ || function (property) {
30
+ var default_getter;
31
+ return this.observed && this.observed[property + '_getter'] || (
32
+ (default_getter = $.proxy(lookup.default_getter, this, property)) &&
33
+ (default_getter.is_default = true) &&
34
+ (default_getter)
35
+ );
36
+ },
37
+ types: {
38
+ 'undefined': undefined,
39
+ 'null': null,
40
+ 'true': true,
41
+ 'false': false,
42
+ 'NaN': NaN
43
+ },
44
+ // overrides: [Object.prototype.toString, String.prototype.toString, Array.prototype.toString, Number.prototype.toString],
45
+ basic_types: [undefined, null],
46
+ default_getter: function (property) {
47
+ var possible_value = this[property];
48
+
49
+ // Getter is the toString property of object
50
+ if (possible_value && possible_value.hasOwnProperty('toString')) {
51
+
52
+ if (possible_value.toString.is_default) return this.observed[property];
53
+
54
+ return possible_value.toString.call(this);
55
+
56
+ } else if (possible_value in lookup.types) {
57
+
58
+ return lookup.types[possible_value];
59
+
60
+ } else return possible_value;
61
+ }
62
+ };
63
+
64
+
65
+ // Core Implementation
66
+
67
+ requiresDomElement = Object.defineProperty['requiresDomElement'];
68
+
69
+ mixin = {
70
+ subscribe: function observable_subscribe (keypath, callback) {
71
+ if (keypath == 'observed') throw new TypeError('observable.subscribe: cannot observe reserved property observed');
72
+ if ($.isArray(this[keypath])) generator.mutations.call(this, keypath);
73
+ generator.observe.call(this, keypath, callback);
74
+ return true;
75
+ },
76
+ unsubscribe: function (object, keypath, callback) {
77
+ console.error("observable.unsubscribe not implemented yet.");
78
+ console.log(object, keypath, callback);
79
+ },
80
+ publish: function observable_publish (keypath, value) {
81
+ // TODO actually call callbacks
82
+ return this[keypath] = value;
83
+ }
84
+ };
85
+
86
+
87
+ if (requiresDomElement) {
88
+
89
+ observable = function (object) {
90
+
91
+ // observable() or observable(object)
92
+ if (this.document && this.location) {
93
+ if (!object) {
94
+ object = {};
95
+ }
96
+ // observable.call(...)
97
+ } else {
98
+ // observable.call(param, param)
99
+ if (object) {
100
+ throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');
101
+ // observable.call(object)
102
+ } else {
103
+ object = this;
104
+ }
105
+ }
106
+
107
+ if (!jQuery.isReady) throw new Error('observable.call: For compatibility reasons, observable can only be called when dom is loaded.');
108
+ var fix = document.createElement('fix');
109
+
110
+ if (!jQuery.isReady) $(function () {document.body.appendChild(fix);});
111
+ else document.body.appendChild(fix);
112
+
113
+ if (!object.observed) generator.observable_for(fix);
114
+
115
+ return $.extend(fix, object, mixin);
116
+ };
117
+
118
+ var ignores = document.createElement('fix'), fix_ignores = [], property;
119
+
120
+ for (property in ignores) {
121
+ fix_ignores.push(property);
122
+ }
123
+
124
+ observable.ignores = fix_ignores;
125
+
126
+ } else {
127
+
128
+ observable = function (object) {
129
+ // observable() or observable(object)
130
+ if (this === window) {
131
+ if (!object) {
132
+ object = {};
133
+ }
134
+ // observable.call(...)
135
+ } else if (this !== window) {
136
+ // observable.call(param, param)
137
+ if (object) {
138
+ throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');
139
+ // observable.call(object)
140
+ } else {
141
+ object = this;
142
+ }
143
+ }
144
+
145
+ if (!object.observed) generator.observable_for(object);
146
+
147
+ return $.extend(object, mixin);
148
+ };
149
+
150
+ observable.ignores = [];
151
+ }
152
+
153
+
154
+ observable.unobserve = function (object) {
155
+ var property;
156
+
157
+ for (property in mixin) {
158
+ delete object[property];
159
+ }
160
+
161
+ delete object.observed;
162
+ return true;
163
+ };
164
+
165
+ check = function (keypath, value) {
166
+ this.observed[keypath] = value;
167
+ return true;
168
+ };
169
+
170
+ generator = {
171
+ observe: function(keypath, callback) {
172
+ return Object.defineProperty(this, keypath, {
173
+ get: generator.getter.call(this, keypath),
174
+ set: generator.setter.call(this, keypath, callback),
175
+ enumerable: true
176
+ });
177
+ },
178
+
179
+ observable_for: function (object) {
180
+ return Object.defineProperty(object, 'observed', {
181
+ configurable: true,
182
+ enumerable: false,
183
+ value: {}
184
+ });
185
+ },
186
+
187
+ // TODO improve readability
188
+ // TODO implement linked list
189
+ setter: function subscribed_setter (keypath, callback) {
190
+ var setter = lookup.setter.call(this, keypath), current, getter, old_setter;
191
+
192
+ // Set value
193
+ this.observed[keypath] = lookup.getter.call(this, keypath) && lookup.getter.call(this, keypath)() || this[keypath];
194
+
195
+ // First time subscribing
196
+ if (!setter) {
197
+ setter = function setter (value) {
198
+ check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);
199
+ };
200
+
201
+ // First time subscribing but does not have callback_thread associated
202
+ } else if (!setter.callback_thread) {
203
+ old_setter = setter;
204
+ setter = function setter (value) {
205
+ check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);
206
+ };
207
+
208
+ setter.callback_thread = old_setter;
209
+ }
210
+
211
+ current = setter.callback_thread || $.noop;
212
+
213
+ setter.callback_thread = function thread (value) {
214
+ current.call(this, value) !== false && callback.call(this, value);
215
+ };
216
+
217
+ // TODO better implementation of loookup setter / lookup getter on accessors shim
218
+ if (requiresDomElement) this.observed[keypath + '_setter'] = setter;
219
+
220
+ return setter;
221
+ },
222
+ getter: function subscribed_getter (keypath) {
223
+ var object = this, getter;
224
+
225
+ getter = lookup.getter.call(this, keypath) || function root_getter () {
226
+ return object.observed[keypath];
227
+ };
228
+
229
+ // TODO better implementation of loookup setter / lookup getter on accessors shim
230
+ if (requiresDomElement) this.observed[keypath + '_getter'] = getter;
231
+
232
+ return getter;
233
+ },
234
+ mutations: function(keypath) {
235
+ var setter = lookup.setter.call(this, keypath),
236
+ array = this[keypath];
237
+
238
+ // First time subscribing, and it is an array
239
+ if (!setter) {
240
+ // TODO use this.subscribe instead of generator.observe.call
241
+ generator.observe.call(this, keypath, function(new_array) {
242
+ var i, type, j;
243
+
244
+ // Avoid non push operations!
245
+ // TODO remove jquery dependency
246
+ if ($.type(new_array) !== 'array') return;
247
+
248
+ // Skip this if it is not the first time
249
+ if (new_array.object === array.object && new_array.thread === array.thread) return;
250
+ i = new_array.length;
251
+ j = new_array.length;
252
+
253
+ new_array.thread = array.thread;
254
+ new_array.object = array.object;
255
+ new_array.key = keypath;
256
+
257
+ while (i--) {
258
+ // TODO remove jquery dependency
259
+ type = $.type(arguments[i]);
260
+ if (!new_array[i].observed
261
+ && (type != 'object' || type != 'array')) {
262
+ new_array[i] = observable(new_array[i]);
263
+ }
264
+ }
265
+
266
+ new_array.length = j;
267
+
268
+ // Update internal property value
269
+ $.extend(new_array, mutations.overrides);
270
+ });
271
+
272
+ setter = lookup.setter.call(this, keypath);
273
+ }
274
+
275
+ // TODO Transform this code to define property
276
+ array.thread = setter.callback_thread;
277
+ array.object = this;
278
+ array.key = keypath;
279
+
280
+ // Override default array methods
281
+ $.extend(array, mutations.overrides);
282
+
283
+ if (!this.observed.mutate) this.observed.mutate = mutations.mutate;
284
+ }
285
+ };
286
+
287
+ mutations = {
288
+ mutate: function(thread, method, array) {
289
+ array.method = method;
290
+ thread.call(this, array);
291
+ this.publish(array.key, array); // TODO ver se é uma boa
292
+ delete array.method;
293
+ },
294
+ overrides: {
295
+ push: function() {
296
+ var i = arguments.length, operation;
297
+
298
+ while (i--) {
299
+ !arguments[i].observed && $.type(arguments[i]) == 'object' && (arguments[i] = observable(arguments[i]));
300
+ }
301
+
302
+ operation = Array.prototype.push.apply(this, arguments); // TODO Convert arguments for real array
303
+ this.object.observed.mutate.call(this.object, this.thread, 'push', this);
304
+ return operation;
305
+ }
306
+ }
307
+ };
308
+
309
+ $('pop shift unshift'.split(' ')).each(function (i, method) {
310
+ mutations.overrides[method] = function () {
311
+ Array.prototype[method].apply(this, arguments);
312
+ this.object.observed.mutate.call(this.object, this.thread, method, this);
313
+ };
314
+ });
315
+
316
+ if (typeof exports != 'undefined') {
317
+ exports.mixin = observable;
318
+ } else {
319
+ window.observable = observable;
320
+ }
@@ -0,0 +1,92 @@
1
+ /*
2
+ * Xccessors Legacy: Cross-browser legacy non-standard accessors
3
+ * http://github.com/eligrey/Xccessors
4
+ *
5
+ * 2010-03-21
6
+ *
7
+ * By Elijah Grey, http://eligrey.com
8
+ *
9
+ * A shim that implements __defineGetter__, __defineSetter__, __lookupGetter__,
10
+ * and __lookupSetter__
11
+ * in browsers that have ECMAScript 5 accessor support but not the legacy methods.
12
+ *
13
+ * Public Domain.
14
+ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
15
+ */
16
+
17
+ /*global Element, Window, HTMLDocument */
18
+
19
+ /*jslint white: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true,
20
+ strict: true, newcap: true, immed: true, maxlen: 90 */
21
+
22
+ /*! @source http://purl.eligrey.com/github/Xccessors/blob/master/xccessors-legacy.js*/
23
+
24
+ "use strict";
25
+
26
+ (function () {
27
+ var
28
+ defineProp = Object.defineProperty,
29
+ getProp = Object.getOwnPropertyDescriptor,
30
+
31
+ // methods being implemented
32
+ methods = [
33
+ "__defineGetter__", "__defineSetter__", "__lookupGetter__", "__lookupSetter__"
34
+ ],
35
+
36
+ // objects to implement legacy methods onto their prototypes
37
+ // Object.prototype[method] doesn't work on everything for IE
38
+ extend = [Object, String, Array, Function, Boolean, Number,
39
+ RegExp, Date, Error],
40
+ len = extend.length,
41
+ proto = "prototype",
42
+ extendMethod = function (method, fun) {
43
+ var i = len;
44
+ if (!(method in {})) {
45
+ while (i--) {
46
+ defineProp(extend[i][proto], method, {value: fun, enumerable: false})
47
+ }
48
+ }
49
+ };
50
+
51
+ // IE8 Does not support enumerable key so we abort!
52
+ // TODO Fix this without cluttering the prototype
53
+ try {defineProp({}, 'domo', {value: true, enumerable: false})} catch (e) {return;}
54
+
55
+ // IE7 Does not have Element, Window defined, so we check here
56
+ if (typeof Element != 'undefined') extend.push(Element);
57
+ if (typeof Window != 'undefined') extend.push(Window);
58
+
59
+ // IE9 Does not have html document defined, so we check here
60
+ if (typeof HTMLDocument != 'undefined') extend.push(HTMLDocument);
61
+
62
+
63
+ if (defineProp) {
64
+ extendMethod(methods[0], function (prop, fun) { // __defineGetter__
65
+ defineProp(this, prop, { get: fun });
66
+ });
67
+
68
+ extendMethod(methods[1], function (prop, fun) { // __defineSetter__
69
+ defineProp(this, prop, { set: fun });
70
+ });
71
+ }
72
+
73
+ if (getProp && !defineProp.requiresDomElement) {
74
+ extendMethod(methods[2], function (prop) { // __lookupGetter__
75
+ var descriptor = getProp(this, prop);
76
+ if (descriptor && descriptor.get) return descriptor.get;
77
+
78
+ // look in prototype too
79
+ descriptor = getProp(this.constructor[proto], prop);
80
+ if (descriptor && descriptor.get) return descriptor.get;
81
+ });
82
+
83
+ extendMethod(methods[3], function (prop) { // __lookupSetter__
84
+ var descriptor = getProp(this, prop);
85
+ if (descriptor && descriptor.set) return descriptor.set;
86
+
87
+ // look in prototype too
88
+ descriptor = getProp(this.constructor[proto], prop);
89
+ if (descriptor && descriptor.set) return descriptor.set;
90
+ });
91
+ }
92
+ }());
@@ -0,0 +1,173 @@
1
+ 'use strict';
2
+
3
+ (function () {
4
+ // Cache native objects for better performacy and easy to use
5
+ // references
6
+ var ObjectProto = Object.prototype,
7
+ hasOwnProp = ObjectProto.hasOwnProperty,
8
+ getProp = Object.getOwnPropertyDescriptor,
9
+ defineProp = Object.defineProperty,
10
+ toStrings = [],
11
+ features = null,
12
+ stack = [], detach,
13
+ prototypeBase = [Object, String, Array, Function, Boolean, Number, RegExp, Date, Error];
14
+
15
+ // IE7 Does not have Element and Window defined, so only add them if
16
+ // they exists check here
17
+ if (typeof Element != 'undefined') prototypeBase.push(Element);
18
+ if (typeof Window != 'undefined') prototypeBase.push(Window);
19
+
20
+ features = {
21
+ allowsNonEnumerableProperty: function () {
22
+ var broken = false;
23
+ try {
24
+ defineProp({}, 'x', {})
25
+ } catch(e) {
26
+ broken = true;
27
+ }
28
+
29
+ return (!broken) && (!!defineProp);
30
+ },
31
+ supportsOnPropertyChangeEvent: function () {
32
+ var test = document.createElement('domo');
33
+ return 'onpropertychange' in test
34
+ }
35
+ }
36
+
37
+ if (!features.allowsNonEnumerableProperty() && features.supportsOnPropertyChangeEvent()) {
38
+
39
+ // Check if node is on document
40
+ var inDocument = function inDocument (node) {
41
+ var curr = node;
42
+ while (curr != null) {
43
+ curr = curr.parentNode;
44
+ if (curr == document) return true;
45
+ }
46
+ return false;
47
+ },
48
+
49
+ // Generate property event handler for setting some property
50
+ generate_setter = function generate_setter (object, property, descriptor) {
51
+ var setter = function object_define_property_shim_change_listener (event) {
52
+ var current_value, changed_value;
53
+ if (
54
+ // if we are setting this property
55
+ event.propertyName == property
56
+
57
+ // prevent firing setters again
58
+ // by checking callstack
59
+ && stack.indexOf(property) === -1
60
+ ) {
61
+ // Remove the event so it doesn't fire again and
62
+ // create a loop
63
+ object.detachEvent("onpropertychange", setter);
64
+
65
+ // If detaching the current setter
66
+ // just remove the event listener
67
+ if (detach) return;
68
+
69
+ // get the changed value, run it through the set function
70
+ changed_value = object[property];
71
+ descriptor.set.call(object, changed_value);
72
+
73
+ // Restore get function if it exists and there's no falsey value
74
+ if (descriptor.get && descriptor.value && descriptor.value.toString != descriptor.bound_getter) {
75
+ // TODO if (descriptor.get + '' === 'undefined') descriptor.get = ''; // Handle undefined getter
76
+ descriptor.value.toString = descriptor.bound_getter
77
+ }
78
+
79
+ // Update stored values
80
+ object[property] = descriptor.value = changed_value;
81
+
82
+ // restore the event handler
83
+ object.attachEvent("onpropertychange", setter);
84
+
85
+ // stack.pop();
86
+ return false;
87
+ }
88
+ }
89
+
90
+ return setter;
91
+ }
92
+
93
+ // Shim define property with apropriated fail cases exceptions
94
+ Object.defineProperty = function (obj, prop, descriptor) {
95
+ var fix;
96
+
97
+ if (!obj.attachEvent) throw new TypeError('Object.defineProperty: First parameter must be a dom element.');
98
+
99
+ if (!fix && !inDocument(obj)) throw new TypeError('Object.defineProperty: Dom element must be attached in document.');
100
+
101
+ if (!descriptor) throw new TypeError('Object.defineProperty (object, property, descriptor): Descriptor must be an object, was \'' + descriptor + '\'.');
102
+
103
+ if ((descriptor.get || descriptor.set) && descriptor.value) throw new TypeError('Object.defineProperty: Descriptor must have only getters and setters or value.');
104
+
105
+ // Store current value in descriptor
106
+ descriptor.value = descriptor.value || (descriptor.get && descriptor.get.call(obj)) || obj[prop];
107
+
108
+ if (descriptor.get || descriptor.set) {
109
+ // Detach old listeners if any
110
+ detach = true;
111
+ obj[prop] = 'detaching';
112
+ detach = false;
113
+
114
+ if (descriptor.get) {
115
+ descriptor.bound_getter = $.extend($.proxy(descriptor.get, obj), descriptor.get);
116
+
117
+ // We only bind the getter when we have a non falsey value
118
+ if (descriptor.value) descriptor.value.toString = descriptor.bound_getter;
119
+
120
+ // Although its not allowed for convention to have getters
121
+ // and setters with the descriptor value, here we just reuse
122
+ // the descriptor stored value
123
+ obj[prop] = descriptor.value;
124
+ }
125
+
126
+ (fix || obj).attachEvent("onpropertychange", generate_setter(obj, prop, descriptor));
127
+
128
+ } else {
129
+ obj[prop] = descriptor.value;
130
+ }
131
+
132
+ return obj;
133
+ }
134
+
135
+ // Allow others to check requirements for define property
136
+ Object.defineProperty.requiresDomElement = true
137
+ }
138
+
139
+
140
+ // Since we shimed define property, we can also shim defineProperties
141
+ if (!Object.defineProperties) {
142
+ Object.defineProperties = function (obj, props) {
143
+ for (var prop in props) {
144
+ if (hasOwnProp.call(props, prop)) {
145
+ Object.defineProperty(obj, prop, props[prop]);
146
+ }
147
+ }
148
+ };
149
+ }
150
+
151
+ /* TODO Use define Property, and only define if
152
+ non-enumerable properties are allowed
153
+
154
+ also define __defineGetter__ and __defineSetter__
155
+ if (!Object.defineProperty.requiresDomElement) {
156
+ if (!Object.prototype.__lookupGetter__) {
157
+ Object.__lookupGetter__ = function () {
158
+ console && console.log('__lookupGetter__ not implemented yet');
159
+ return null;
160
+ }
161
+ }
162
+
163
+ if (!Object.__lookupSetter__) {
164
+ Object.prototype.__lookupSetter__ = function () {
165
+ console && console.log('__lookupSetter__ not implemented yet');
166
+ return null;
167
+ }
168
+ }
169
+ }
170
+ */
171
+
172
+ })();
173
+
@@ -0,0 +1,8 @@
1
+ if (!Array.prototype.indexOf) {
2
+ Array.prototype.indexOf = function(obj, start) {
3
+ for (var i = (start || 0), j = this.length; i < j; i++) {
4
+ if (this[i] === obj) { return i; }
5
+ }
6
+ return -1;
7
+ }
8
+ }
@@ -0,0 +1,77 @@
1
+ // ES5 15.2.3.5
2
+ // http://es5.github.com/#x15.2.3.5
3
+ if (!Object.create) {
4
+
5
+ // Contributed by Brandon Benvie, October, 2012
6
+ var createEmpty;
7
+ var supportsProto = Object.prototype.__proto__ === null;
8
+ if (supportsProto || typeof document == 'undefined') {
9
+ createEmpty = function () {
10
+ return { "__proto__": null };
11
+ };
12
+ } else {
13
+ // In old IE __proto__ can't be used to manually set `null`, nor does
14
+ // any other method exist to make an object that inherits from nothing,
15
+ // aside from Object.prototype itself. Instead, create a new global
16
+ // object and *steal* its Object.prototype and strip it bare. This is
17
+ // used as the prototype to create nullary objects.
18
+ createEmpty = function () {
19
+ var iframe = document.createElement('iframe');
20
+ var parent = document.body || document.documentElement;
21
+ iframe.style.display = 'none';
22
+ parent.appendChild(iframe);
23
+ iframe.src = 'javascript:';
24
+ var empty = iframe.contentWindow.Object.prototype;
25
+ parent.removeChild(iframe);
26
+ iframe = null;
27
+ delete empty.constructor;
28
+ delete empty.hasOwnProperty;
29
+ delete empty.propertyIsEnumerable;
30
+ delete empty.isPrototypeOf;
31
+ delete empty.toLocaleString;
32
+ delete empty.toString;
33
+ delete empty.valueOf;
34
+ empty.__proto__ = null;
35
+
36
+ function Empty() {}
37
+ Empty.prototype = empty;
38
+ // short-circuit future calls
39
+ createEmpty = function () {
40
+ return new Empty();
41
+ };
42
+ return new Empty();
43
+ };
44
+ }
45
+
46
+ Object.create = function create(prototype, properties) {
47
+
48
+ var object;
49
+ function Type() {} // An empty constructor.
50
+
51
+ if (prototype === null) {
52
+ object = createEmpty();
53
+ } else {
54
+ if (typeof prototype !== "object" && typeof prototype !== "function") {
55
+ // In the native implementation `parent` can be `null`
56
+ // OR *any* `instanceof Object` (Object|Function|Array|RegExp|etc)
57
+ // Use `typeof` tho, b/c in old IE, DOM elements are not `instanceof Object`
58
+ // like they are in modern browsers. Using `Object.create` on DOM elements
59
+ // is...err...probably inappropriate, but the native version allows for it.
60
+ throw new TypeError("Object prototype may only be an Object or null"); // same msg as Chrome
61
+ }
62
+ Type.prototype = prototype;
63
+ object = new Type();
64
+ // IE has no built-in implementation of `Object.getPrototypeOf`
65
+ // neither `__proto__`, but this manually setting `__proto__` will
66
+ // guarantee that `Object.getPrototypeOf` will work as expected with
67
+ // objects created using `Object.create`
68
+ object.__proto__ = prototype;
69
+ }
70
+
71
+ if (properties !== void 0) {
72
+ Object.defineProperties(object, properties);
73
+ }
74
+
75
+ return object;
76
+ };
77
+ }