cruyff 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/SpecRunner.html CHANGED
@@ -8,10 +8,10 @@
8
8
  <script type="text/javascript" src="spec/js_lib/jquery-1.4.4.js"></script>
9
9
  <script type="text/javascript" src="spec/js_lib/jquery.ba-bbq-1.2.1.js"></script>
10
10
  <script type="text/javascript" src="spec/js_lib/jquery.form-2.52.js"></script>
11
- <script type="text/javascript" src="spec/js_lib/rails-11.01.12.js"></script>
12
11
  <script type="text/javascript" src="spec/js_lib/jasmine-jquery-1.1.3.js"></script>
13
12
 
14
- <script type="text/javascript" src="lib/generators/templates/jquery.cruyff.js"></script>
13
+ <script type="text/javascript" src="lib/generators/cruyff/templates/rails.js"></script>
14
+ <script type="text/javascript" src="lib/generators/cruyff/templates/jquery.cruyff.js"></script>
15
15
 
16
16
  <script type="text/javascript" src="spec/SpecHelper.js"></script>
17
17
  <script type="text/javascript" src="spec/js_lib/jasmine-fixture.js"></script>
@@ -24,6 +24,7 @@
24
24
  <script type="text/javascript">
25
25
  $(function() {
26
26
  /*
27
+ //this ajax call don't works on chrome. WTF???
27
28
  $.ajax({
28
29
  url: 'spec/fixtures/view.html',
29
30
  success: function(data, status, xhr) {
@@ -1,3 +1,3 @@
1
1
  module Cruyff
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/cruyff.rb ADDED
@@ -0,0 +1,20 @@
1
+ module Jquery
2
+ module Rails
3
+ class Railtie < ::Rails::Railtie
4
+
5
+ config.before_configuration do
6
+ require "jquery-rails/assert_select_jquery" if ::Rails.env.test?
7
+
8
+ if ::Rails.root.join("public/javascripts/jquery-ui.min.js").exist?
9
+ jq_defaults = %w(jquery jquery-ui)
10
+ jq_defaults.map!{|a| a + ".min" } if ::Rails.env.production?
11
+ else
12
+ jq_defaults = ::Rails.env.production? ? %w(jquery.min) : %w(jquery)
13
+ end
14
+
15
+ config.action_view.javascript_expansions[:defaults] = jq_defaults + %w(rails)
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,61 @@
1
+ module Cruyff
2
+ module Generators
3
+ class InstallGenerator < ::Rails::Generators::Base
4
+ desc "This generator downloads and installs jQuery, jQuery-ujs HEAD, and (optionally) the newest jQuery UI"
5
+ class_option :ui, :type => :boolean, :default => false, :desc => "Include jQueryUI"
6
+ class_option :version, :type => :string, :default => "1.4.4", :desc => "Which version of jQuery to fetch"
7
+ @@default_version = "1.4.4"
8
+
9
+ def remove_prototype
10
+ %w(controls.js dragdrop.js effects.js prototype.js).each do |js|
11
+ remove_file "public/javascripts/#{js}"
12
+ end
13
+ end
14
+
15
+ def download_jquery
16
+ say_status("fetching", "jQuery (#{options.version})", :green)
17
+ get_jquery(options.version)
18
+ rescue OpenURI::HTTPError
19
+ say_status("warning", "could not find jQuery (#{options.version})", :yellow)
20
+ say_status("fetching", "jQuery (#{@@default_version})", :green)
21
+ get_jquery(@@default_version)
22
+ end
23
+
24
+ def download_jquery_ui
25
+ if options.ui?
26
+ say_status("fetching", "jQuery UI (latest 1.x release)", :green)
27
+ get "http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.js", "public/javascripts/jquery-ui.js"
28
+ get "http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js", "public/javascripts/jquery-ui.min.js"
29
+ end
30
+ end
31
+
32
+ def download_ujs_driver
33
+ say_status("fetching", "jQuery UJS Cruyff adapter (github HEAD)", :green)
34
+ get "https://github.com/andref5/cruyff/raw/master/lib/generators/cruyff/templates/rails.js", "public/javascripts/rails.js"
35
+ end
36
+
37
+ def download_cruyff
38
+ say_status("fetching", "jQuery Cruyff plugin (github HEAD)", :green)
39
+ get "https://github.com/andref5/cruyff/raw/master/lib/generators/cruyff/templates/jquery.cruyff.js", "public/javascripts/jquery.cruyff.js"
40
+ end
41
+
42
+ def download_jquery_bbq
43
+ say_status("fetching", "jQuery BBQ plugin: Back Button & Query Library (github HEAD)", :green)
44
+ get "https://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.js", "public/javascripts/jquery.ba-bbq.js"
45
+ end
46
+
47
+ def download_jquery_form
48
+ say_status("fetching", "jQuery Form plugin (github HEAD)", :green)
49
+ get "https://github.com/malsup/form/raw/master/jquery.form.js", "public/javascripts/jquery.form.js"
50
+ end
51
+
52
+ private
53
+
54
+ def get_jquery(version)
55
+ get "http://ajax.googleapis.com/ajax/libs/jquery/#{version}/jquery.js", "public/javascripts/jquery.js"
56
+ get "http://ajax.googleapis.com/ajax/libs/jquery/#{version}/jquery.min.js", "public/javascripts/jquery.min.js"
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,89 @@
1
+ (function($) {
2
+
3
+ var cruyffSettings = {
4
+ url: "",
5
+ method: "",
6
+ dataType: "",
7
+ data: "",
8
+ responseSelector: "#response",
9
+ response: [],
10
+ };
11
+
12
+ $.fn.handleRemoteCrud = function(element) {
13
+ var cs = this.cruyffSetup(element);
14
+
15
+ //call ajaxSubmit from jquery.form because provides a file upload mechanism.
16
+ element.ajaxSubmit({
17
+ url: cs.url,
18
+ type: cs.method || 'GET',
19
+ data: cs.data,
20
+ dataType: cs.dataType,
21
+ // stopping the "ajax:beforeSend" event will cancel the ajax request
22
+ beforeSend: function(xhr, settings) {
23
+ if (settings.dataType === undefined) {
24
+ xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
25
+ }
26
+ return fire(element, 'ajax:beforeSend', [xhr, settings]);
27
+ },
28
+ success: function(data, status, xhr) {
29
+ element.trigger('ajax:success', [data, status, xhr]);
30
+ cs.response.html(data);
31
+ },
32
+ complete: function(xhr, status) {
33
+ element.trigger('ajax:complete', [xhr, status]);
34
+ },
35
+ error: function(xhr, status, error) {
36
+ element.trigger('ajax:error', [xhr, status, error]);
37
+ cs.response.html(error.toString());
38
+ }
39
+ });
40
+
41
+ $.bbq.pushState("app=" + cs.url);
42
+
43
+ };
44
+
45
+ $.fn.cruyffSetup = function(element) {
46
+ var cs = cruyffSettings;
47
+
48
+ cs.response = $(cs.responseSelector);
49
+
50
+ /**
51
+ * Rails.js Code 2011-01-12
52
+ **/
53
+ cs.dataType = element.attr('data-type') || ($.ajaxSettings && $.ajaxSettings.dataType);
54
+
55
+ if (element.is('form')) {
56
+ cs.method = element.attr('method');
57
+ cs.url = element.attr('action');
58
+ cs.data = element.serializeArray();
59
+ // memoized value from clicked submit button
60
+ var button = element.data('ujs:submit-button');
61
+ if (button) {
62
+ cs.data.push(button);
63
+ element.data('ujs:submit-button', null);
64
+ }
65
+ } else {
66
+ cs.method = element.attr('data-method');
67
+ cs.url = element.attr('href');
68
+ cs.data = null;
69
+ }
70
+ /**
71
+ * End Rails.js
72
+ **/
73
+
74
+ return cs;
75
+ };
76
+
77
+ //Override rails.js handleRemote
78
+ $.fn.handleRemote = function(element) {
79
+ this.handleRemoteCrud(element);
80
+ };
81
+
82
+ //Wrapper to rails.js fire function
83
+ function fire(obj, name, data) {
84
+ $.fn.fire(obj, name, data);
85
+ }
86
+
87
+ //$.fn.cruyffUrl = $.bbq.getState("app");
88
+
89
+ })( jQuery );
@@ -7,14 +7,22 @@
7
7
 
