thin_man 0.20.2 → 0.20.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52e184615861b2ef734e6f3e3d97f122fc62eb17f74e01ca9d869a09f7b7914f
4
- data.tar.gz: 2a47b56140ad773e52e62459c938917b65ae272e8934dfd574d743d74b013cb8
3
+ metadata.gz: 7f3a3149a78c919863fc40928cbed440b12e8adbf944532241fd460c5ff8c77a
4
+ data.tar.gz: a328ba03fef1ea832ff05f9e1fefd7338234b6df4818a53bf3f87858605a30c2
5
5
  SHA512:
6
- metadata.gz: 865d49734a4be126b76f89fd084b8d4426a22d0c9e77fe310ea3dd77b5a51a0de323d80d34df21d2d506019ef079b01922daddbab27aae9fa5b0ccb7d2789701
7
- data.tar.gz: 9c0928c58713ab0f29d31f66f59b0c3c143966ca1e070072a4df1f0a245f5f836b90f3e6d6f6c848fd321b9eee066ec7d8b4551d028b52f9d0b4a900ffa2116b
6
+ metadata.gz: 297ff75de6284081cd2f5bde87ce29c30435a4f516df7f8c7d92a55d4b7c81a4bd4bb9577b5a8d1fdd0550160442a6f3132bc7b7e8e14c6393790b1dd01937b6
7
+ data.tar.gz: 5353f964208f3ad3aaeedf891aab222d4f735c9baf95a59579811252564ab2e52e908c5abdfd97081f779bf44c5676943c7b6c6e31eca762f93f6d88bd028de5
@@ -1,1047 +1,1079 @@
1
1
  //= require simple_inheritance
2
2
  //= require debug_logger
