1 | // $Id: editablefields.js,v 1.1.2.14.2.14 2010/01/19 19:01:03 markfoodyburton Exp $ |
---|
2 | |
---|
3 | Drupal.behaviors.editablefields = function(context) { |
---|
4 | $('div.editablefields-html-load', context).not('.clicktoedit').not('.editablefields-processed').each(function() { |
---|
5 | $(this).addClass('editablefields-processed'); |
---|
6 | Drupal.editablefields.html_init(this); |
---|
7 | }); |
---|
8 | $('div.editablefields', context).not('.clicktoedit').not('.editablefields-processed').each(function() { |
---|
9 | $(this).addClass('editablefields-processed'); |
---|
10 | Drupal.editablefields.load(this); |
---|
11 | }); |
---|
12 | $('div.editablefields', context).filter('.clicktoedit').not('.editablefields-processed').each(function() { |
---|
13 | $(this).prepend(Drupal.settings.editablefields.clicktoedit_message); |
---|
14 | $(".editablefields_clicktoedit_message").fadeOut(3000); |
---|
15 | $(this).mouseover(function(){$(".editablefields_clicktoedit_message",this).fadeIn(500);}); |
---|
16 | $(this).mouseout(function(){$(".editablefields_clicktoedit_message",this).fadeOut(500);}); |
---|
17 | $(this).click(Drupal.editablefields.init); |
---|
18 | }); |
---|
19 | $('div.field-label, div.field-label-inline-first, div.field-label-inline, div.field-label-inline-last', context).not('.label-processed').each(function() { |
---|
20 | $(this).click(function() { |
---|
21 | $(this).addClass('highlighted'); |
---|
22 | $(this).parent().find('.editablefields').each(function() { |
---|
23 | $(this).unbind("click",Drupal.editablefields.init); |
---|
24 | Drupal.editablefields.load(this); |
---|
25 | }); |
---|
26 | return false; |
---|
27 | }); |
---|
28 | }); |
---|
29 | $('div.editablefields', context).submit(function(){ |
---|
30 | return false; |
---|
31 | }); |
---|
32 | $('input', context).not(':hidden').focus(); |
---|
33 | $('select', context).not(':hidden').focus(); |
---|
34 | $('textarea', context).not(':hidden').focus(); |
---|
35 | } |
---|
36 | |
---|
37 | |
---|
38 | Drupal.editablefields = {}; |
---|
39 | // Create a unique index for checkboxes |
---|
40 | Drupal.editablefields.checkbox_fix_index = 0; |
---|
41 | |
---|
42 | |
---|
43 | Drupal.editablefields.init = function() { |
---|
44 | $(this).unbind("click",Drupal.editablefields.init); |
---|
45 | $(this).parents('div.field').find('.field-label, .field-label-inline-first, .field-label-inline, .field-label-inline-last').addClass('highlighted'); |
---|
46 | $(this).addClass('editablefields-processed'); |
---|
47 | $(this).children().hide(); |
---|
48 | Drupal.editablefields.load(this); |
---|
49 | } |
---|
50 | |
---|
51 | Drupal.editablefields.html_init = function(element) { |
---|
52 | |
---|
53 | if ($(element).hasClass("editablefields_REMOVE") ) { |
---|
54 | $(element).hide(); |
---|
55 | } |
---|
56 | else { |
---|
57 | |
---|
58 | var uniqNum = Drupal.editablefields.checkbox_fix_index++; |
---|
59 | $(element).find(':input').each(function() { |
---|
60 | // Create a unique id field for checkboxes |
---|
61 | if ($(this).attr("type") == 'checkbox' || $(this).attr("type") == 'radio') { |
---|
62 | $(this).attr("id", $(this).attr("id") + '-' + uniqNum); |
---|
63 | $(this).click(function() { |
---|
64 | Drupal.editablefields.onchange(this); |
---|
65 | }); |
---|
66 | } else { |
---|
67 | $(this).change(function() { |
---|
68 | Drupal.editablefields.onchange(this); |
---|
69 | }); |
---|
70 | } |
---|
71 | }); |
---|
72 | |
---|
73 | // $(element).find(':input').change(function() { |
---|
74 | // Drupal.editablefields.onchange(this); |
---|
75 | // }); |
---|
76 | |
---|
77 | $(element).find(':input').blur(function() { |
---|
78 | Drupal.editablefields.onblur(this); |
---|
79 | }); |
---|
80 | //if ($(element).find(':input').not(':hidden').hasClass('form-text')) { |
---|
81 | //$(element).find(':input').not(':hidden').get(0).focus(); |
---|
82 | //} |
---|
83 | //if ($(element).find(':input').not(':hidden').hasClass('form-radio')) { |
---|
84 | //$(element).find(':checked').not(':hidden').get(0).focus(); |
---|
85 | //} |
---|
86 | //if ($(element).find(':input').not(':hidden').hasClass('form-checkbox')) { |
---|
87 | //$(element).find(':checked').not(':hidden').get(0).focus(); |
---|
88 | //} |
---|
89 | //if ($(element).find('select').not(':hidden').hasClass('form-select')) { |
---|
90 | //$(element).find(':selected').not(':hidden').select(); |
---|
91 | //$(element).find('select').not(':hidden').focus(); |
---|
92 | //} |
---|
93 | //if ($(element).find(':input').not(':hidden').hasClass('form-submit')) { |
---|
94 | //$(element).find('.form-submit').not(':hidden').focus(); |
---|
95 | //} |
---|
96 | } |
---|
97 | } |
---|
98 | |
---|
99 | Drupal.editablefields.view = function(element) { |
---|
100 | |
---|
101 | if ($(element).hasClass("editablefields_REMOVE") ) { |
---|
102 | $(element).hide(); |
---|
103 | } |
---|
104 | else { |
---|
105 | $(element).addClass('editablefields_throbber'); |
---|
106 | |
---|
107 | var url = Drupal.settings.editablefields.url_view + "/" + $(element).attr("nid") + "/" + $(element).attr("field")+ "/" + $(element).attr("delta"); |
---|
108 | $.ajax({ |
---|
109 | url: url, |
---|
110 | type: 'GET', |
---|
111 | success: function(response) { |
---|
112 | // Call all callbacks. |
---|
113 | if (response.__callbacks) { |
---|
114 | $.each(response.__callbacks, function(i, callback) { |
---|
115 | eval(callback)(element, response); |
---|
116 | }); |
---|
117 | } |
---|
118 | //alert(response.content); |
---|
119 | $(element).html(response.content); |
---|
120 | Drupal.attachBehaviors(element); |
---|
121 | $(element).prepend(Drupal.settings.editablefields.clicktoedit_message); |
---|
122 | $(".editablefields_clicktoedit_message").fadeOut(3000); |
---|
123 | $(this).mouseover(function(){$(".editablefields_clicktoedit_message",this).fadeIn(500);}); |
---|
124 | $(this).mouseout(function(){$(".editablefields_clicktoedit_message",this).fadeOut(500);}); |
---|
125 | $(element).bind("click",Drupal.editablefields.init); |
---|
126 | $(element).removeClass('editablefields_throbber'); |
---|
127 | $(element).removeClass('editablefields-processed'); |
---|
128 | }, |
---|
129 | error: function(response) { |
---|
130 | //alert(Drupal.t("An error occurred at ") + url); |
---|
131 | $(".messages.error").remove(); |
---|
132 | $(element).after('<div class="messages error">' + Drupal.t("An error occurred at ") + url + '</div>'); |
---|
133 | $(".messages.error").hide(0).show(1000); |
---|
134 | $(element).removeClass('editablefields_throbber'); |
---|
135 | $(element).removeClass('editablefields-processed'); |
---|
136 | }, |
---|
137 | dataType: 'json' |
---|
138 | }); |
---|
139 | } |
---|
140 | }; |
---|
141 | |
---|
142 | Drupal.editablefields.load = function(element) { |
---|
143 | $(".content .messages.status").remove(); |
---|
144 | if ($(element).hasClass("editablefields_REMOVE") ) { |
---|
145 | $(element).hide(); |
---|
146 | } |
---|
147 | else { |
---|
148 | $(element).addClass('editablefields_throbber'); |
---|
149 | |
---|
150 | var url = Drupal.settings.editablefields.url_html + "/" + $(element).attr("nid") + "/" + $(element).attr("field")+ "/" + $(element).attr("delta"); |
---|
151 | $.ajax({ |
---|
152 | url: url, |
---|
153 | type: 'GET', |
---|
154 | success: function(response) { |
---|
155 | // Call all callbacks. |
---|
156 | if (response.__callbacks) { |
---|
157 | $.each(response.__callbacks, function(i, callback) { |
---|
158 | eval(callback)(element, response); |
---|
159 | }); |
---|
160 | } |
---|
161 | $(element).html(response.content); |
---|
162 | Drupal.attachBehaviors(element); |
---|
163 | |
---|
164 | var uniqNum = Drupal.editablefields.checkbox_fix_index++; |
---|
165 | $(element).find(':input').each(function() { |
---|
166 | // Create a unique id field for checkboxes |
---|
167 | if ($(this).attr("type") == 'checkbox' || $(this).attr("type") == 'radio') { |
---|
168 | $(this).attr("id", $(this).attr("id") + '-' + uniqNum); |
---|
169 | $(this).click(function() { |
---|
170 | Drupal.editablefields.onchange(this); |
---|
171 | }); |
---|
172 | } else { |
---|
173 | $(this).change(function() { |
---|
174 | Drupal.editablefields.onchange(this); |
---|
175 | }); |
---|
176 | } |
---|
177 | }); |
---|
178 | |
---|
179 | |
---|
180 | // $(element).find(':input').change(function() { |
---|
181 | // Drupal.editablefields.onchange(this); |
---|
182 | // }); |
---|
183 | |
---|
184 | $(element).find(':input').blur(function() { |
---|
185 | window.setTimeout(function(){Drupal.editablefields.onblur(this)},10); |
---|
186 | // Drupal.editablefields.onblur(this); |
---|
187 | }); |
---|
188 | //if ($(element).find(':input').not(':hidden').hasClass('form-text')) { |
---|
189 | //$(element).find(':input').not(':hidden').get(0).focus(); |
---|
190 | //} |
---|
191 | //if ($(element).find(':input').not(':hidden').hasClass('form-radio')) { |
---|
192 | //$(element).find(':checked').not(':hidden').get(0).focus(); |
---|
193 | //} |
---|
194 | //if ($(element).find(':input').not(':hidden').hasClass('form-checkbox')) { |
---|
195 | //$(element).find(':checked').not(':hidden').get(0).focus(); |
---|
196 | //} |
---|
197 | //if ($(element).find('select').not(':hidden').hasClass('form-select')) { |
---|
198 | //$(element).find(':selected').not(':hidden').select(); |
---|
199 | //$(element).find('select').not(':hidden').focus(); |
---|
200 | //} |
---|
201 | //if ($(element).find(':input').not(':hidden').hasClass('form-submit')) { |
---|
202 | //$(element).find(':selected').not(':hidden').select(); |
---|
203 | //$(element).find('.form-submit').not(':hidden').focus(); |
---|
204 | //} |
---|
205 | //if ($(element).find(':input').not(':hidden').hasClass('form-textarea')) { |
---|
206 | //$(element).find('.form-textarea').not(':hidden').focus(); |
---|
207 | //} |
---|
208 | $(element).removeClass('editablefields_throbber'); |
---|
209 | }, |
---|
210 | error: function(response) { |
---|
211 | //alert(Drupal.t("An error occurred at ") + url); |
---|
212 | $(".messages.error").remove(); |
---|
213 | $(element).after('<div class="messages error">' + Drupal.t("An error occurred at ") + url + '</div>'); |
---|
214 | $(".messages.error").hide(0).show(1000); |
---|
215 | $(element).removeClass('editablefields_throbber'); |
---|
216 | }, |
---|
217 | dataType: 'json' |
---|
218 | }); |
---|
219 | } |
---|
220 | }; |
---|
221 | |
---|
222 | Drupal.editablefields.onchange = function(element) { |
---|
223 | if (!$(element).hasClass('editablefields')) { |
---|
224 | element = $(element).parents('div.editablefields'); |
---|
225 | } |
---|
226 | |
---|
227 | // Provide some feedback to the user while the form is being processed. |
---|
228 | $(element).addClass('editablefields_throbber'); |
---|
229 | |
---|
230 | if ($(element).hasClass('clicktoedit')) { |
---|
231 | // Send the field form for a 'clicktoedit' field. |
---|
232 | $.ajax({ |
---|
233 | type: "POST", |
---|
234 | url: Drupal.settings.editablefields.url_submit, |
---|
235 | data: $(element).find('form').serialize() + "&nid=" + $(element).attr("nid") + "&field=" + $(element).attr("field")+ "&delta=" + $(element).attr("delta"), |
---|
236 | element: $(element), |
---|
237 | success: function(msg) { |
---|
238 | $(element).removeClass('editablefields_throbber'); |
---|
239 | $(".messages.error").hide(1000, function() {$(this).remove();}); |
---|
240 | Drupal.editablefields.view(element); |
---|
241 | }, |
---|
242 | error: function(msg) { |
---|
243 | //alert(Drupal.t("Error, unable to make update:") +"\n"+ |
---|
244 | //msg.responseText); |
---|
245 | $(".messages.error").remove(); |
---|
246 | $(element).after('<div class="messages error">' + msg.responseText + '</div>'); |
---|
247 | $(".messages.error").hide(0).show(1000); |
---|
248 | $(element).removeClass('editablefields_throbber'); |
---|
249 | Drupal.editablefields.load(element); |
---|
250 | } |
---|
251 | }); |
---|
252 | } |
---|
253 | else { |
---|
254 | // Send the field form for a 'editable' field. |
---|
255 | $.ajax({ |
---|
256 | type: "POST", |
---|
257 | url: Drupal.settings.editablefields.url_submit, |
---|
258 | data: $(element).find('form').serialize() + "&nid=" + $(element).attr("nid") + "&field=" + $(element).attr("field")+ "&delta=" + $(element).attr("delta"), |
---|
259 | element: $(element), |
---|
260 | success: function(msg) { |
---|
261 | $(element).removeClass('editablefields_throbber'); |
---|
262 | // Drupal.editablefields.load(element); |
---|
263 | // Re-enable the widget |
---|
264 | $(".messages.error").hide(1000, function() {$(this).remove();}); |
---|
265 | $(element).find(':input').each(function() { |
---|
266 | $(this).attr("disabled", false); |
---|
267 | }); |
---|
268 | }, |
---|
269 | error: function(msg) { |
---|
270 | //alert(Drupal.t("Error, unable to make update:") +"\n"+ |
---|
271 | //msg.responseText); |
---|
272 | $(".messages.error").remove(); |
---|
273 | $(element).after('<div class="messages error">' + msg.responseText + '</div>'); |
---|
274 | $(".messages.error").hide(0).show(1000); |
---|
275 | $(element).removeClass('editablefields_throbber'); |
---|
276 | Drupal.editablefields.load(element); |
---|
277 | } |
---|
278 | }); |
---|
279 | } |
---|
280 | |
---|
281 | // Ensure same changes are not submitted more than once. |
---|
282 | $(element).find(':input').each(function() { |
---|
283 | $(this).attr("disabled", true); |
---|
284 | }); |
---|
285 | |
---|
286 | // Do not actually submit. |
---|
287 | return false; |
---|
288 | }; |
---|
289 | |
---|
290 | Drupal.editablefields.onblur = function(element) { |
---|
291 | if (!$(element).hasClass('editablefields')) { |
---|
292 | element = $(element).parents('div.editablefields'); |
---|
293 | } |
---|
294 | |
---|
295 | if ($(element).hasClass('clicktoedit')) { |
---|
296 | $(".messages.error").hide(1000, function() {$(this).remove();}); |
---|
297 | $(element).parents('div.field').find('.highlighted').removeClass('highlighted'); |
---|
298 | Drupal.editablefields.view(element); |
---|
299 | } |
---|
300 | |
---|
301 | return false; |
---|
302 | }; |
---|