8
8
  (function($) {
9
9
  // Triggers an event on an element and returns the event result
10
- function fire(obj, name, data) {
10
+ function fire(obj, name, data) {
11
+ this.fire(obj, name, data);
12
+ }
13
+ // create a jQuery object to call from another context
14
+ $.fn.fire = function (obj, name, data) {
11
15
  var event = new $.Event(name);
12
16
  obj.trigger(event, data);
13
17
  return event.result !== false;
14
18
  }
15
19
 
16
20
  // Submits "remote" forms and links with ajax
17
- function handleRemote(element) {
21
+ function handleRemote(element) {
22
+ $.fn.handleRemote(element);
23
+ }
24
+ // create a jQuery object to override
25
+ $.fn.handleRemote = function (element) {
18
26
  var method, url, data,
19
27
  dataType = element.attr('data-type') || ($.ajaxSettings && $.ajaxSettings.dataType);
20
28
 
@@ -126,7 +134,7 @@
126
134
  var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null;
127
135
  button.closest('form').data('ujs:submit-button', data);
128
136
  });
129
-
137
+
130
138
  $('form').live('ajax:beforeSend.rails', function(event) {
131
139
  if (this == event.target) disableFormElements($(this));
132
140
  });
@@ -135,3 +143,4 @@
135
143
  if (this == event.target) enableFormElements($(this));
136
144
  });
137
145
  })( jQuery );