3
3
  var initThinMan = function() {
4
- thin_man = {
5
- getSubClass: function(sub_class_name, parent_class) {
6
- if ((typeof(sub_class_name) == 'string') && (sub_class_name != '') && (sub_class_name != 'true')) {
7
- var this_class = sub_class_name;
8
- } else {
9
- var this_class = parent_class;
10
- }
11
- return this_class;
12
- },
13
- getLinkGroup: function(name) {
14
- if (thin_man.hasOwnProperty('link_groups') && thin_man.link_groups.hasOwnProperty(name)) {
15
- return thin_man.link_groups[name]
16
- } else {
17
- return thin_man.addLinkGroup(name)
18
- }
19
- },
20
- addLinkGroup: function(name) {
21
- if (!thin_man.hasOwnProperty('link_groups')) {
22
- thin_man.link_groups = {}
4
+ thin_man = {
5
+ getSubClass: function(sub_class_name, parent_class) {
6
+ if ((typeof(sub_class_name) == 'string') && (sub_class_name != '') && (sub_class_name != 'true')) {
7
+ var this_class = sub_class_name;
8
+ } else {
9
+ var this_class = parent_class;
10
+ }
11
+ return this_class;
12
+ },
13
+ getLinkGroup: function(name) {
14
+ if (thin_man.hasOwnProperty('link_groups') && thin_man.link_groups.hasOwnProperty(name)) {
15
+ return thin_man.link_groups[name]
16
+ } else {
17
+ return thin_man.addLinkGroup(name)
18
+ }
19
+ },
20
+ addLinkGroup: function(name) {
21
+ if (!thin_man.hasOwnProperty('link_groups')) {
22
+ thin_man.link_groups = {}
23
+ }
24
+ if (!thin_man.link_groups.hasOwnProperty(name)) {
25
+ var this_group = new thin_man.LinkGroup(name)
26
+ thin_man.link_groups[name] = this_group
27
+ return this_group
28
+ }
29
+ },
30
+ addLinkToGroup: function(link, sequence_number, group_name) {
31
+ var group = thin_man.getLinkGroup(group_name)
32
+ group.addLink(link, sequence_number)
33
+ },
34
+ LinkGroup: Class.extend({
35
+ init: function(name) {
36
+ this.name = name
37
+ this.resetLinks()
38
+ },
39
+ resetLinks: function() {
40
+ this.links = {}
41
+ this.current_number = 0
42
+ },
43
+ addLink: function(link_submission, sequence_number) {
44
+ if (this.links.hasOwnProperty(sequence_number)) {
45
+ //If there is already a link with this number, we're starting over with a new list
46
+ this.resetLinks()
47
+ }
48
+ this.links[sequence_number] = link_submission
49
+ link_submission.addWatcher(this)
50
+ if (sequence_number == this.current_number) {
51
+ this.fire()
52
+ }
53
+ },
54
+ fire: function() {
55
+ if (this.links.hasOwnProperty(this.current_number)) {
56
+ this.links[this.current_number].fire()
57
+ }
58
+ },
59
+ linkCompleted: function(link_submission) {
60
+ this.current_number += 1
61
+ this.fire()
62
+ }
63
+ }),
64
+ AjaxSubmission: Class.extend({
65
+ init: function(jq_obj, params) {
66
+ this.jq_obj = jq_obj
67
+ this.params = params
68
+ if (!this.params) { this.params = {} }
69
+ // Bail out if this is a no-mouse-click ajax element and we were mouse clicked
70
+ if (this.wasMouseClicked() && this.noMouseClick()) {
71
+ return false
72
+ }
73
+ this.getTrigger()
74
+ this.getTarget()
75
+ this.getErrorTarget()
76
+ this.progress_color = jq_obj.data('progress-color')
77
+ this.progress_target = $(jq_obj.data('progress-target'))
78
+ this.$mask_target = $(jq_obj.data('mask-target'))
79
+ this.$mask_message = jq_obj.data('mask-message')
80
+ this.custom_progress = typeof(jq_obj.data('custom-progress')) != 'undefined';
81
+ this.scroll_to = jq_obj.data('scroll-to')
82
+ this.watchers = []
83
+ this.search_params = jq_obj.data('search-params')
84
+ this.search_path = jq_obj.data('search-path')
85
+ if (this.progress_target.length == 0 && this.trigger.length > 0) {
86
+ this.progress_target = this.trigger
87
+ this.trigger_is_progress_target = true
88
+ }
89
+ this.insert_method = this.getInsertMethod()
90
+ var ajax_submission = this
91
+ this.ajax_options = {
92
+ url: ajax_submission.getAjaxUrl(),
93
+ type: ajax_submission.getAjaxType(),
94
+ datatype: ajax_submission.getAjaxDataType(),
95
+ data: ajax_submission.getData(),
96
+ beforeSend: function(jqXHr) { return ajax_submission.ajaxBefore(jqXHr) },
97
+ success: function(data, textStatus, jqXHR) { ajax_submission.ajaxSuccess(data, textStatus, jqXHR) },
98
+ error: function(jqXHr) { ajax_submission.ajaxError(jqXHr) },
99
+ complete: function(jqXHr) { ajax_submission.ajaxComplete(jqXHr) },
100
+ processData: ajax_submission.getProcessData()
101
+ };
102
+ if (!this.sendContentType()) {
103
+ this.ajax_options.contentType = false
104
+ };
105
+ if (typeof this.customXHR === 'function') {
106
+ this.ajax_options.xhr = this.customXHR
107
+ this.ajax_options.thin_man_obj = this;
108
+ }
109
+ this.handleGroup()
110
+ if (this.readyToFire()) {
111
+ this.fire()
112
+ }
113
+ },
114
+ fire: function() {
115
+ $.ajax(this.ajax_options);
116
+ },
117
+ readyToFire: function() {
118
+ if (!this.sequence_group) { return true }
119
+ },
120
+ handleGroup: function() {
121
+ this.sequence_group = this.jq_obj.data('sequence-group');
122
+ this.sequence_number = this.jq_obj.data('sequence-number');
123
+ if (typeof(this.sequence_number) == 'number' && !this.sequence_group) {
124
+ console.log('Warning! Thin Man Link has sequence number but no sequence group.')
125
+ }
126
+ if (this.sequence_group && typeof(this.sequence_number) != 'number') {
127
+ console.log('Warning! Thin Man Link has sequence group ' + this.sequence_group + ' but no sequence number.')
128
+ }
129
+ if (this.sequence_group) {
130
+ thin_man.addLinkToGroup(this, this.sequence_number, this.sequence_group)
131
+ }
132
+ },
133
+ getTarget: function() {
134
+ var target_selector = this.jq_obj.data('ajax-target');
135
+ if (target_selector) {
136
+ if ($(target_selector).length > 0) {
137
+ this.target = $(target_selector);
138
+ } else {
139
+ console.log('Warning! Thin Man selector ' + target_selector + ' not found')
140
+ }
141
+ } else {
142
+ console.log('Warning! Thin Man selector not given')
143
+ }
144
+ },
145
+ getErrorTarget: function() {
146
+ if ($(this.jq_obj.data('error-target')).length > 0) {
147
+ this.error_target = $(this.jq_obj.data('error-target'));
148
+ } else {
149
+ this.error_target = $(this.jq_obj.data('ajax-target'));
150
+ }
151
+ },
152
+ getAjaxDataType: function() {
153
+ return this.jq_obj.data('return-type') || 'html';
154
+ },
155
+ getInsertMethod: function() {
156
+ return this.jq_obj.data('insert-method') || 'html';
157
+ },
158
+ getData: function() {
159
+ return null;
160
+ },
161
+ getProcessData: function() {
162
+ return true;
163
+ },
164
+ sendContentType: function() {
165
+ return true;
166
+ },
167
+ insertHtml: function(data) {
168
+ debug_logger.log("thin_man.AjaxSubmission.insertHtml target:", 1, 'thin-man')
169
+ debug_logger.log(this.target, 1, 'thin-man')
170
+ debug_logger.log("thin_man.AjaxSubmission.insertHtml insert_method:", 1, 'thin-man')
171
+ debug_logger.log(this.insert_method, 1, 'thin-man')
172
+ if (this.target) {
173
+ this.target[this.insert_method](data);
174
+ if (this.refocus()) {
175
+ this.target.find('input,select,textarea').filter(':visible:enabled:first').each(function() {
176
+ if (!$(this).data('date-picker')) {
177
+ $(this).focus();
178
+ }
179
+ });
180
+ }
181
+ if (this.scroll_to) {
182
+ if (this.target.is(':hidden')) {
183
+ if (this.target.parents('[data-tab-id]').length > 0) {
184
+ this.target.parents('[data-tab-id]').each(function() {
185
+ var tab_key = $(this).data('tab-id')
186
+ $('[data-tab-target-id="' + tab_key + '"]').trigger('click')
187
+ })
188
+ }
23
189
  }
24
- if (!thin_man.link_groups.hasOwnProperty(name)) {
25
- var this_group = new thin_man.LinkGroup(name)
26
- thin_man.link_groups[name] = this_group
27
- return this_group
190
+ var extra_offset = 0
191
+ if ($('[data-thin-man-offset]').length > 0) {
192
+ extra_offset = $('[data-thin-man-offset]').outerHeight()
28
193
  }
29
- },
30
- addLinkToGroup: function(link, sequence_number, group_name) {
31
- var group = thin_man.getLinkGroup(group_name)
32
- group.addLink(link, sequence_number)
33
- },
34
- LinkGroup: Class.extend({
35
- init: function(name) {
36
- this.name = name
37
- this.resetLinks()
38
- },
39
- resetLinks: function() {
40
- this.links = {}
41
- this.current_number = 0
42
- },
43
- addLink: function(link_submission, sequence_number) {
44
- if (this.links.hasOwnProperty(sequence_number)) {
45
- //If there is already a link with this number, we're starting over with a new list
46
- this.resetLinks()
47
- }
48
- this.links[sequence_number] = link_submission
49
- link_submission.addWatcher(this)
50
- if (sequence_number == this.current_number) {
51
- this.fire()
52
- }
53
- },
54
- fire: function() {
55
- if (this.links.hasOwnProperty(this.current_number)) {
56
- this.links[this.current_number].fire()
57
- }
58
- },
59
- linkCompleted: function(link_submission) {
60
- this.current_number += 1
61
- this.fire()
194
+ $('html, body').animate({
195
+ scrollTop: this.target.offset().top - extra_offset
196
+ }, 1000);
197
+ }
198
+ }
199
+ },
200
+ refocus: function() {
201
+ return true;
202
+ },
203
+ ajaxSuccess: function(data, textStatus, jqXHR) {
204
+ debug_logger.log("thin_man.AjaxSubmission.ajaxSuccess data:", 1, 'thin-man')
205
+ debug_logger.log(data, 1, 'thin-man')
206
+ if (typeof data === 'string') {
207
+ this.insertHtml(data);
208
+ } else if (typeof data === 'object') {
209
+ if (typeof data.html != 'undefined') {
210
+ if (typeof data.hooch_modal != 'undefined') {
211
+ new hooch.Modal($(data.html))
212
+ } else {
213
+ this.insertHtml(data.html)
62
214
  }
63
- }),
64
- AjaxSubmission: Class.extend({
65
- init: function(jq_obj, params) {
66
- this.jq_obj = jq_obj
67
- this.params = params
68
- if (!this.params) { this.params = {} }
69
- // Bail out if this is a no-mouse-click ajax element and we were mouse clicked
70
- if (this.wasMouseClicked() && this.noMouseClick()) {
71
- return false
72
- }
73
- this.getTrigger()
74
- this.getTarget()
75
- this.getErrorTarget()
76
- this.progress_color = jq_obj.data('progress-color')
77
- this.progress_target = $(jq_obj.data('progress-target'))
78
- this.$mask_target = $(jq_obj.data('mask-target'))
79
- this.$mask_message = jq_obj.data('mask-message')
80
- this.custom_progress = typeof(jq_obj.data('custom-progress')) != 'undefined';
81
- this.scroll_to = jq_obj.data('scroll-to')
82
- this.watchers = []
83
- this.search_params = jq_obj.data('search-params')
84
- this.search_path = jq_obj.data('search-path')
85
- if (this.progress_target.length == 0 && this.trigger.length > 0) {
86
- this.progress_target = this.trigger
87
- this.trigger_is_progress_target = true
88
- }
89
- this.insert_method = this.getInsertMethod()
90
- var ajax_submission = this
91
- this.ajax_options = {
92
- url: ajax_submission.getAjaxUrl(),
93
- type: ajax_submission.getAjaxType(),
94
- datatype: ajax_submission.getAjaxDataType(),
95
- data: ajax_submission.getData(),
96
- beforeSend: function(jqXHr) { return ajax_submission.ajaxBefore(jqXHr) },
97
- success: function(data, textStatus, jqXHR) { ajax_submission.ajaxSuccess(data, textStatus, jqXHR) },
98
- error: function(jqXHr) { ajax_submission.ajaxError(jqXHr) },
99
- complete: function(jqXHr) { ajax_submission.ajaxComplete(jqXHr) },
100
- processData: ajax_submission.getProcessData()
101
- };
102
- if (!this.sendContentType()) {
103
- this.ajax_options.contentType = false
104
- };
105
- if (typeof this.customXHR === 'function') {
106
- this.ajax_options.xhr = this.customXHR
107
- this.ajax_options.thin_man_obj = this;
108
- }
109
- this.handleGroup()
110
- if (this.readyToFire()) {
111
- this.fire()
112
- }
113
- },
114
- fire: function() {
115
- $.ajax(this.ajax_options);
116
- },
117
- readyToFire: function() {
118
- if (!this.sequence_group) { return true }
119
- },
120
- handleGroup: function() {
121
- this.sequence_group = this.jq_obj.data('sequence-group');
122
- this.sequence_number = this.jq_obj.data('sequence-number');
123
- if (typeof(this.sequence_number) == 'number' && !this.sequence_group) {
124
- console.log('Warning! Thin Man Link has sequence number but no sequence group.')
125
- }
126
- if (this.sequence_group && typeof(this.sequence_number) != 'number') {
127
- console.log('Warning! Thin Man Link has sequence group ' + this.sequence_group + ' but no sequence number.')
128
- }
129
- if (this.sequence_group) {
130
- thin_man.addLinkToGroup(this, this.sequence_number, this.sequence_group)
131
- }
132
- },
133
- getTarget: function() {
134
- var target_selector = this.jq_obj.data('ajax-target');
135
- if (target_selector) {
136
- if ($(target_selector).length > 0) {
137
- this.target = $(target_selector);
138
- } else {
139
- console.log('Warning! Thin Man selector ' + target_selector + ' not found')
140
- }
141
- } else {
142
- console.log('Warning! Thin Man selector not given')
143
- }
144
- },
145
- getErrorTarget: function() {
146
- if ($(this.jq_obj.data('error-target')).length > 0) {
147
- this.error_target = $(this.jq_obj.data('error-target'));
148
- } else {
149
- this.error_target = $(this.jq_obj.data('ajax-target'));
150
- }
151
- },
152
- getAjaxDataType: function() {
153
- return this.jq_obj.data('return-type') || 'html';
154
- },
155
- getInsertMethod: function() {
156
- return this.jq_obj.data('insert-method') || 'html';
157
- },
158
- getData: function() {
159
- return null;
160
- },
161
- getProcessData: function() {
162
- return true;
163
- },
164
- sendContentType: function() {
165
- return true;
166
- },
167
- insertHtml: function(data) {
168
- debug_logger.log("thin_man.AjaxSubmission.insertHtml target:", 1, 'thin-man')
169
- debug_logger.log(this.target, 1, 'thin-man')
170
- debug_logger.log("thin_man.AjaxSubmission.insertHtml insert_method:", 1, 'thin-man')
171
- debug_logger.log(this.insert_method, 1, 'thin-man')
172
- if (this.target) {
173
- this.target[this.insert_method](data);
174
- if (this.refocus()) {
175
- this.target.find('input,select,textarea').filter(':visible:enabled:first').each(function() {
176
- if (!$(this).data('date-picker')) {
177
- $(this).focus();
178
- }
179
- });
180
- }
181
- if (this.scroll_to) {
182
- if (this.target.is(':hidden')) {
183
- if (this.target.parents('[data-tab-id]').length > 0) {
184
- this.target.parents('[data-tab-id]').each(function() {
185
- var tab_key = $(this).data('tab-id')
186
- $('[data-tab-target-id="' + tab_key + '"]').trigger('click')
187
- })
188
- }
189
- }
190
- var extra_offset = 0
191
- if ($('[data-thin-man-offset]').length > 0) {
192
- extra_offset = $('[data-thin-man-offset]').outerHeight()
193
- }
194
- $('html, body').animate({
195
- scrollTop: this.target.offset().top - extra_offset
196
- }, 1000);
197
- }
198
- }
199
- },
200
- refocus: function() {
201
- return true;
202
- },
203
- ajaxSuccess: function(data, textStatus, jqXHR) {
204
- debug_logger.log("thin_man.AjaxSubmission.ajaxSuccess data:", 1, 'thin-man')
205
- debug_logger.log(data, 1, 'thin-man')
206
- if (typeof data === 'string') {
207
- this.insertHtml(data);
208
- } else if (typeof data === 'object') {
209
- if (typeof data.html != 'undefined') {
210
- if (typeof data.hooch_modal != 'undefined') {
211
- new hooch.Modal($(data.html))
212
- } else {
213
- this.insertHtml(data.html)
214
- }
215
- }
216
- if (typeof data.class_triggers != 'undefined') {
217
- $.each(data.class_triggers, function(class_name, params) {
218
- try {
219
- klass = eval(class_name);
220
- new klass(params);
221
- } catch (err) {
222
- console.log("Error trying to instantiate class " + class_name + " from ajax response:")
223
- console.log(err)
224
- }
225
- })
226
- }
227
- if (typeof data.function_calls != 'undefined') {
228
- $.each(data.function_calls, function(func_name, params) {
229
- try {
230
- func = eval(func_name);
231
- func(params);
232
- } catch (err) {
233
- console.log("Error trying to instantiate function " + func_name + " from ajax response:")
234
- console.log(err)
235
- }
236
- })
237
- }
238
- }
239
- if (this.target) {
240
- var ajax_flash = this.target.children().last().data('ajax-flash');
241
- if ((jqXHR.status == 200) && ajax_flash) {
242
- new thin_man.AjaxFlash('success', ajax_flash.notice, this.target);
243
- }
244
- }
245
- if (this.removeOnSuccess()) {
246
- if ($(this.removeOnSuccess())) {
247
- $(this.removeOnSuccess()).remove();
248
- }
249
- }
250
- if (this.emptyOnSuccess()) {
251
- if ($(this.emptyOnSuccess())) {
252
- $(this.emptyOnSuccess()).empty();
253
- }
254
- }
255
- if ($.contains(document, this.jq_obj[0])) {
256
- this.jq_obj.find('.error').removeClass('error')
257
- this.jq_obj.find('.help-inline').remove()
258
- }
259
- if(this.shouldReplaceHistory()){
260
- var new_url = [location.protocol, '//', location.host, '/', this.replacement_path].join('')
261
- history['pushState']({}, null, new_url);
262
- }
263
- },
264
- shouldReplaceHistory: function(){
265
- this.replacement_path = this.jq_obj.data('replacement-path')
266
- if(this.replacement_path){
267
- if('/' === this.replacement_path[0]){
268
- this.replacement_path = this.replacement_path.slice(1)
269
- }
270
- return true
215
+ }
216
+ if (typeof data.class_triggers != 'undefined') {
217
+ $.each(data.class_triggers, function(class_name, params) {
218
+ try {
219
+ klass = eval(class_name);
220
+ new klass(params);
221
+ } catch (err) {
222
+ console.log("Error trying to instantiate class " + class_name + " from ajax response:")
223
+ console.log(err)
271
224
  }
272
- return false
273
- },
274
- addWatcher: function(watcher) {
275
- if (!this.hasOwnProperty('watchers')) {
276
- this.watchers = []
277
- }
278
- this.watchers.push(watcher)
279
- },
280
- notifyWatchers: function() {
281
- $.each(this.watchers, function() {
282
- this.linkCompleted(this)
283
- })
284
- },
285
- ajaxComplete: function(jqXHR) {
286
- debug_logger.log('thin_man.AjaxSubmission.ajaxComplete jqXHR:', 1, 'thin-man')
287
- debug_logger.log(jqXHR, 1, 'thin-man')
288
- this.showTrigger();
289
- this.notifyWatchers();
290
- if (this.progress_indicator) {
291
- this.progress_indicator.stop();
292
- } else if (!this.trigger_is_progress_target) {
293
- this.progress_target.remove();
294
- }
295
- if (typeof this.mask != 'undefined') {
296
- this.mask.remove();
297
- }
298
- try {
299
- var response_data = JSON.parse(jqXHR.responseText)
300
- } catch (err) {
301
- var response_data = {}
302
- // hmmm, the response is not JSON, so there's no flash.
303
- }
304
- if (typeof response_data.flash_message != 'undefined') {
305
- var flash_style = this.httpResponseToFlashStyle(jqXHR.status);
306
- var flash_duration = null;
307
- if (typeof response_data.flash_persist != 'undefined') {
308
- if (response_data.flash_persist) {
309
- flash_duration = 'persist'
310
- } else {
311
- flash_duration = 'fade'
312
- }
313
- }
314
- if (this.target) {
315
- this.flash = new thin_man.AjaxFlash(flash_style, response_data.flash_message, this.target, flash_duration);
316
- } else {
317
- this.flash = new thin_man.AjaxFlash(flash_style, response_data.flash_message, this.jq_obj, flash_duration);
318
- }
319
- }
320
- if ('function' == typeof this.params.on_complete) {
321
- this.params.on_complete()
322
- }
323
- },
324
- ajaxBefore: function(jqXHr) {
325
- this.toggleLoading();
326
- if (!this.custom_progress) {
327
- this.progress_indicator = new thin_man.AjaxProgress(this.progress_target, this.target, this.progress_color);
328
- }
329
- if (this.$mask_target) {
330
- this.mask = new thin_man.AjaxMask(this.$mask_target, this.$mask_message)
331
- }
332
- },
333
- ajaxError: function(jqXHR) {
334
- debug_logger.log('thin_man.AjaxSubmission.ajaxError jqXHR:', 1, 'thin-man')
335
- debug_logger.log(jqXHR, 1, 'thin-man')
336
- if ([409,422,424,428].indexOf(jqXHR.status) >= 0) {
337
- try {
338
- var data = JSON.parse(jqXHR.responseText);
339
- debug_logger.log("thin_man.AjaxSubmission.ajaxError responseText is valid JSON, parsing to an object:", 1, 'thin-man')
340
- } catch (error) {
341
- debug_logger.log("thin_man.AjaxSubmission.ajaxError responseText is not JSON, assuming a string:", 1, 'thin-man')
342
- debug_logger.log(jqXHR.responseText, 1, 'thin-man')
343
- var data = jqXHR.responseText;
344
- debug_logger.log("thin_man.AjaxSubmission.ajaxError data to insert:", 1, 'thin-man')
345
- debug_logger.log(data, 1, 'thin-man')
346
- }
347
- debug_logger.log("thin_man.AjaxSubmission.ajaxError error target:", 1, 'thin-man')
348
- debug_logger.log(this.error_target, 1, 'thin-man')
349
- debug_logger.log("thin_man.AjaxSubmission.ajaxError data:", 1, 'thin-man')
350
- debug_logger.log(data, 1, 'thin-man')
351
- if (typeof data === 'string') {
352
- debug_logger.log("thin_man.AjaxSubmission.ajaxError data is a string, inserting into target.", 1, 'thin-man')
353
- this.error_target.html(data);
354
- } else if (typeof data === 'object') {
355
- debug_logger.log("thin_man.AjaxSubmission.ajaxError data is an object.", 1, 'thin-man')
356
- if (typeof data.html != 'undefined') {
357
- debug_logger.log("thin_man.AjaxSubmission.ajaxError data.html exists, inserting into target.", 1, 'thin-man')
358
- this.error_target.html(data.html);
359
- }
360
- }
361
- } else if (jqXHR.status == 500) {
362
- if (this.sendHelpLink()) {
363
- if (window.confirm('There was an error communicating with the server. Please click "ok" to submit a bug report. If a new tab does not open, please disable pop up blocking and try again. Clicking "Cancel" will return you to the current page.')) { this.updateAndSubmitForm() };
364
- } else {
365
- window.alert('There was an error communicating with the server.')
366
- }
367
- }
368
- },
369
- sendHelpLink: function() {
370
- var sendHelpLink = $("meta[name='sendHelpLink']").attr("content")
371
- return (undefined !== sendHelpLink && "true" === sendHelpLink)
372
- },
373
- updateAndSubmitForm: function() {
374
- var $form = $('#ajax-500-help')
375
- var user = this.getCurrentUser()
376
- var token = $("meta[name='helpToken']").attr("content")
377
-
378
- $form.children('input[name="http_request_details[requested_path]"]').val(this.ajax_options.url)
379
- $form.children('input[name="http_request_details[referred_from]"]').val(window.location.href)
380
- $form.children('input[name="http_request_details[request_method]"]').val(this.ajax_options.type)
381
- $form.children('input[name="http_request_details[data]"]').val(this.ajax_options.data)
382
- $form.children('input[name="submission[occured_at]"]').val(new Date())
383
- $form.children('input[name="submission[url]"]').val(window.location.href)
384
- $form.children('input[name="submission[url]"]').val(window.location.href)
385
- $form.children('input[name="user[name]"]').val(user.name)
386
- $form.children('input[name="user[email]"]').val(user.email)
387
- $form.children('input[name="user[time_zone]"]').val(user.time_zone)
388
- $form.children('input[name="token"]').val(token)
389
- $form.submit()
390
- },
225
+ })
226
+ }
227
+ if (typeof data.function_calls != 'undefined') {
228
+ $.each(data.function_calls, function(func_name, params) {
229
+ try {
230
+ func = eval(func_name);
231
+ func(params);
232
+ } catch (err) {
233
+ console.log("Error trying to instantiate function " + func_name + " from ajax response:")
234
+ console.log(err)
235
+ }
236
+ })
237
+ }
238
+ if (typeof data.replacement_path != 'undefined') {
239
+ this.replacement_path = data.replacement_path
240
+ }
241
+ if (typeof data.push_path != 'undefined') {
242
+ this.push_path = data.push_path
243
+ }
244
+ }
245
+ if (this.target) {
246
+ var ajax_flash = this.target.children().last().data('ajax-flash');
247
+ if ((jqXHR.status == 200) && ajax_flash) {
248
+ new thin_man.AjaxFlash('success', ajax_flash.notice, this.target);
249
+ }
250
+ }
251
+ if (this.removeOnSuccess()) {
252
+ if ($(this.removeOnSuccess())) {
253
+ $(this.removeOnSuccess()).remove();
254
+ }
255
+ }
256
+ if (this.emptyOnSuccess()) {
257
+ if ($(this.emptyOnSuccess())) {
258
+ $(this.emptyOnSuccess()).empty();
259
+ }
260
+ }
261
+ if ($.contains(document, this.jq_obj[0])) {
262
+ this.jq_obj.find('.error').removeClass('error')
263
+ this.jq_obj.find('.help-inline').remove()
264
+ }
265
+ this.handleHistory()
266
+ },
267
+ handleHistory: function(){
268
+ if(!this.replacement_path){ //if it wasn't passed in the response, look for it on the trigger object
269
+ this.replacement_path = this.jq_obj.data('replacement-path')
270
+ }
271
+ if(this.replacement_path){
272
+ this.handleReplaceState()
273
+ }
274
+ if(!this.push_path){ //if it wasn't passed in the response, look for it on the trigger object
275
+ this.push_path = this.jq_obj.data('push-path')
276
+ }
277
+ if(this.push_path){
278
+ this.handlePushState()
279
+ }
280
+ },
281
+ handleReplaceState: function(){
282
+ if('/' === this.replacement_path[0]){
283
+ this.replacement_path = this.replacement_path.slice(1)
284
+ }
285
+ var new_url = [location.protocol, '//', location.host, '/', this.replacement_path].join('')
286
+ history['replaceState']({}, null, new_url);
287
+ },
288
+ handlePushState: function(){
289
+ if('/' === this.push_path[0]){
290
+ this.push_path = this.push_path.slice(1)
291
+ }
292
+ var new_url = [location.protocol, '//', location.host, '/', this.push_path].join('')
293
+ history['pushState']({path: ('/' + this.push_path), target: this.target}, null, new_url);
391
294
 
392
- getCurrentUser: function() {
393
- user = {
394
- name: $("meta[name='userName']").attr("content"),
395
- email: $("meta[name='userEmail']").attr("content"),
396
- time_zone: $("meta[name='userTimeZone']").attr("content")
397
- }
398
- return user
399
- },
400
- getTrigger: function() {},
401
- hideTrigger: function() {},
402
- showTrigger: function() {},
403
- toggleLoading: function() {
404
- if (this.target) {
405
- if (this.target.find('[data-loading-visible="false"]').length > 0) {
406
- this.target.find('[data-loading-visible="false"]').hide();
407
- }
408
- if (this.target.find('[data-loading-visible="true"]').length > 0) {
409
- this.target.find('[data-loading-visible="true"]').show();
410
- }
411
- }
412
- },
413
- removeOnSuccess: function() {
414
- return this.jq_obj.data('remove-on-success')
415
- },
416
- emptyOnSuccess: function() {
417
- return this.jq_obj.data('empty-on-success')
418
- },
419
- httpResponseToFlashStyle: function(response_code) {
420
- if ([403, 409, 500].indexOf(response_code) > -1) {
421
- return 'error'
422
- }
423
- if ([200, 202].indexOf(response_code) > -1) {
424
- return 'success'
425
- }
426
- return 'error'
427
- },
428
- wasMouseClicked: function() {
429
- return this.params.e && this.params.e.type && this.params.e.type == 'click'
430
- },
431
- noMouseClick: function() {
432
- return this.jq_obj.data('no-mouse-click')
433
- }
434
- }),
435
- AjaxBrowserPushConnector: Class.extend({
436
- init: function($connector) {
437
- this.trigger = $connector.find('button, input[type="submit"]');
438
- if (this.trigger.length < 1) {
439
- this.trigger = $connector;
440
- }
441
- this.browser_push_progress_indicator = new thin_man.AjaxProgress(this.trigger, this.trigger, this.progress_color);
442
- $connector.data('browser-push-progress-indicator-object', this.browser_push_progress_indicator);
443
- }
444
- }),
445
- AjaxBrowserPushFlash: Class.extend({
446
- init: function($flash) {
447
- this.message = $flash.data('ajax-browser-push-flash')
448
- this.$target = $($flash.data('ajax-browser-push-flash-target'));
449
- this.$target.data('ajax-browser-push-flash', this.message);
295
+ },
296
+ addWatcher: function(watcher) {
297
+ if (!this.hasOwnProperty('watchers')) {
298
+ this.watchers = []
299
+ }
300
+ this.watchers.push(watcher)
301
+ },
302
+ notifyWatchers: function() {
303
+ $.each(this.watchers, function() {
304
+ this.linkCompleted(this)
305
+ })
306
+ },
307
+ ajaxComplete: function(jqXHR) {
308
+ debug_logger.log('thin_man.AjaxSubmission.ajaxComplete jqXHR:', 1, 'thin-man')
309
+ debug_logger.log(jqXHR, 1, 'thin-man')
310
+ this.showTrigger();
311
+ this.notifyWatchers();
312
+ if (this.progress_indicator) {
313
+ this.progress_indicator.stop();
314
+ } else if (!this.trigger_is_progress_target) {
315
+ this.progress_target.remove();
316
+ }
317
+ if (typeof this.mask != 'undefined') {
318
+ this.mask.remove();
319
+ }
320
+ try {
321
+ var response_data = JSON.parse(jqXHR.responseText)
322
+ } catch (err) {
323
+ var response_data = {}
324
+ // hmmm, the response is not JSON, so there's no flash.
325
+ }
326
+ if (typeof response_data.flash_message != 'undefined') {
327
+ var flash_style = this.httpResponseToFlashStyle(jqXHR.status);
328
+ var flash_duration = null;
329
+ if (typeof response_data.flash_persist != 'undefined') {
330
+ if (response_data.flash_persist) {
331
+ flash_duration = 'persist'
332
+ } else {
333
+ flash_duration = 'fade'
450
334
  }
451
- }),
452
- AjaxProgress: Class.extend({
453
- init: function(target, alt, progress_color) {
454
- if (target.length > 0 && target.is(':visible') && target.css('display') != 'inline' && target.css('display') != 'inline-block') {
455
- this.progress_target = target;
456
- } else if (typeof(alt) != 'undefined' && alt.is(':visible')) {
457
- this.progress_target = alt;
458
- } else if (target.length > 0 && target.is(':hidden')) {
459
- this.progress_target = $('')
460
- } else {
461
- this.progress_target = $('body');
462
- }
463
- if (typeof(progress_color) == 'undefined') {
464
- var progress_color = 'black';
465
- }
466
- this.progress_container = $('#ajax_progress_container').clone();
467
- var uuid = new UUID;
468
- this.progress_container.prop('id', 'thin_man_ajax_progress_' + uuid.value);
469
- this.progress_target.append(this.progress_container);
470
- var css = { display: 'block', visibility: 'visible', 'color': progress_color, 'z-index': 1000000 }
471
- $.extend(css, {
472
- position: 'absolute',
473
- top: '50%',
474
- left: '50%',
475
- '-ms-transform': 'translate(-50%, -50%)',
476
- /* IE 9 */
477
- '-webkit-transform': 'translate(-50%, -50%)',
478
- /* Safari */
479
- 'transform': 'translate(-50%, -50%)'
480
- })
481
- this.progress_container.css(css)
482
- },
483
- stop: function() {
484
- this.progress_container.remove();
335
+ }
336
+ if (this.target) {
337
+ this.flash = new thin_man.AjaxFlash(flash_style, response_data.flash_message, this.target, flash_duration);
338
+ } else {
339
+ this.flash = new thin_man.AjaxFlash(flash_style, response_data.flash_message, this.jq_obj, flash_duration);
340
+ }
341
+ }
342
+ if ('function' == typeof this.params.on_complete) {
343
+ this.params.on_complete()
344
+ }
345
+ },
346
+ ajaxBefore: function(jqXHr) {
347
+ this.toggleLoading();
348
+ if (!this.custom_progress) {
349
+ this.progress_indicator = new thin_man.AjaxProgress(this.progress_target, this.target, this.progress_color);
350
+ }
351
+ if (this.$mask_target) {
352
+ this.mask = new thin_man.AjaxMask(this.$mask_target, this.$mask_message)
353
+ }
354
+ },
355
+ ajaxError: function(jqXHR) {
356
+ debug_logger.log('thin_man.AjaxSubmission.ajaxError jqXHR:', 1, 'thin-man')
357
+ debug_logger.log(jqXHR, 1, 'thin-man')
358
+ if ([409,422,424,428].indexOf(jqXHR.status) >= 0) {
359
+ try {
360
+ var data = JSON.parse(jqXHR.responseText);
361
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError responseText is valid JSON, parsing to an object:", 1, 'thin-man')
362
+ } catch (error) {
363
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError responseText is not JSON, assuming a string:", 1, 'thin-man')
364
+ debug_logger.log(jqXHR.responseText, 1, 'thin-man')
365
+ var data = jqXHR.responseText;
366
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError data to insert:", 1, 'thin-man')
367
+ debug_logger.log(data, 1, 'thin-man')
368
+ }
369
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError error target:", 1, 'thin-man')
370
+ debug_logger.log(this.error_target, 1, 'thin-man')
371
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError data:", 1, 'thin-man')
372
+ debug_logger.log(data, 1, 'thin-man')
373
+ if (typeof data === 'string') {
374
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError data is a string, inserting into target.", 1, 'thin-man')
375
+ this.error_target.html(data);
376
+ } else if (typeof data === 'object') {
377
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError data is an object.", 1, 'thin-man')
378
+ if (typeof data.html != 'undefined') {
379
+ debug_logger.log("thin_man.AjaxSubmission.ajaxError data.html exists, inserting into target.", 1, 'thin-man')
380
+ this.error_target.html(data.html);
485
381
  }
486
- }),
487
- AjaxMask: Class.extend({
382
+ }
383
+ } else if (jqXHR.status == 500) {
384
+ if (this.sendHelpLink()) {
385
+ if (window.confirm('There was an error communicating with the server. Please click "ok" to submit a bug report. If a new tab does not open, please disable pop up blocking and try again. Clicking "Cancel" will return you to the current page.')) { this.updateAndSubmitForm() };
386
+ } else {
387
+ window.alert('There was an error communicating with the server.')
388
+ }
389
+ }
390
+ },
391
+ sendHelpLink: function() {
392
+ var sendHelpLink = $("meta[name='sendHelpLink']").attr("content")
393
+ return (undefined !== sendHelpLink && "true" === sendHelpLink)
394
+ },
395
+ updateAndSubmitForm: function() {
396
+ var $form = $('#ajax-500-help')
397
+ var user = this.getCurrentUser()
398
+ var token = $("meta[name='helpToken']").attr("content")
399
+
400
+ $form.children('input[name="http_request_details[requested_path]"]').val(this.ajax_options.url)
401
+ $form.children('input[name="http_request_details[referred_from]"]').val(window.location.href)
402
+ $form.children('input[name="http_request_details[request_method]"]').val(this.ajax_options.type)
403
+ $form.children('input[name="http_request_details[data]"]').val(this.ajax_options.data)
404
+ $form.children('input[name="submission[occured_at]"]').val(new Date())
405
+ $form.children('input[name="submission[url]"]').val(window.location.href)
406
+ $form.children('input[name="submission[url]"]').val(window.location.href)
407
+ $form.children('input[name="user[name]"]').val(user.name)
408
+ $form.children('input[name="user[email]"]').val(user.email)
409
+ $form.children('input[name="user[time_zone]"]').val(user.time_zone)
410
+ $form.children('input[name="token"]').val(token)
411
+ $form.submit()
412
+ },
413
+
414
+ getCurrentUser: function() {
415
+ user = {
416
+ name: $("meta[name='userName']").attr("content"),
417
+ email: $("meta[name='userEmail']").attr("content"),
418
+ time_zone: $("meta[name='userTimeZone']").attr("content")
419
+ }
420
+ return user
421
+ },
422
+ getTrigger: function() {},
423
+ hideTrigger: function() {},
424
+ showTrigger: function() {},
425
+ toggleLoading: function() {
426
+ if (this.target) {
427
+ if (this.target.find('[data-loading-visible="false"]').length > 0) {
428
+ this.target.find('[data-loading-visible="false"]').hide();
429
+ }
430
+ if (this.target.find('[data-loading-visible="true"]').length > 0) {
431
+ this.target.find('[data-loading-visible="true"]').show();
432
+ }
433
+ }
434
+ },
435
+ removeOnSuccess: function() {
436
+ return this.jq_obj.data('remove-on-success')
437
+ },
438
+ emptyOnSuccess: function() {
439
+ return this.jq_obj.data('empty-on-success')
440
+ },
441
+ httpResponseToFlashStyle: function(response_code) {
442
+ if ([403, 409, 500].indexOf(response_code) > -1) {
443
+ return 'error'
444
+ }
445
+ if ([200, 202].indexOf(response_code) > -1) {
446
+ return 'success'
447
+ }
448
+ return 'error'
449
+ },
450
+ wasMouseClicked: function() {
451
+ return this.params.e && this.params.e.type && this.params.e.type == 'click'
452
+ },
453
+ noMouseClick: function() {
454
+ return this.jq_obj.data('no-mouse-click')
455
+ }
456
+ }),
457
+ AjaxBrowserPushConnector: Class.extend({
458
+ init: function($connector) {
459
+ this.trigger = $connector.find('button, input[type="submit"]');
460
+ if (this.trigger.length < 1) {
461
+ this.trigger = $connector;
462
+ }
463
+ this.browser_push_progress_indicator = new thin_man.AjaxProgress(this.trigger, this.trigger, this.progress_color);
464
+ $connector.data('browser-push-progress-indicator-object', this.browser_push_progress_indicator);
465
+ }
466
+ }),
467
+ AjaxBrowserPushFlash: Class.extend({
468
+ init: function($flash) {
469
+ this.message = $flash.data('ajax-browser-push-flash')
470
+ this.$target = $($flash.data('ajax-browser-push-flash-target'));
471
+ this.$target.data('ajax-browser-push-flash', this.message);
472
+ }
473
+ }),
474
+ AjaxProgress: Class.extend({
475
+ init: function(target, alt, progress_color) {
476
+ if (target.length > 0 && target.is(':visible') && target.css('display') != 'inline' && target.css('display') != 'inline-block') {
477
+ this.progress_target = target;
478
+ } else if (typeof(alt) != 'undefined' && alt.is(':visible')) {
479
+ this.progress_target = alt;
480
+ } else if (target.length > 0 && target.is(':hidden')) {
481
+ this.progress_target = $('')
482
+ } else {
483
+ this.progress_target = $('body');
484
+ }
485
+ if (typeof(progress_color) == 'undefined') {
486
+ var progress_color = 'black';
487
+ }
488
+ this.progress_container = $('#ajax_progress_container').clone();
489
+ var uuid = new UUID;
490
+ this.progress_container.prop('id', 'thin_man_ajax_progress_' + uuid.value);
491
+ this.progress_target.append(this.progress_container);
492
+ var css = { display: 'block', visibility: 'visible', 'color': progress_color, 'z-index': 1000000 }
493
+ $.extend(css, {
494
+ position: 'absolute',
495
+ top: '50%',
496
+ left: '50%',
497
+ '-ms-transform': 'translate(-50%, -50%)',
498
+ /* IE 9 */
499
+ '-webkit-transform': 'translate(-50%, -50%)',
500
+ /* Safari */
501
+ 'transform': 'translate(-50%, -50%)'
502
+ })
503
+ this.progress_container.css(css)
504
+ },
505
+ stop: function() {
506
+ this.progress_container.remove();
507
+ }
508
+ }),
509
+ AjaxMask: Class.extend({
488
510
  init: function($mask_target, mask_message) {
489
- var uuid = new UUID;
490
- this.$mask_target = $mask_target
491
- this.$mask = $('#thin_man_mask').clone()
492
- this.$mask.prop('id', 'thin_man_mask' + uuid.value)
493
- if (typeof mask_message != 'undefined') {
494
- var $message = this.$mask.find('[data-thin-man-mask-message]')
495
- $message.html(mask_message)
496
- }
497
- var height = this.$mask_target.outerHeight()
498
- var width = this.$mask_target.outerWidth()
499
- var radius = this.$mask_target.css('border-radius')
500
- this.$mask.css({ 'height': height, 'width': width, 'left': 0, 'top': 0, 'border-radius': radius })
501
- this.$mask.css({ 'position': 'absolute', 'z-index': 10000 })
511
+ var uuid = new UUID;
512
+ this.$mask_target = $mask_target
513
+ this.$mask = $('#thin_man_mask').clone()
514
+ this.$mask.prop('id', 'thin_man_mask' + uuid.value)
515
+ if (typeof mask_message != 'undefined') {
516
+ var $message = this.$mask.find('[data-thin-man-mask-message]')
517
+ $message.html(mask_message)
518
+ }
519
+ var height = this.$mask_target.outerHeight()
520
+ var width = this.$mask_target.outerWidth()
521
+ var radius = this.$mask_target.css('border-radius')
522
+ this.$mask.css({ 'height': height, 'width': width, 'left': 0, 'top': 0, 'border-radius': radius })
523
+ this.$mask.css({ 'position': 'absolute', 'z-index': 10000 })
502
524
 
503
- this.$mask_target.append(this.$mask)
504
- this.$mask.on('click mousedown mousemove', function(e) {
505
- e.preventDefault();
506
- return false;
507
- })
508
- this.$mask.show()
525
+ this.$mask_target.append(this.$mask)
526
+ this.$mask.on('click mousedown mousemove', function(e) {
527
+ e.preventDefault();
528
+ return false;
529
+ })
530
+ this.$mask.show()
509
531
  },
510
532
  remove: function() {
511
- this.$mask.remove()
533
+ this.$mask.remove()
512
534
  }
513
- }),
514
- AjaxFlash: Class.extend({
535
+ }),
536
+ AjaxFlash: Class.extend({
515
537
  init: function(type, message, elem, duration) {
516
- this.flash_container = $('[data-thin-man-flash-template]').clone();
517
- this.flash_container.removeAttr('data-thin-man-flash-template');
518
- this.flash_container.attr('data-thin-man-flash-container', true);
519
- $('body').append(this.flash_container);
520
- this.flash_container.css({ position: 'absolute', visibility: 'hidden' });
521
- this.alert_type = type;
522
- this.elem = elem;
523
- var alert_class = 'alert-' + type;
524
- this.flash_container.addClass(alert_class);
525
- this.flash_content = this.flash_container.find('[data-thin-man-flash-content]');
526
- this.flash_content.html(message);
527
- this.flash_container.show();
528
- this.setFadeBehavior(duration);
529
- this.reposition(elem);
530
- this.bindDismisser();
538
+ this.flash_container = $('[data-thin-man-flash-template]').clone();
539
+ this.flash_container.removeAttr('data-thin-man-flash-template');
540
+ this.flash_container.attr('data-thin-man-flash-container', true);
541
+ $('body').append(this.flash_container);
542
+ this.flash_container.css({ position: 'absolute', visibility: 'hidden' });
543
+ this.alert_type = type;
544
+ this.elem = elem;
545
+ var alert_class = 'alert-' + type;
546
+ this.flash_container.addClass(alert_class);
547
+ this.flash_content = this.flash_container.find('[data-thin-man-flash-content]');
548
+ this.flash_content.html(message);
549
+ this.flash_container.show();
550
+ this.setFadeBehavior(duration);
551
+ this.reposition(elem);
552
+ this.bindDismisser();
531
553
  },
532
554
  setFadeBehavior: function(duration) {
533
- if (duration) {
555
+ if (duration) {
534
556
  if ('persist' == duration) {
535
- this.fade = false
557
+ this.fade = false
536
558
  } else {
537
- this.fade = true
559
+ this.fade = true
538
560
  }
539
- } else { //default behavior if persist duration is not sent back with message
561
+ } else { //default behavior if persist duration is not sent back with message
540
562
  if ('error' == this.alert_type || 'warning' == this.alert_type || 'info' == this.alert_type) {
541
- this.fade = false;
563
+ this.fade = false;
542
564
  } else {
543
- this.fade = true;
565
+ this.fade = true;
544
566
  }
545
- }
567
+ }
546
568
  },
547
569
  reposition: function(elem) {
548
- var this_window = {
570
+ var this_window = {
549
571
  top: $(window).scrollTop(),
550
572
  left: $(window).scrollLeft(),
551
573
  height: $(window).outerHeight(),
552
574
  width: $(window).outerWidth()
553
- };
554
- var this_flash = {
575
+ };
576
+ var this_flash = {
555
577
  height: this.flash_container.outerHeight(),
556
578
  width: this.flash_container.outerWidth()
557
- }
558
- this_window.vert_middle = (this_window.top + (this_window.height / 2));
559
- this_window.horiz_middle = (this_window.left + (this_window.width / 2));
560
- this_flash.half_height = (this_flash.height / 2);
561
- this_flash.half_width = (this_flash.width / 2);
562
- var new_top = this_window.vert_middle - this_flash.half_height;
563
- var new_left = this_window.horiz_middle - this_flash.half_width;
564
- this.flash_container.css({ left: new_left, top: new_top, visibility: 'visible' });
565
- var ajax_flash = this;
566
- if (this.fade) {
579
+ }
580
+ this_window.vert_middle = (this_window.top + (this_window.height / 2));
581
+ this_window.horiz_middle = (this_window.left + (this_window.width / 2));
582
+ this_flash.half_height = (this_flash.height / 2);
583
+ this_flash.half_width = (this_flash.width / 2);
584
+ var new_top = this_window.vert_middle - this_flash.half_height;
585
+ var new_left = this_window.horiz_middle - this_flash.half_width;
586
+ this.flash_container.css({ left: new_left, top: new_top, visibility: 'visible' });
587
+ var ajax_flash = this;
588
+ if (this.fade) {
567
589
  setTimeout(function() { ajax_flash.fadeOut() }, 1618);
568
- }
590
+ }
569
591
  },
570
592
  fadeOut: function() {
571
- this.flash_container.fadeOut('slow');
593
+ this.flash_container.fadeOut('slow');
572
594
  },
573
595
  bindDismisser: function() {
574
- this.$dismisser = this.flash_container.find('[data-dismiss]')
575
- var ajax_flash = this
576
- this.$dismisser.on('click', function(){
596
+ this.$dismisser = this.flash_container.find('[data-dismiss]')
597
+ var ajax_flash = this
598
+ this.$dismisser.on('click', function(){
577
599
  ajax_flash.flash_container.remove()
578
- })
600
+ })
579
601
  }
580
- }),
581
- AjaxSorter: Class.extend({
582
- init: function($sort_container) {
583
- var base_url = $sort_container.data('url');
584
- $sort_container.sortable({
585
- helper: "clone",
586
- tolerance: 'pointer',
587
- stop: function(event, ui) {
588
- new thin_man.AjaxSortSubmission($sort_container);
589
- }
590
- });
591
- $sort_container.disableSelection();
592
- }
593
- })
594
- };
595
- thin_man.AjaxFormSubmission = thin_man.AjaxSubmission.extend({
596
- getAjaxUrl: function() {
597
- return this.jq_obj.attr('action');
598
- },
599
- getAjaxType: function() {
600
- return this.jq_obj.attr('method') || 'POST'
601
- },
602
- getData: function() {
603
- var $clicked = $(document.activeElement);
604
- var browserTabId = $("meta[name='browser_tab_id']").attr("content");
602
+ }),
603
+ AjaxSorter: Class.extend({
604
+ init: function($sort_container) {
605
+ var base_url = $sort_container.data('url');
606
+ $sort_container.sortable({
607
+ helper: "clone",
608
+ tolerance: 'pointer',
609
+ stop: function(event, ui) {
610
+ new thin_man.AjaxSortSubmission($sort_container);
611
+ }
612
+ });
613
+ $sort_container.disableSelection();
614
+ }
615
+ })
616
+ };
617
+ thin_man.AjaxFormSubmission = thin_man.AjaxSubmission.extend({
618
+ getAjaxUrl: function() {
619
+ return this.jq_obj.attr('action');
620
+ },
621
+ getAjaxType: function() {
622
+ return this.jq_obj.attr('method') || 'POST'
623
+ },
624
+ getData: function() {
625
+ var $clicked = $(document.activeElement);
626
+ var browserTabId = $("meta[name='browser_tab_id']").attr("content");
605
627
 
606
- if ($clicked.length && $clicked.is('button[type="submit"], input[type="submit"], input[type="image"]') && $clicked.is('[name]')) {
607
- var button_name = $clicked.attr('name')
608
- var button_value = $clicked.attr('value')
609
- }
610
- var event_data = this.params
611
- if (!event_data.hasOwnProperty('e')) {
612
- var thin_man_submitter = 'link_now'
613
- } else {
614
- var thin_man_submitter = this.params['e'].type
615
- }
616
- if ((this.getAjaxType().toLowerCase() == 'get') || (typeof FormData == 'undefined')) {
617
- var data_array = this.jq_obj.serializeArray();
618
- if (button_name && button_value) {
619
- data_array.push({ name: button_name, value: button_value })
620
- }
621
- data_array.push(
628
+ if ($clicked.length && $clicked.is('button[type="submit"], input[type="submit"], input[type="image"]') && $clicked.is('[name]')) {
629
+ var button_name = $clicked.attr('name')
630
+ var button_value = $clicked.attr('value')
631
+ }
632
+ var event_data = this.params
633
+ if (!event_data.hasOwnProperty('e')) {
634
+ var thin_man_submitter = 'link_now'
635
+ } else {
636
+ var thin_man_submitter = this.params['e'].type
637
+ }
638
+ if ((this.getAjaxType().toLowerCase() == 'get') || (typeof FormData == 'undefined')) {
639
+ var data_array = this.jq_obj.serializeArray();
640
+ if (button_name && button_value) {
641
+ data_array.push({ name: button_name, value: button_value })
642
+ }
643
+ data_array.push(
622
644
  { name: 'thin_man_submitter', value: thin_man_submitter },
623
645
  { name: 'browser_tab_id', value: browserTabId }
624
- )
625
- return data_array;
626
- } else {
627
- // need to implement a data-attribute for multiple file fields so we can allow selecting mutliple files at once. example here:
628
- // http://stackoverflow.com/questions/12989442/uploading-multiple-files-using-formdata
629
- var fd = new FormData(this.jq_obj[0]);
630
- if (button_name && button_value) {
631
- if (typeof fd.set != 'undefined') {
632
- fd.set(button_name, button_value)
633
- } else if (typeof fd.append != 'undefined') {
634
- fd.append(button_name, button_value)
635
- }
636
- }
637
- if (typeof fd.set != 'undefined') {
638
- fd.set('thin_man_submitter', thin_man_submitter)
639
- fd.set('browser_tab_id', browserTabId)
640
- } else if (typeof fd.append != 'undefined') {
641
- fd.append('thin_man_submitter', thin_man_submitter)
642
- fd.append('browser_tab_id', browserTabId)
643
- }
644
- return fd
645
- }
646
- },
647
- ajaxSuccess: function(data, textStatus, jqXHR) {
648
- debug_logger.log('thin_man.AjaxFormSubmission.ajaxSuccess', 1, 'thin-man')
649
- this._super(data, textStatus, jqXHR)
650
- if (this.resetOnSuccess()) {
651
- this.jq_obj[0].reset();
652
- $(this.jq_obj).find('input[type=text],textarea,select').filter(':visible:first').focus();
653
- }
654
- },
655
- resetOnSuccess: function() {
656
- return this.jq_obj.data('reset-on-success')
657
- },
658
- getProcessData: function() {
659
- if (this.getAjaxType().toLowerCase() == 'get') {
660
- return true;
661
- } else {
662
- return false;
663
- }
664
- },
665
- sendContentType: function() {
666
- if (this.getAjaxType().toLowerCase() == 'get') {
667
- return true;
668
- } else {
669
- return false;
670
- }
671
- },
672
- getTrigger: function() {
673
- this.trigger = this.jq_obj.find('button, input[type="submit"]');
674
- if (this.trigger.length != 1) {
675
- var $active_element = $(document.activeElement)
676
- if ($active_element[0].nodeName.toLowerCase() != 'body') {
677
- this.trigger = $active_element
678
- }
679
- }
680
- },
681
- hideTrigger: function() {
682
- this.trigger.css('visibility', 'hidden');
683
- },
684
- showTrigger: function() {
685
- this.trigger.css('visibility', 'visible');
686
- }
687
- }),
688
- thin_man.AjaxLinkSubmission = thin_man.AjaxSubmission.extend({
689
- getAjaxUrl: function() {
690
- if (this.search_path) {
691
- if (this.search_params) {
692
- return this.search_path + '?' + this.search_params
693
- } else {
694
- return this.search_path
695
- }
696
- } else {
697
- return this.jq_obj.attr('href');
698
- }
699
- },
700
- getData: function() {
701
- var this_data = { authenticity_token: $('[name="csrf-token"]').attr('content'), browser_tab_id: $("meta[name='browser_tab_id']").attr("content") };
702
- if (this.jq_obj.data('form-data')) {
703
- $.extend(this_data, this.jq_obj.data('form-data'))
704
- }
705
- return this_data
706
- },
707
- getProcessData: function() {
708
- return true;
709
- },
710
- getAjaxType: function() {
711
- return this.jq_obj.data('ajax-method') || 'GET'
712
- },
713
- getTrigger: function() {
714
- this.trigger = this.jq_obj;
715
- },
716
- hideTrigger: function() {
717
- this.trigger.css('visibility', 'hidden');
718
- },
719
- showTrigger: function() {
720
- this.trigger.css('visibility', 'visible');
721
- },
722
- refocus: function() {
723
- if (this.jq_obj.data('ajax-link-now')) {
724
- return false
725
- }
726
- return true
727
- },
728
-
729
- }),
730
- thin_man.AjaxModalOpener = thin_man.AjaxLinkSubmission.extend({
731
- ajaxSuccess: function(data, textStatus, jqXHR) {
732
- this._super(data, textStatus, jqXHR);
733
- $(this.jq_obj.data('ajax-modal')).modal();
734
- }
735
- }),
736
- thin_man.AddALineForm = thin_man.AjaxFormSubmission.extend({
737
- ajaxSuccess: function(data, textStatus, jqXHR) {
738
- this._super(data, textStatus, jqXHR);
739
- $(this.jq_obj.data('container')).empty();
740
- },
741
- ajaxError: function(jqXHR) {
742
- this.insert_method = 'html';
743
- this._super(jqXHR);
744
- }
745
- }),
746
- thin_man.EmptyForm = thin_man.AjaxFormSubmission.extend({
747
- ajaxSuccess: function(data, textStatus, jqXHR) {
748
- var clicked_button = $("input[type=submit][clicked=true]")[0];
749
- this._super(data, textStatus, jqXHR);
750
- if ($(clicked_button).data('clone') != true) {
751
- $(this.jq_obj)[0].reset();
752
- };
753
- $(this.jq_obj).find('input[type=text],textarea,select').filter(':visible:first').focus();
754
- $("[data-autocomplete]").trigger("chosen:updated");
755
- },
756
- ajaxError: function(jqXHR) {
757
- this.insert_method = 'html';
758
- this._super(jqXHR);
759
- }
760
- }),
761
- thin_man.ModalCloserForm = thin_man.AjaxFormSubmission.extend({
762
- ajaxSuccess: function(data, textStatus, jqXHR) {
763
- this._super(data, textStatus, jqXHR);
764
- $modal = $(this.jq_obj.data('modal-container'));
765
- $modal.modal('hide');
766
- $modal.remove();
767
- },
768
- ajaxError: function(jqXHR) {
769
- this._super(jqXHR);
770
- $modal = $(this.jq_obj.data('modal-container'));
771
- $modal.modal();
772
- }
773
- }),
774
- thin_man.ResetOnSubmitForm = thin_man.AjaxFormSubmission.extend({
775
- ajaxSuccess: function(data, textStatus, jqXHR) {
776
- this._super(data, textStatus, jqXHR);
777
- $(this.jq_obj).each(function() {
778
- this.reset();
779
- });
780
- }
781
- }),
782
- thin_man.DeleteLink = thin_man.AjaxSubmission.extend({
783
- ajaxSuccess: function(data, textStatus, jqXHR) {
784
- this._super(data, textStatus, jqXHR);
785
- if (this.jq_obj.data('replace-response')) {
786
- this.insertHtml(data);
787
- } else {
788
- if (this.target) {
789
- this.target.remove();
790
- }
791
- }
792
- },
793
- getTrigger: function() {
794
- this.trigger = this.jq_obj;
795
- },
796
- getAjaxType: function() {
797
- return 'DELETE';
798
- },
799
- getAjaxUrl: function() {
800
- return this.jq_obj.attr('href');
801
- },
802
- getData: function() {
803
- return { authenticity_token: $('[name="csrf-token"]').attr('content'), browser_tab_id: $("meta[name='browser_tab_id']").attr("content") };
804
- },
805
- getProcessData: function() {
806
- return true;
807
- },
808
- ajaxBefore: function(jqXHR) {
809
- if (!this.jq_obj.data('no-confirm')) {
810
- return confirm("Are you sure you want to delete this?");
811
- }
812
- }
813
- }),
814
- thin_man.ReplaceDelete = thin_man.DeleteLink.extend({
815
- ajaxSuccess: function(data, textStatus, jqXHR) {
816
- this.target[this.insert_method](data);
817
- },
818
- ajaxBefore: function(jqXHR) {
819
- //noop
646
+ )
647
+ return data_array;
648
+ } else {
649
+ // need to implement a data-attribute for multiple file fields so we can allow selecting mutliple files at once. example here:
650
+ // http://stackoverflow.com/questions/12989442/uploading-multiple-files-using-formdata
651
+ var fd = new FormData(this.jq_obj[0]);
652
+ if (button_name && button_value) {
653
+ if (typeof fd.set != 'undefined') {
654
+ fd.set(button_name, button_value)
655
+ } else if (typeof fd.append != 'undefined') {
656
+ fd.append(button_name, button_value)
820
657
  }
821
- }),
822
- thin_man.AjaxSortSubmission = thin_man.AjaxLinkSubmission.extend({
823
- init: function($form) {
824
- this.sort_field = $form.data('sort-field');
825
- this._super($form);
826
- },
827
- getAjaxUrl: function() {
828
- return this._super() + '?' + 'sort_field=' + this.sort_field + '&' + this.jq_obj.sortable("serialize");
829
- },
830
- getAjaxType: function() {
831
- return 'PUT';
832
- },
833
- ajaxSuccess: function() {
658
+ }
659
+ if (typeof fd.set != 'undefined') {
660
+ fd.set('thin_man_submitter', thin_man_submitter)
661
+ fd.set('browser_tab_id', browserTabId)
662
+ } else if (typeof fd.append != 'undefined') {
663
+ fd.append('thin_man_submitter', thin_man_submitter)
664
+ fd.append('browser_tab_id', browserTabId)
665
+ }
666
+ return fd
667
+ }
668
+ },
669
+ ajaxSuccess: function(data, textStatus, jqXHR) {
670
+ debug_logger.log('thin_man.AjaxFormSubmission.ajaxSuccess', 1, 'thin-man')
671
+ this._super(data, textStatus, jqXHR)
672
+ if (this.resetOnSuccess()) {
673
+ this.jq_obj[0].reset();
674
+ $(this.jq_obj).find('input[type=text],textarea,select').filter(':visible:first').focus();
675
+ }
676
+ },
677
+ resetOnSuccess: function() {
678
+ return this.jq_obj.data('reset-on-success')
679
+ },
680
+ getProcessData: function() {
681
+ if (this.getAjaxType().toLowerCase() == 'get') {
682
+ return true;
683
+ } else {
684
+ return false;
685
+ }
686
+ },
687
+ sendContentType: function() {
688
+ if (this.getAjaxType().toLowerCase() == 'get') {
689
+ return true;
690
+ } else {
691
+ return false;
692
+ }
693
+ },
694
+ getTrigger: function() {
695
+ this.trigger = this.jq_obj.find('button, input[type="submit"]');
696
+ if (this.trigger.length != 1) {
697
+ var $active_element = $(document.activeElement)
698
+ if ($active_element[0].nodeName.toLowerCase() != 'body') {
699
+ this.trigger = $active_element
700
+ }
701
+ }
702
+ },
703
+ hideTrigger: function() {
704
+ this.trigger.css('visibility', 'hidden');
705
+ },
706
+ showTrigger: function() {
707
+ this.trigger.css('visibility', 'visible');
708
+ }
709
+ }),
710
+ thin_man.AjaxLinkSubmission = thin_man.AjaxSubmission.extend({
711
+ getAjaxUrl: function() {
712
+ if (this.search_path) {
713
+ if (this.search_params) {
714
+ return this.search_path + '?' + this.search_params
715
+ } else {
716
+ return this.search_path
717
+ }
718
+ } else {
719
+ return this.jq_obj.attr('href');
720
+ }
721
+ },
722
+ getData: function() {
723
+ var this_data = { authenticity_token: $('[name="csrf-token"]').attr('content'), browser_tab_id: $("meta[name='browser_tab_id']").attr("content") };
724
+ if (this.jq_obj.data('form-data')) {
725
+ $.extend(this_data, this.jq_obj.data('form-data'))
726
+ }
727
+ return this_data
728
+ },
729
+ getProcessData: function() {
730
+ return true;
731
+ },
732
+ getAjaxType: function() {
733
+ return this.jq_obj.data('ajax-method') || 'GET'
734
+ },
735
+ getTrigger: function() {
736
+ this.trigger = this.jq_obj;
737
+ },
738
+ hideTrigger: function() {
739
+ this.trigger.css('visibility', 'hidden');
740
+ },
741
+ showTrigger: function() {
742
+ this.trigger.css('visibility', 'visible');
743
+ },
744
+ refocus: function() {
745
+ if (this.jq_obj.data('ajax-link-now')) {
746
+ return false
747
+ }
748
+ return true
749
+ },
834
750
 
835
- }
751
+ }),
752
+ thin_man.AjaxModalOpener = thin_man.AjaxLinkSubmission.extend({
753
+ ajaxSuccess: function(data, textStatus, jqXHR) {
754
+ this._super(data, textStatus, jqXHR);
755
+ $(this.jq_obj.data('ajax-modal')).modal();
756
+ }
757
+ }),
758
+ thin_man.AddALineForm = thin_man.AjaxFormSubmission.extend({
759
+ ajaxSuccess: function(data, textStatus, jqXHR) {
760
+ this._super(data, textStatus, jqXHR);
761
+ $(this.jq_obj.data('container')).empty();
762
+ },
763
+ ajaxError: function(jqXHR) {
764
+ this.insert_method = 'html';
765
+ this._super(jqXHR);
766
+ }
767
+ }),
768
+ thin_man.EmptyForm = thin_man.AjaxFormSubmission.extend({
769
+ ajaxSuccess: function(data, textStatus, jqXHR) {
770
+ var clicked_button = $("input[type=submit][clicked=true]")[0];
771
+ this._super(data, textStatus, jqXHR);
772
+ if ($(clicked_button).data('clone') != true) {
773
+ $(this.jq_obj)[0].reset();
774
+ };
775
+ $(this.jq_obj).find('input[type=text],textarea,select').filter(':visible:first').focus();
776
+ $("[data-autocomplete]").trigger("chosen:updated");
777
+ },
778
+ ajaxError: function(jqXHR) {
779
+ this.insert_method = 'html';
780
+ this._super(jqXHR);
781
+ }
782
+ }),
783
+ thin_man.ModalCloserForm = thin_man.AjaxFormSubmission.extend({
784
+ ajaxSuccess: function(data, textStatus, jqXHR) {
785
+ this._super(data, textStatus, jqXHR);
786
+ $modal = $(this.jq_obj.data('modal-container'));
787
+ $modal.modal('hide');
788
+ $modal.remove();
789
+ },
790
+ ajaxError: function(jqXHR) {
791
+ this._super(jqXHR);
792
+ $modal = $(this.jq_obj.data('modal-container'));
793
+ $modal.modal();
794
+ }
795
+ }),
796
+ thin_man.ResetOnSubmitForm = thin_man.AjaxFormSubmission.extend({
797
+ ajaxSuccess: function(data, textStatus, jqXHR) {
798
+ this._super(data, textStatus, jqXHR);
799
+ $(this.jq_obj).each(function() {
800
+ this.reset();
836
801
  });
802
+ }
803
+ }),
804
+ thin_man.DeleteLink = thin_man.AjaxSubmission.extend({
805
+ ajaxSuccess: function(data, textStatus, jqXHR) {
806
+ this._super(data, textStatus, jqXHR);
807
+ if (this.jq_obj.data('replace-response')) {
808
+ this.insertHtml(data);
809
+ } else {
810
+ if (this.target) {
811
+ this.target.remove();
812
+ }
813
+ }
814
+ },
815
+ getTrigger: function() {
816
+ this.trigger = this.jq_obj;
817
+ },
818
+ getAjaxType: function() {
819
+ return 'DELETE';
820
+ },
821
+ getAjaxUrl: function() {
822
+ return this.jq_obj.attr('href');
823
+ },
824
+ getData: function() {
825
+ return { authenticity_token: $('[name="csrf-token"]').attr('content'), browser_tab_id: $("meta[name='browser_tab_id']").attr("content") };
826
+ },
827
+ getProcessData: function() {
828
+ return true;
829
+ },
830
+ ajaxBefore: function(jqXHR) {
831
+ if (!this.jq_obj.data('no-confirm')) {
832
+ return confirm("Are you sure you want to delete this?");
833
+ }
834
+ }
835
+ }),
836
+ thin_man.ReplaceDelete = thin_man.DeleteLink.extend({
837
+ ajaxSuccess: function(data, textStatus, jqXHR) {
838
+ this.target[this.insert_method](data);
839
+ },
840
+ ajaxBefore: function(jqXHR) {
841
+ //noop
842
+ }
843
+ }),
844
+ thin_man.AjaxSortSubmission = thin_man.AjaxLinkSubmission.extend({
845
+ init: function($form) {
846
+ this.sort_field = $form.data('sort-field');
847
+ this._super($form);
848
+ },
849
+ getAjaxUrl: function() {
850
+ return this._super() + '?' + 'sort_field=' + this.sort_field + '&' + this.jq_obj.sortable("serialize");
851
+ },
852
+ getAjaxType: function() {
853
+ return 'PUT';
854
+ },
855
+ ajaxSuccess: function() {
837
856
 
838
- window.any_time_manager.registerListWithClasses({ 'sortable': 'AjaxSorter', 'ajax-link-now': 'AjaxLinkSubmission', 'ajax-form-now': 'AjaxFormSubmission' }, 'thin_man');
839
-
840
- $(document).ready(function() {
841
- $(document).on('click apiclick', '[data-ajax-link],[data-ajax-link-now]', function(e) {
842
- e.preventDefault();
843
- var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'), 'AjaxLinkSubmission'));
844
- var submission = new this_class($(this), { e: e });
845
- return false;
846
- });
857
+ }
858
+ });
847
859
 
848
- $(document).on('submit apisubmit', '[data-ajax-form]', function(e) {
849
- e.preventDefault();
850
- var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'), 'AjaxFormSubmission'));
851
- var submission = new this_class($(this), { e: e });
852
- return false;
853
- });
860
+ window.any_time_manager.registerListWithClasses({ 'sortable': 'AjaxSorter', 'ajax-link-now': 'AjaxLinkSubmission', 'ajax-form-now': 'AjaxFormSubmission' }, 'thin_man');
854
861
 
855
- $(document).on('click apiclick', '[data-ajax-delete]', function(e) {
856
- e.preventDefault();
857
- var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'), 'DeleteLink'));
858
- var deletion = new this_class($(this), { e: e });
859
- });
860
- $(document).on('click', '[data-change-url]', function(e) {
861
- e.preventDefault();
862
- new thin_man.AjaxPushState($(this))
863
- });
862
+ $(document).ready(function() {
863
+ $(document).on('click apiclick', '[data-ajax-link],[data-ajax-link-now]', function(e) {
864
+ e.preventDefault();
865
+ var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'), 'AjaxLinkSubmission'));
866
+ var submission = new this_class($(this), { e: e });
867
+ return false;
868
+ });
864
869
 
865
- $('[data-sortable]').each(function() {
866
- new thin_man.AjaxSorter($(this));
867
- });
870
+ $(document).on('submit apisubmit', '[data-ajax-form]', function(e) {
871
+ e.preventDefault();
872
+ var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'), 'AjaxFormSubmission'));
873
+ var submission = new this_class($(this), { e: e });
874
+ return false;
875
+ });
868
876
 
877
+ $(document).on('click apiclick', '[data-ajax-delete]', function(e) {
878
+ e.preventDefault();
879
+ var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'), 'DeleteLink'));
880
+ var deletion = new this_class($(this), { e: e });
881
+ });
882
+ $(document).on('click', '[data-change-url]', function(e) {
883
+ e.preventDefault();
884
+ new thin_man.AjaxPushState($(this))
885
+ });
869
886
 
887
+ $('[data-sortable]').each(function() {
888
+ new thin_man.AjaxSorter($(this));
870
889
  });
871
890
 
891
+ $(window).bind("popstate", function(e){
892
+ $('[data-thin-man-back-link]').remove()
893
+ var previous_state = e.originalEvent.state
894
+ var $back_link = $('<div>').
895
+ css({display: 'none'}).
896
+ attr('data-ajax-target',previous_state.target).
897
+ attr('href',previous_state.path).
898
+ attr('data-thin-man-back-link',true)
899
+ new AjaxLinkSubmission($back_link)
900
+ })
901
+
902
+ });
903
+
872
904
  };
873
905
 
874
906
  if (typeof Class === "undefined") {
875
- /* Simple JavaScript Inheritance
907
+ /* Simple JavaScript Inheritance
876
908
  * By John Resig http://ejohn.org/
877
909
  * MIT Licensed.
878
910
  */
879
- // Inspired by base2 and Prototype
880
- (function() {
881
- var initializing = false,
882
- fnTest = /xyz/.test(function() { xyz; }) ? /\b_super\b/ : /.*/;
883
- // The base Class implementation (does nothing)
884
- this.Class = function() {};
911
+ // Inspired by base2 and Prototype
912
+ (function() {
913
+ var initializing = false,
914
+ fnTest = /xyz/.test(function() { xyz; }) ? /\b_super\b/ : /.*/;
915
+ // The base Class implementation (does nothing)
916
+ this.Class = function() {};
885
917
 
886
- // Create a new Class that inherits from this class
887
- Class.extend = function(prop) {
888
- var _super = this.prototype;
918
+ // Create a new Class that inherits from this class
919
+ Class.extend = function(prop) {
920
+ var _super = this.prototype;
889
921
 
890
- // Instantiate a base class (but only create the instance,
891
- // don't run the init constructor)
892
- initializing = true;
893
- var prototype = new this();
894
- initializing = false;
922
+ // Instantiate a base class (but only create the instance,
923
+ // don't run the init constructor)
924
+ initializing = true;
925
+ var prototype = new this();
926
+ initializing = false;
895
927
 
896
- // Copy the properties over onto the new prototype
897
- for (var name in prop) {
898
- // Check if we're overwriting an existing function
899
- prototype[name] = typeof prop[name] == "function" &&
900
- typeof _super[name] == "function" && fnTest.test(prop[name]) ?
901
- (function(name, fn) {
902
- return function() {
903
- var tmp = this._super;
928
+ // Copy the properties over onto the new prototype
929
+ for (var name in prop) {
930
+ // Check if we're overwriting an existing function
931
+ prototype[name] = typeof prop[name] == "function" &&
932
+ typeof _super[name] == "function" && fnTest.test(prop[name]) ?
933
+ (function(name, fn) {
934
+ return function() {
935
+ var tmp = this._super;
904
936
 
905
- // Add a new ._super() method that is the same method
906
- // but on the super-class
907
- this._super = _super[name];
937
+ // Add a new ._super() method that is the same method
938
+ // but on the super-class
939
+ this._super = _super[name];
908
940
 
909
- // The method only need to be bound temporarily, so we
910
- // remove it when we're done executing
911
- var ret = fn.apply(this, arguments);
912
- this._super = tmp;
941
+ // The method only need to be bound temporarily, so we
942
+ // remove it when we're done executing
943
+ var ret = fn.apply(this, arguments);
944
+ this._super = tmp;
913
945
 
914
- return ret;
915
- };
916
- })(name, prop[name]) :
917
- prop[name];
918
- }
946
+ return ret;
947
+ };
948
+ })(name, prop[name]) :
949
+ prop[name];
950
+ }
919
951
 
920
- // The dummy class constructor
921
- function Class() {
922
- // All construction is actually done in the init method
923
- if (!initializing && this.init)
924
- this.init.apply(this, arguments);
925
- }
952
+ // The dummy class constructor
953
+ function Class() {
954
+ // All construction is actually done in the init method
955
+ if (!initializing && this.init)
956
+ this.init.apply(this, arguments);
957
+ }
926
958
 
927
- // Populate our constructed prototype object
928
- Class.prototype = prototype;
959
+ // Populate our constructed prototype object
960
+ Class.prototype = prototype;
929
961
 
930
- // Enforce the constructor to be what we expect
931
- Class.prototype.constructor = Class;
962
+ // Enforce the constructor to be what we expect
963
+ Class.prototype.constructor = Class;
932
964
 
933
- // And make this class extendable
934
- Class.extend = arguments.callee;
965
+ // And make this class extendable
966
+ Class.extend = arguments.callee;
935
967
 
936
- return Class;
937
- };
938
- })();
968
+ return Class;
969
+ };
970
+ })();
939
971
  }
940
972
 
941
973
  if (typeof UUID == 'undefined') {
942
- var UUID = Class.extend({
943
- init: function() {
944
- this.value = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
945
- var r = Math.random() * 16 | 0,
946
- v = c == 'x' ? r : (r & 0x3 | 0x8);
947
- return v.toString(16);
948
- });
949
- }
950
- })
974
+ var UUID = Class.extend({
975
+ init: function() {
976
+ this.value = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
977
+ var r = Math.random() * 16 | 0,
978
+ v = c == 'x' ? r : (r & 0x3 | 0x8);
979
+ return v.toString(16);
980
+ });
981
+ }
982
+ })
951
983
  }
952
984
 
953
985
  if (typeof window.any_time_manager === "undefined" && typeof window.loading_any_time_manager === "undefined") {
954
- //Anytime loader, simulates load events for ajax requests
955
- function getSubClass(sub_class_name, parent_class) {
956
- if ((typeof(sub_class_name) == 'string') && (sub_class_name != '') && (sub_class_name != 'true')) {
957
- var this_class = sub_class_name;
958
- } else {
959
- var this_class = parent_class;
960
- }
961
- return this_class;
962
- };
986
+ //Anytime loader, simulates load events for ajax requests
987
+ function getSubClass(sub_class_name, parent_class) {
988
+ if ((typeof(sub_class_name) == 'string') && (sub_class_name != '') && (sub_class_name != 'true')) {
989
+ var this_class = sub_class_name;
990
+ } else {
991
+ var this_class = parent_class;
992
+ }
993
+ return this_class;
994
+ };
963
995
 
964
- String.prototype.toCapCamel = function() {
965
- camel = this.replace(/[-_]([a-z])/g, function(g) { return g.replace(/[-_]/, '').charAt(0).toUpperCase(); });
966
- return camel.charAt(0).toUpperCase() + camel.slice(1);
967
- };
996
+ String.prototype.toCapCamel = function() {
997
+ camel = this.replace(/[-_]([a-z])/g, function(g) { return g.replace(/[-_]/, '').charAt(0).toUpperCase(); });
998
+ return camel.charAt(0).toUpperCase() + camel.slice(1);
999
+ };
968
1000
 
969
- var AnyTimeManager = Class.extend({
970
- init: function() {
971
- this.loader_array = []
972
- },
973
- register: function(data_attribute, load_method, base_class, namespace) {
974
- if (!namespace) { namespace = '' } else { namespace = namespace + '.' }
975
- this.loader_array.push({ data_attribute: data_attribute, base_class: base_class, load_method: load_method, namespace: namespace });
976
- },
977
- registerList: function(list, namespace) {
978
- var anytime_manager = this;
979
- $.each(list, function() {
980
- anytime_manager.register(this + '', 'instantiate', null, namespace)
981
- })
982
- },
983
- registerListWithClasses: function(list, namespace) {
984
- var anytime_manager = this;
985
- $.each(list, function(attr, klass) {
986
- anytime_manager.register(attr, 'instantiate', klass, namespace)
987
- })
988
- },
989
- registerRunList: function(list) {
990
- var anytime_manager = this;
991
- $.each(list, function(attr, method) {
992
- anytime_manager.register(attr, method, null)
993
- })
994
- },
995
- instantiate: function(jq_obj, class_name) {
996
- if (!jq_obj.data('anytime_loaded')) {
997
- jq_obj.data('anytime_loaded', true);
998
- var this_class = eval(class_name);
999
- new this_class(jq_obj);
1000
- }
1001
- },
1002
- run: function(jq_obj, resource, method_name) {
1003
- if (!jq_obj.data('anytime_run')) {
1004
- jq_obj.data('anytime_run', true);
1005
- resource[method_name](jq_obj);
1006
- }
1007
- },
1008
- load: function() {
1009
- var atm = this;
1010
- $.each(atm.loader_array, function() {
1011
- var data_attribute = this['data_attribute'];
1012
- var base_class = this['base_class'];
1013
- if (!base_class) {
1014
- base_class = data_attribute.toCapCamel();
1015
- }
1016
- var this_method = this['load_method'];
1017
- var namespace = this['namespace'];
1018
- $('[data-' + data_attribute + ']').each(function() {
1019
- if ('instantiate' == this_method) {
1020
- var declared_class = $(this).data('sub-type');
1021
- var this_class = getSubClass(declared_class, base_class);
1022
- this_class = namespace + this_class;
1023
- atm.instantiate($(this), this_class);
1024
- } else {
1025
- atm.run($(this), base_class, this_method);
1026
- }
1027
-
1028
- });
1029
- });
1001
+ var AnyTimeManager = Class.extend({
1002
+ init: function() {
1003
+ this.loader_array = []
1004
+ },
1005
+ register: function(data_attribute, load_method, base_class, namespace) {
1006
+ if (!namespace) { namespace = '' } else { namespace = namespace + '.' }
1007
+ this.loader_array.push({ data_attribute: data_attribute, base_class: base_class, load_method: load_method, namespace: namespace });
1008
+ },
1009
+ registerList: function(list, namespace) {
1010
+ var anytime_manager = this;
1011
+ $.each(list, function() {
1012
+ anytime_manager.register(this + '', 'instantiate', null, namespace)
1013
+ })
1014
+ },
1015
+ registerListWithClasses: function(list, namespace) {
1016
+ var anytime_manager = this;
1017
+ $.each(list, function(attr, klass) {
1018
+ anytime_manager.register(attr, 'instantiate', klass, namespace)
1019
+ })
1020
+ },
1021
+ registerRunList: function(list) {
1022
+ var anytime_manager = this;
1023
+ $.each(list, function(attr, method) {
1024
+ anytime_manager.register(attr, method, null)
1025
+ })
1026
+ },
1027
+ instantiate: function(jq_obj, class_name) {
1028
+ if (!jq_obj.data('anytime_loaded')) {
1029
+ jq_obj.data('anytime_loaded', true);
1030
+ var this_class = eval(class_name);
1031
+ new this_class(jq_obj);
1032
+ }
1033
+ },
1034
+ run: function(jq_obj, resource, method_name) {
1035
+ if (!jq_obj.data('anytime_run')) {
1036
+ jq_obj.data('anytime_run', true);
1037
+ resource[method_name](jq_obj);
1038
+ }
1039
+ },
1040
+ load: function() {
1041
+ var atm = this;
1042
+ $.each(atm.loader_array, function() {
1043
+ var data_attribute = this['data_attribute'];
1044
+ var base_class = this['base_class'];
1045
+ if (!base_class) {
1046
+ base_class = data_attribute.toCapCamel();
1030
1047
  }
1031
- });
1032
- window.any_time_manager = new AnyTimeManager();
1033
- $(document).ajaxComplete(function() {
1034
- window.any_time_manager.load();
1035
- });
1036
- $(document).ready(function() {
1037
- if (typeof window.any_time_load_functions != 'undefined') {
1038
- $.each(window.any_time_load_functions, function(i, func) {
1039
- func();
1040
- });
1041
- }
1042
- window.any_time_manager.load();
1043
- })
1044
- // End AnyTime library
1048
+ var this_method = this['load_method'];
1049
+ var namespace = this['namespace'];
1050
+ $('[data-' + data_attribute + ']').each(function() {
1051
+ if ('instantiate' == this_method) {
1052
+ var declared_class = $(this).data('sub-type');
1053
+ var this_class = getSubClass(declared_class, base_class);
1054
+ this_class = namespace + this_class;
1055
+ atm.instantiate($(this), this_class);
1056
+ } else {
1057
+ atm.run($(this), base_class, this_method);
1058
+ }
1059
+
1060
+ });
1061
+ });
1062
+ }
1063
+ });
1064
+ window.any_time_manager = new AnyTimeManager();
1065
+ $(document).ajaxComplete(function() {
1066
+ window.any_time_manager.load();
1067
+ });
1068
+ $(document).ready(function() {
1069
+ if (typeof window.any_time_load_functions != 'undefined') {
1070
+ $.each(window.any_time_load_functions, function(i, func) {
1071
+ func();
1072
+ });
1073
+ }
1074
+ window.any_time_manager.load();
1075
+ })
1076
+ // End AnyTime library
1045
1077
  }
1046
1078
 
1047
1079
  initThinMan();