sproutcore 1.0.1009 → 1.0.1024

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/DISTRIBUTION.yml +14 -0
  2. data/Rakefile +150 -23
  3. data/VERSION.yml +4 -2
  4. data/frameworks/sproutcore/Buildfile +1 -1
  5. data/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +1 -0
  6. data/frameworks/sproutcore/frameworks/datastore/models/record.js +66 -5
  7. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +14 -0
  8. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +28 -3
  9. data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +1 -1
  10. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +22 -2
  11. data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +5 -1
  12. data/frameworks/sproutcore/frameworks/desktop/english.lproj/well.css +72 -0
  13. data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +1 -1
  14. data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +1 -1
  15. data/frameworks/sproutcore/frameworks/desktop/panes/select_button.js +33 -7
  16. data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +24 -23
  17. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_alternatingrows.js +130 -0
  18. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +9 -10
  19. data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +4 -0
  20. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +18 -9
  21. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +7 -6
  22. data/frameworks/sproutcore/frameworks/desktop/tests/views/well/ui.js +54 -0
  23. data/frameworks/sproutcore/frameworks/desktop/views/button.js +21 -9
  24. data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +4 -3
  25. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1 -1
  26. data/frameworks/sproutcore/frameworks/desktop/views/grid.js +23 -14
  27. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +2 -2
  28. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +3 -3
  29. data/frameworks/sproutcore/frameworks/desktop/views/radio.js +1 -2
  30. data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +1 -1
  31. data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
  32. data/frameworks/sproutcore/frameworks/desktop/views/slider.js +1 -1
  33. data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +1 -1
  34. data/frameworks/sproutcore/frameworks/desktop/views/well.js +80 -0
  35. data/frameworks/sproutcore/frameworks/foundation/fixtures/malformed.json +11 -0
  36. data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +1 -1
  37. data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +5 -1
  38. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +1 -1
  39. data/frameworks/sproutcore/frameworks/foundation/system/cursor.js +11 -10
  40. data/frameworks/sproutcore/frameworks/foundation/system/event.js +16 -15
  41. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +3 -3
  42. data/frameworks/sproutcore/frameworks/foundation/system/request.js +6 -5
  43. data/frameworks/sproutcore/frameworks/foundation/system/response.js +26 -8
  44. data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +2 -2
  45. data/frameworks/sproutcore/frameworks/foundation/system/timer.js +2 -2
  46. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +122 -13
  47. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +2 -3
  48. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/tag.js +9 -9
  49. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/update.js +3 -3
  50. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +27 -0
  51. data/frameworks/sproutcore/frameworks/foundation/tests/system/utils/rect.js +99 -0
  52. data/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +1 -1
  53. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +1 -1
  54. data/frameworks/sproutcore/frameworks/foundation/views/image.js +3 -1
  55. data/frameworks/sproutcore/frameworks/foundation/views/label.js +1 -1
  56. data/frameworks/sproutcore/frameworks/runtime/system/cookie.js +160 -0
  57. data/frameworks/sproutcore/frameworks/runtime/system/object.js +1 -1
  58. data/frameworks/sproutcore/frameworks/runtime/tests/system/cookie.js +163 -0
  59. data/frameworks/sproutcore/themes/standard_theme/english.lproj/pane.css +12 -2
  60. data/lib/sproutcore/rack/proxy.rb +4 -2
  61. data/sproutcore-abbot.gemspec +23 -9
  62. metadata +32 -5
  63. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/standard_fade/000000.png +0 -0
  64. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/standard_fade/ffffff.png +0 -0