146
+
data/spec/CruyffSpec.js CHANGED
@@ -6,6 +6,12 @@ describe('Cruyff',function() {
6
6
  $.jasmine.inject('<div id="response"></div>');
7
7
  });
8
8
 
9
+ it('should override rails handleRemote function',function(){
10
+ spyOn($.fn, 'handleRemoteCrud');
11
+ $.fn.handleRemote('element');
12
+ expect($.fn.handleRemoteCrud).wasCalled();
13
+ })
14
+
9
15
  describe('Setup from hyperlink', function() {
10
16
  beforeEach(function() {
11
17
  $.jasmine.inject('<a href="spec/fixtures/view.html"\
@@ -110,7 +116,7 @@ describe('Cruyff',function() {
110
116
 
111
117
  it('should render success response',function(){
112
118
  runs(function() {
113
- $.fn.handleRemoteCrud(element);
119
+ element.trigger('click');
114
120
  });
115
121
  waits(100);
116
122
  runs(function() {
@@ -121,7 +127,7 @@ describe('Cruyff',function() {
121
127
  it('should render error response',function(){
122
128
  element.attr('href', 'bad/url');
123
129
  runs(function() {
124
- $.fn.handleRemoteCrud(element);
130
+ element.trigger('click');
125
131
  });
126
132
  waits(100);
127
133
  runs(function() {
@@ -141,7 +147,7 @@ describe('Cruyff',function() {
141
147
 
142
148
  it('should bookmark',function() {
143
149
  runs(function() {
144
- $.fn.handleRemoteCrud(element);
150
+ element.trigger('click');
145
151
  });
146
152
  waits(100);
147
153
  runs(function() {
@@ -149,7 +155,7 @@ describe('Cruyff',function() {
149
155
  });
150
156
  });
151
157
 
152
- it('should load browser url',function() {
158
+ xit('should load browser url',function() {
153
159
  $.bbq.pushState('app=spec/fixtures/view.html');
154
160
  expect($.fn.cruyffUrl).toEqual('spec/fixtures/view.html');
155
161
  });
metadata CHANGED
@@ -1,40 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cruyff
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 1
9
- version: 0.0.1
4
+ prerelease:
5
+ version: 0.1.0
10
6
  platform: ruby
11
7
  authors:
12
- - Charger Tec
8
+ - Charger Tec
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-01-20 00:00:00 -02:00
13
+ date: 2011-01-21 00:00:00 -02:00
18
14
  default_executable:
19
15
  dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: jquery-rails
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 2
31
- - 6
32
- version: 0.2.6
33
- type: :runtime
34
- version_requirements: *id001
16
+ - !ruby/object:Gem::Dependency
17
+ name: jquery-rails
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 0.2.6
25
+ type: :runtime
26
+ version_requirements: *id001
35
27
  description: Cruyff is a Ajax CRUD solution for Rails applications.
36
28
  email:
37
- - DM @andrefarina
29
+ - DM @andrefarina
38
30
  executables: []
39
31
 
40
32
  extensions: []
@@ -42,27 +34,28 @@ extensions: []
42
34
  extra_rdoc_files: []
43
35
 
44
36
  files:
45
- - .gitignore
46
- - Gemfile
47
- - Rakefile
48
- - Readme.md
49
- - SpecRunner.html
50
- - cruyff.gemspec
51
- - lib/cruyff/version.rb
52
- - lib/generators/cruyff_generator.rb
53
- - lib/generators/templates/jquery.cruyff.js
54
- - spec/CruyffSpec.js
55
- - spec/SpecHelper.js
56
- - spec/fixtures/view.html
57
- - spec/js_lib/jasmine-1.0.1/jasmine-html.js
58
- - spec/js_lib/jasmine-1.0.1/jasmine.css
59
- - spec/js_lib/jasmine-1.0.1/jasmine.js
60
- - spec/js_lib/jasmine-fixture.js
61
- - spec/js_lib/jasmine-jquery-1.1.3.js
62
- - spec/js_lib/jquery-1.4.4.js
63
- - spec/js_lib/jquery.ba-bbq-1.2.1.js
64
- - spec/js_lib/jquery.form-2.52.js
65
- - spec/js_lib/rails-11.01.12.js
37
+ - .gitignore
38
+ - Gemfile
39
+ - Rakefile
40
+ - Readme.md
41
+ - SpecRunner.html
42
+ - cruyff.gemspec
43
+ - lib/cruyff.rb
44
+ - lib/cruyff/version.rb
45
+ - lib/generators/cruyff/install/install_generator.rb
46
+ - lib/generators/cruyff/templates/jquery.cruyff.js
47
+ - lib/generators/cruyff/templates/rails.js
48
+ - spec/CruyffSpec.js
49
+ - spec/SpecHelper.js
50
+ - spec/fixtures/view.html
51
+ - spec/js_lib/jasmine-1.0.1/jasmine-html.js
52
+ - spec/js_lib/jasmine-1.0.1/jasmine.css
53
+ - spec/js_lib/jasmine-1.0.1/jasmine.js
54
+ - spec/js_lib/jasmine-fixture.js
55
+ - spec/js_lib/jasmine-jquery-1.1.3.js
56
+ - spec/js_lib/jquery-1.4.4.js
57
+ - spec/js_lib/jquery.ba-bbq-1.2.1.js
58
+ - spec/js_lib/jquery.form-2.52.js
66
59
  has_rdoc: true
67
60
  homepage: https://github.com/andref5/cruyff
68
61
  licenses: []
@@ -71,29 +64,35 @@ post_install_message:
71
64
  rdoc_options: []
72
65
 
73
66
  require_paths:
74
- - lib
67
+ - lib
75
68
  required_ruby_version: !ruby/object:Gem::Requirement
76
69
  none: false
77
70
  requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- segments:
81
- - 0
82
- version: "0"
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
83
74
  required_rubygems_version: !ruby/object:Gem::Requirement
84
75
  none: false
85
76
  requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- segments:
89
- - 0
90
- version: "0"
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
91
80
  requirements: []
92
81
 
93
82
  rubyforge_project:
94
- rubygems_version: 1.3.7
83
+ rubygems_version: 1.4.2
95
84
  signing_key:
96
85
  specification_version: 3
97
86
  summary: Ajax CRUD solution for Rails applications.
98
- test_files: []
99
-
87
+ test_files:
88
+ - spec/CruyffSpec.js
89
+ - spec/SpecHelper.js
90
+ - spec/fixtures/view.html
91
+ - spec/js_lib/jasmine-1.0.1/jasmine-html.js
92
+ - spec/js_lib/jasmine-1.0.1/jasmine.css
93
+ - spec/js_lib/jasmine-1.0.1/jasmine.js
94
+ - spec/js_lib/jasmine-fixture.js
95
+ - spec/js_lib/jasmine-jquery-1.1.3.js
96
+ - spec/js_lib/jquery-1.4.4.js
97
+ - spec/js_lib/jquery.ba-bbq-1.2.1.js
98
+ - spec/js_lib/jquery.form-2.52.js
@@ -1,14 +0,0 @@
1
- require 'rails/generators'
2
-
3
- class CruyffGenerator < Rails::Generators::Base
4
- def self.source_root
5
- File.join(File.dirname(__FILE__), 'templates')
6
- end
7
-
8
- def install_cruyff
9
- copy_file(
10
- 'jquery.cruyff.js',
11
- 'public/javascripts/jquery.cruyff.js'
12
- )
13
- end
14
- end
@@ -1,174 +0,0 @@
1
- (function($) {
2
-
3
- var cruyffSettings = {
4
- url: "",
5
- method: "",
6
- dataType: "",
7
- data: "",
8
- responseSelector: "#response",
9
- response: [],
10
- };
11
-
12
- $.fn.handleRemoteCrud = function(element) {
13
- var cs = this.cruyffSetup(element);
14
-
15
- //call ajaxSubmit from jquery.form because provides a file upload mechanism.
16
- element.ajaxSubmit({
17
- url: cs.url,
18
- type: cs.method || 'GET',
19
- data: cs.data,
20
- dataType: cs.dataType,
21
- // stopping the "ajax:beforeSend" event will cancel the ajax request
22
- beforeSend: function(xhr, settings) {
23
- if (settings.dataType === undefined) {
24
- xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
25
- }
26
- return fire(element, 'ajax:beforeSend', [xhr, settings]);
27
- },
28
- success: function(data, status, xhr) {
29
- element.trigger('ajax:success', [data, status, xhr]);
30
- cs.response.html(data);
31
- },
32
- complete: function(xhr, status) {
33
- element.trigger('ajax:complete', [xhr, status]);
34
- },
35
- error: function(xhr, status, error) {
36
- element.trigger('ajax:error', [xhr, status, error]);
37
- cs.response.html(error.toString());
38
- }
39
- });
40
-
41
- $.bbq.pushState("app=" + cs.url);
42
-
43
- };
44
- function handleRemote(element) {
45
- $.fn.handleRemoteCrud(element);
46
- }
47
-
48
- $.fn.cruyffSetup = function(element) {
49
- var cs = cruyffSettings;
50
-
51
- cs.response = $(cs.responseSelector);
52
-
53
- /**
54
- * Rails.js Code 2011-01-12
55
- **/
56
- cs.dataType = element.attr('data-type') || ($.ajaxSettings && $.ajaxSettings.dataType);
57
-
58
- if (element.is('form')) {
59
- cs.method = element.attr('method');
60
- cs.url = element.attr('action');
61
- cs.data = element.serializeArray();
62
- // memoized value from clicked submit button
63
- var button = element.data('ujs:submit-button');
64
- if (button) {
65
- cs.data.push(button);
66
- element.data('ujs:submit-button', null);
67
- }
68
- } else {
69
- cs.method = element.attr('data-method');
70
- cs.url = element.attr('href');
71
- cs.data = null;
72
- }
73
- /**
74
- * End Rails.js $.bbq.getState
75
- **/
76
-
77
- return cs;
78
- };
79
-
80
- $.fn.cruyffUrl = $.bbq.getState("app");
81
-
82
- console.log($.fn.cruyffUrl);
83
-
84
- /**
85
- * Rails.js Code 2011-01-12. I don't know yet how to override inner functions.
86
- **/
87
- function fire(obj, name, data) {
88
- var event = new $.Event(name);
89
- obj.trigger(event, data);
90
- return event.result !== false;
91
- }
92
- // Handles "data-method" on links such as:
93
- // <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
94
- function handleMethod(link) {
95
- var href = link.attr('href'),
96
- method = link.attr('data-method'),
97
- csrf_token = $('meta[name=csrf-token]').attr('content'),
98
- csrf_param = $('meta[name=csrf-param]').attr('content'),
99
- form = $('<form method="post" action="' + href + '"></form>'),
100
- metadata_input = '<input name="_method" value="' + method + '" type="hidden" />';
101
-
102
- if (csrf_param !== undefined && csrf_token !== undefined) {
103
- metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />';
104
- }
105
-
106
- form.hide().append(metadata_input).appendTo('body');
107
- form.submit();
108
- }
109
-
110
- function disableFormElements(form) {
111
- form.find('input[data-disable-with]').each(function() {
112
- var input = $(this);
113
- input.data('ujs:enable-with', input.val())
114
- .val(input.attr('data-disable-with'))
115
- .attr('disabled', 'disabled');
116
- });
117
- }
118
-
119
- function enableFormElements(form) {
120
- form.find('input[data-disable-with]').each(function() {
121
- var input = $(this);
122
- input.val(input.data('ujs:enable-with')).removeAttr('disabled');
123
- });
124
- }
125
-
126
- function allowAction(element) {
127
- var message = element.attr('data-confirm');
128
- return !message || (fire(element, 'confirm') && confirm(message));
129
- }
130
-
131
- $('a[data-confirm], a[data-method], a[data-remote]').die('click.rails').live('click.rails', function(e) {
132
- var link = $(this);
133
- if (!allowAction(link)) return false;
134
-
135
- if (link.attr('data-remote')) {
136
- handleRemote(link);
137
- return false;
138
- } else if (link.attr('data-method')) {
139
- handleMethod(link);
140
- return false;
141
- }
142
- });
143
-
144
- $('form').die('submit.rails').live('submit.rails', function(e) {
145
- var form = $(this);
146
- if (!allowAction(form)) return false;
147
-
148
- if (form.attr('data-remote')) {
149
- handleRemote(form);
150
- return false;
151
- } else {
152
- disableFormElements(form);
153
- }
154
- });
155
-
156
- $('form input[type=submit], form button[type=submit], form button:not([type])').die('click.rails').live('click.rails', function() {
157
- var button = $(this);
158
- if (!allowAction(button)) return false;
159
- // register the pressed submit button
160
- var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null;
161
- button.closest('form').data('ujs:submit-button', data);
162
- });
163
-
164
- $('form').live('ajax:beforeSend.rails', function(event) {
165
- if (this == event.target) disableFormElements($(this));
166
- });
167
-
168
- $('form').live('ajax:complete.rails', function(event) {
169
- if (this == event.target) enableFormElements($(this));
170
- });
171
- /**
172
- * End Rails.js
173
- **/
174
- })( jQuery );