@@ -166,7 +166,7 @@ SC.ListItemView = SC.View.extend(
166
166
  */
167
167
  contentIsEditable: function() {
168
168
  var content = this.get('content');
169
- return content && (content.get('isEditable')!==NO);
169
+ return content && (content.get ? content.get('isEditable')!==NO : NO);
170
170
  }.property('content').cacheable(),
171
171
 
172
172
  /**
@@ -192,7 +192,7 @@ SC.ListItemView = SC.View.extend(
192
192
  // outline level wrapper
193
193
  working = context.begin("div").addClass("sc-outline");
194
194
  if (level>=0 && indent>0) working.addStyle("left", indent*(level+1));
195
-
195
+
196
196
  // handle disclosure triangle
197
197
  value = this.get('disclosureState');
198
198
  if (value !== SC.LEAF_NODE) {
@@ -266,7 +266,7 @@ SC.MenuItemView = SC.ButtonView.extend( SC.ContentDisplay,
266
266
  className = '' ;
267
267
  } else {
268
268
  className = image ;
269
- url = sc_static('blank.gif') ;
269
+ url = SC.BLANK_IMAGE_URL;
270
270
  }
271
271
  // generate the img element...
272
272
  context.begin('img').addClass('image').addClass(className).attr('src', url).end() ;
@@ -282,7 +282,7 @@ SC.MenuItemView = SC.ButtonView.extend( SC.ContentDisplay,
282
282
  */
283
283
 
284
284
  renderLabel: function(context, label) {
285
- context.push("<span class='value'>"+label+"</span>") ;
285
+ context.push("<span class='value ellipsis'>"+label+"</span>") ;
286
286
  },
287
287
 
288
288
  /**
@@ -297,7 +297,7 @@ SC.MenuItemView = SC.ButtonView.extend( SC.ContentDisplay,
297
297
  renderBranch: function(context, hasBranch) {
298
298
 
299
299
  var a = '>' ;
300
- var url = sc_static('blank.gif') ;
300
+ var url = SC.BLANK_IMAGE_URL;
301
301
  context.push('<span class= "hasBranch">'+a+'</span>') ;
302
302
  },
303
303
 
@@ -212,7 +212,7 @@ SC.RadioView = SC.FieldView.extend(
212
212
  // get the icon from the item, if one exists...
213
213
  icon = item[3];
214
214
  if (icon) {
215
- url = (icon.indexOf('/')>=0) ? icon : static_url('blank');
215
+ url = (icon.indexOf('/')>=0) ? icon : SC.BLANK_IMAGE_URL;
216
216
  className = (url === icon) ? '' : icon ;
217
217
  icon = '<img src="%@" class="icon %@" alt="" />'.fmt(url, className);
218
218
  } else icon = '';
@@ -221,7 +221,6 @@ SC.RadioView = SC.FieldView.extend(
221
221
  disabled = (!item[2]) || (!this.get('isEnabled')) ? 'disabled="disabled" ' : '';
222
222
 
223
223
  labelText = this.escapeHTML ? SC.RenderContext.escapeHTML(item[0]) : item[0];
224
- var blankImage = static_url('blank');
225
224
 
226
225
  context.push('<label class="sc-radio-button ', selectionStateClassNames, '">');
227
226
  context.push('<input type="radio" value="', idx, '" name="', name, '" ', disabled, '/>');
@@ -526,7 +526,7 @@ SC.ScrollView = SC.View.extend(SC.Border, {
526
526
  this._scroll_wheelDeltaX += evt.wheelDeltaX;
527
527
  this._scroll_wheelDeltaY += evt.wheelDeltaY;
528
528
  this.invokeLater(this._scroll_mouseWheel, 10) ;
529
- return YES ;
529
+ return this.get('canScrollHorizontal') || this.get('canScrollVertical') ;
530
530
  },
531
531
 
532
532
  /** @private */
@@ -346,7 +346,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
346
346
  }
347
347
 
348
348
  if (icon) {
349
- url = (icon.indexOf('/')>=0) ? icon : static_url('blank');
349
+ url = (icon.indexOf('/')>=0) ? icon : SC.BLANK_IMAGE_URL;
350
350
  className = (url === icon) ? '' : icon ;
351
351
  icon = '<img src="'+url+'" alt="" class="icon '+className+'" />';
352
352
  } else {
@@ -103,7 +103,7 @@ SC.SliderView = SC.View.extend(SC.Control,
103
103
  value = Math.floor((value - min) / (max - min) * 100);
104
104
 
105
105
  if(firstTime) {
106
- var blankImage = static_url('blank');
106
+ var blankImage = SC.BLANK_IMAGE_URL;
107
107
  context.push('<span class="sc-inner">');
108
108
  context.push('<span class="sc-leftcap"></span>');
109
109
  context.push('<span class="sc-rightcap"></span>');
@@ -74,7 +74,7 @@ SC.SourceListGroupView = SC.View.extend(SC.Control, SC.CollectionGroup,
74
74
 
75
75
  render: function(context, firstTime) {
76
76
  context.push('<a href="javascript:;" class="sc-source-list-label sc-disclosure-view sc-button-view button disclosure no-disclosure">') ;
77
- context.push('<img src="%@" class="button" />'.fmt(sc_static('blank'))) ;
77
+ context.push('<img src="%@" class="button" />'.fmt(SC.BLANK_IMAGE_URL)) ;
78
78
  context.push('<span class="label"></span></a>') ;
79
79
  },
80
80
 
@@ -0,0 +1,80 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
4
+ // Portions ©2008-2009 Apple Inc. All rights reserved.
5
+ // License: Licened under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ /** @class
9
+
10
+ A WellView is a ContainerView with a border. It's useful when you want to
11
+ group a set of views. It allows you to easily switch its contents too.
12
+
13
+ It has a default contentLayout that will replace the layout of the contentView.
14
+
15
+ @extends SC.ContainerView
16
+ @since SproutCore 1.0
17
+ @test in progress
18
+ */
19
+ SC.WellView = SC.ContainerView.extend(
20
+ /** @scope SC.WellView.prototype */ {
21
+
22
+ classNames: 'sc-well-view',
23
+
24
+ /**
25
+ Layout for the content of the container view.
26
+ @property {Object}
27
+ */
28
+ contentLayout: {top:10, bottom:10, left:10, right:10},
29
+
30
+
31
+ /**
32
+ Overrides createChildViews and replaces the layout of the contentView
33
+ with the one in contentLayout.
34
+ */
35
+
36
+ createChildViews: function() {
37
+ // if contentView is defined, then create the content
38
+ var view = this.get('contentView') ;
39
+ if (view) {
40
+ view = this.contentView = this.createChildView(view) ;
41
+ view.set('layout', this.contentLayout);
42
+ this.childViews = [view] ;
43
+ }
44
+ },
45
+
46
+ /**
47
+ The render method for the WellView simply add the html necessary for
48
+ the border.
49
+
50
+ */
51
+
52
+ render: function(context, firstTime) {
53
+ sc_super();
54
+ if(firstTime){
55
+ context.push("<div class='top-left-edge'></div>",
56
+ "<div class='top-edge'></div>",
57
+ "<div class='top-right-edge'></div>",
58
+ "<div class='right-edge'></div>",
59
+ "<div class='bottom-right-edge'></div>",
60
+ "<div class='bottom-edge'></div>",
61
+ "<div class='bottom-left-edge'></div>",
62
+ "<div class='left-edge'></div>",
63
+ "<div class='content-background'></div>");
64
+ }
65
+ },
66
+
67
+ /**
68
+ Invoked whenever the content property changes. This method will simply
69
+ call replaceContent and set the contentLayout in the new contentView.
70
+
71
+ Override replaceContent to change how the view is
72
+ swapped out.
73
+ */
74
+ contentViewDidChange: function() {
75
+ var view = this.get('contentView');
76
+ view.set('layout', this.contentLayout);
77
+ this.replaceContent(view);
78
+ }.observes('contentView')
79
+
80
+ }) ;
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml">
4
+ <head>
5
+ <title>
6
+ This is not JSON
7
+ </title>
8
+ </head>
9
+ <body>
10
+ </body>
11
+ </html>
@@ -169,7 +169,7 @@ SC.Button = {
169
169
  // if there is no image element yet, create it and insert it just before
170
170
  // title.
171
171
  if (icon) {
172
- var blank = static_url('blank');
172
+ var blank = SC.BLANK_IMAGE_URL;
173
173
 
174
174
  image = '<img src="%@1" alt="" class="%@2" />' ;
175
175
  if (icon.indexOf('/') >= 0) {
@@ -143,13 +143,17 @@ SC.InlineTextFieldView = SC.TextFieldView.extend(SC.DelegateSupport,
143
143
  paneElem = pane.$()[0];
144
144
  if(this._optIsCollection && delLayout.left){
145
145
  layout.left=this._optframe.x-delLayout.left-paneElem.offsetLeft-1;
146
+ if(SC.browser.msie==7) layout.left--;
146
147
  }else{
147
148
  layout.left=this._optframe.x-paneElem.offsetLeft-1;
149
+ if(SC.browser.msie==7) layout.left--;
148
150
  }
149
151
  if(this._optIsCollection && delLayout.top){
150
152
  layout.top=this._optframe.y-delLayout.top-paneElem.offsetTop;
153
+ if(SC.browser.msie==7) layout.top=layout.top-2;
151
154
  }else{
152
- layout.top=this._optframe.y-paneElem.offsetTop;
155
+ layout.top=this._optframe.y-paneElem.offsetTop;
156
+ if(SC.browser.msie==7) layout.top=layout.top-2;
153
157
  }
154
158
 
155
159
  this.set('layout', layout);
@@ -470,7 +470,7 @@ SC.Pane = SC.View.extend( /** @scope SC.Pane.prototype */ {
470
470
  rootResponder.panes.remove(this) ;
471
471
  this.rootResponder = null ;
472
472
 
473
- // clean up some of my own properties
473
+ // clean up some of my own properties
474
474
  this.set('isPaneAttached', NO) ;
475
475
  this.parentViewDidChange() ;
476
476
  return this ;
@@ -49,8 +49,8 @@ SC.Cursor = SC.Object.extend(
49
49
  sc_super() ;
50
50
 
51
51
  // create a unique style rule and add it to the shared cursor style sheet
52
- var cursorStyle = this.get('cursorStyle') || SC.DEFAULT_CURSOR ;
53
- var ss = this.constructor.sharedStyleSheet() ;
52
+ var cursorStyle = this.get('cursorStyle') || SC.DEFAULT_CURSOR ,
53
+ ss = this.constructor.sharedStyleSheet() ;
54
54
 
55
55
  if (ss.insertRule) { // WC3
56
56
  ss.insertRule(
@@ -83,20 +83,21 @@ SC.Cursor = SC.Object.extend(
83
83
 
84
84
  /** @private */
85
85
  cursorStyleDidChange: function() {
86
- var cursorStyle = this.get('cursorStyle') || SC.DEFAULT_CURSOR ;
87
- var rule = this._rule ;
86
+ var cursorStyle, rule, selector, ss, rules, idx, len;
87
+ cursorStyle = this.get('cursorStyle') || SC.DEFAULT_CURSOR;
88
+ rule = this._rule;
88
89
  if (rule) {
89
90
  rule.style.cursor = cursorStyle ; // fast path
90
91
  return ;
91
92
  }
92
93
 
93
94
  // slow path, taken only once
94
- var selector = '.'+this.get('className') ;
95
- var ss = this.constructor.sharedStyleSheet() ;
96
- var rules = (ss.cssRules ? ss.cssRules : ss.rules) || [] ;
95
+ selector = '.'+this.get('className') ;
96
+ ss = this.constructor.sharedStyleSheet() ;
97
+ rules = (ss.cssRules ? ss.cssRules : ss.rules) || [] ;
97
98
 
98
99
  // find our rule, cache it, and update the cursor style property
99
- for (var idx=0, len = rules.length; idx<len; ++idx) {
100
+ for (idx=0, len = rules.length; idx<len; ++idx) {
100
101
  rule = rules[idx] ;
101
102
  if (rule.selectorText === selector) {
102
103
  this._rule = rule ; // cache for next time
@@ -112,12 +113,12 @@ SC.Cursor = SC.Object.extend(
112
113
 
113
114
  /** @private */
114
115
  SC.Cursor.sharedStyleSheet = function() {
115
- var ss = this._styleSheet ;
116
+ var head, ss = this._styleSheet ;
116
117
  if (!ss) {
117
118
  // create the stylesheet object the hard way (works everywhere)
118
119
  ss = document.createElement('style') ;
119
120
  ss.type = 'text/css' ;
120
- var head = document.getElementsByTagName('head')[0] ;
121
+ head = document.getElementsByTagName('head')[0] ;
121
122
  if (!head) head = document.documentElement ; // fix for Opera
122
123
  head.appendChild(ss) ;
123
124
 
@@ -32,9 +32,9 @@ SC.Event = function(originalEvent) {
32
32
  // copy properties from original event, if passed in.
33
33
  if (originalEvent) {
34
34
  this.originalEvent = originalEvent ;
35
- var props = SC.Event._props, len = props.length, idx = len ;
35
+ var props = SC.Event._props, len = props.length, idx = len , key;
36
36
  while(--idx >= 0) {
37
- var key = props[idx] ;
37
+ key = props[idx] ;
38
38
  this[key] = originalEvent[key] ;
39
39
  }
40
40
  }
@@ -207,8 +207,8 @@ SC.mixin(SC.Event, /** @scope SC.Event */ {
207
207
  // Get the handlers queue for this element/eventType. If the queue does
208
208
  // not exist yet, create it and also setup the shared listener for this
209
209
  // eventType.
210
- var events = SC.data(elem, "events") || SC.data(elem, "events", {}) ;
211
- var handlers = events[eventType];
210
+ var events = SC.data(elem, "events") || SC.data(elem, "events", {}) ,
211
+ handlers = events[eventType];
212
212
  if (!handlers) {
213
213
  handlers = events[eventType] = {} ;
214
214
  this._addEventListener(elem, eventType) ;
@@ -293,7 +293,7 @@ SC.mixin(SC.Event, /** @scope SC.Event */ {
293
293
  method = target[method] ;
294
294
  }
295
295
 
296
- delete events[SC.guidFor(method)] ;
296
+ delete handlers[SC.guidFor(method)] ;
297
297
 
298
298
  // check to see if there are handlers left on this event/eventType.
299
299
  // if not, then cleanup the handlers.
@@ -399,10 +399,11 @@ SC.mixin(SC.Event, /** @scope SC.Event */ {
399
399
  // Normalize to an array
400
400
  args = SC.A(args) ;
401
401
 
402
- var ret, fn = SC.typeOf(elem[eventType] || null) === SC.T_FUNCTION ;
402
+ var ret, fn = SC.typeOf(elem[eventType] || null) === SC.T_FUNCTION ,
403
+ event, current, onfoo;
403
404
 
404
405
  // Get the event to pass, creating a fake one if necessary
405
- var event = args[0];
406
+ event = args[0];
406
407
  if (!event || !event.preventDefault) {
407
408
  event = this.simulateEvent(elem, eventType) ;
408
409
  args.unshift(event) ;
@@ -411,7 +412,7 @@ SC.mixin(SC.Event, /** @scope SC.Event */ {
411
412
  event.type = eventType ;
412
413
 
413
414
  // Trigger the event - bubble if enabled
414
- var current = elem;
415
+ current = elem;
415
416
  do {
416
417
  ret = SC.Event.handle.apply(current, args);
417
418
  current = (current===document) ? null : (current.parentNode || document);
@@ -419,8 +420,8 @@ SC.mixin(SC.Event, /** @scope SC.Event */ {
419
420
  current = null ;
420
421
 
421
422
  // Handle triggering native .onfoo handlers
422
- var onfoo = elem["on" + eventType] ;
423
- var isClick = SC.CoreQuery.nodeName(elem, 'a') && eventType === 'click';
423
+ onfoo = elem["on" + eventType] ;
424
+ isClick = SC.CoreQuery.nodeName(elem, 'a') && eventType === 'click';
424
425
  if ((!fn || isClick) && onfoo && onfoo.apply(elem, args) === NO) ret = NO;
425
426
 
426
427
  // Trigger the native events (except for clicks on links)
@@ -459,7 +460,7 @@ SC.mixin(SC.Event, /** @scope SC.Event */ {
459
460
  if ((typeof SC === "undefined") || SC.Event.triggered) return YES ;
460
461
 
461
462
  // returned undefined or NO
462
- var val, ret, namespace, all, handlers, args;
463
+ var val, ret, namespace, all, handlers, args, key, handler, method, target;
463
464
 
464
465
  // normalize event across browsers. The new event will actually wrap the
465
466
  // real event with a normalized API.
@@ -471,16 +472,16 @@ SC.mixin(SC.Event, /** @scope SC.Event */ {
471
472
  if (!handlers) return NO ; // nothing to do
472
473
 
473
474
  // invoke all handlers
474
- for (var key in handlers ) {
475
- var handler = handlers[key];
476
- var method = handler[1] ;
475
+ for (key in handlers ) {
476
+ handler = handlers[key];
477
+ method = handler[1] ;
477
478
 
478
479
  // Pass in a reference to the handler function itself
479
480
  // So that we can later remove it
480
481
  event.handler = method;
481
482
  event.data = event.context = handler[2];
482
483
 
483
- var target = handler[0] || this ;
484
+ target = handler[0] || this ;
484
485
  ret = method.apply( target, args );
485
486
 
486
487
  if (val !== NO) val = ret;
@@ -553,7 +553,7 @@ SC.RenderContext = SC.Builder.create(/** SC.RenderContext.fn */ {
553
553
  classNames: function(classNames, cloneOnModify) {
554
554
  if (classNames === undefined) {
555
555
  if (!this._classNames && this._elem) {
556
- this._classNames = (this._elem.getAttribute('class')||'').split(' ');
556
+ this._classNames = (SC.$(this._elem).attr('class')||'').split(' ');
557
557
  }
558
558
 
559
559
  if (this._cloneClassNames) {
@@ -611,7 +611,7 @@ SC.RenderContext = SC.Builder.create(/** SC.RenderContext.fn */ {
611
611
  var classNames = this._classNames, idx;
612
612
  if (!classNames && this._elem) {
613
613
  classNames = this._classNames =
614
- (this._elem.getAttribute('class')||'').split(' ');
614
+ (SC.$(this._elem).attr('class')||'').split(' ');
615
615
  }
616
616
 
617
617
  if (classNames && (idx=classNames.indexOf(className))>=0) {
@@ -666,7 +666,7 @@ SC.RenderContext = SC.Builder.create(/** SC.RenderContext.fn */ {
666
666
  classNames = this._classNames ;
667
667
  if (!classNames && this._elem) {
668
668
  classNames = this._classNames =
669
- (this._elem.getAttribute('class')||'').split(' ');
669
+ (SC.$(this._elem).attr('class')||'').split(' ');
670
670
  }
671
671
  if (!classNames) classNames = this._classNames = [];
672
672
 
@@ -334,12 +334,13 @@ SC.Request = SC.Object.extend(SC.Copyable, SC.Freezable,
334
334
  Your notification callback should expect to receive the Response object
335
335
  as the first parameter plus any additional parameters that you pass.
336
336
 
337
+ @param {Number} status
337
338
  @param {Object} target
338
339
  @param {String|function} action
339
340
  @param {Hash} params
340
341
  @returns {SC.Request} receiver
341
342
  */
342
- notify: function(status, target, action) {
343
+ notify: function(status, target, action, params) {
343
344
 
344
345
  // normalize status
345
346
  var hasStatus = YES, params ;
@@ -369,7 +370,7 @@ SC.Request.mixin(/** @scope SC.Request */ {
369
370
  @returns {SC.Request} receiver
370
371
  */
371
372
  getUrl: function(address) {
372
- return SC.Request.create().set('address', address).set('type', 'GET');
373
+ return this.create().set('address', address).set('type', 'GET');
373
374
  },
374
375
 
375
376
  /**
@@ -380,7 +381,7 @@ SC.Request.mixin(/** @scope SC.Request */ {
380
381
  @returns {SC.Request} receiver
381
382
  */
382
383
  postUrl: function(address, body) {
383
- var req = SC.Request.create().set('address', address).set('type', 'POST');
384
+ var req = this.create().set('address', address).set('type', 'POST');
384
385
  if(body) req.set('body', body) ;
385
386
  return req ;
386
387
  },
@@ -392,7 +393,7 @@ SC.Request.mixin(/** @scope SC.Request */ {
392
393
  @returns {SC.Request} receiver
393
394
  */
394
395
  deleteUrl: function(address) {
395
- return SC.Request.create().set('address', address).set('type', 'DELETE');
396
+ return this.create().set('address', address).set('type', 'DELETE');
396
397
  },
397
398
 
398
399
  /**
@@ -403,7 +404,7 @@ SC.Request.mixin(/** @scope SC.Request */ {
403
404
  @returns {SC.Request} receiver
404
405
  */
405
406
  putUrl: function(address, body) {
406
- var req = SC.Request.create().set('address', address).set('type', 'PUT');
407
+ var req = this.create().set('address', address).set('type', 'PUT');
407
408
  if(body) req.set('body', body) ;
408
409
  return req ;
409
410
  }