transit 0.0.1 → 0.0.2

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.
Files changed (186) hide show
  1. data/Gemfile +19 -11
  2. data/app/assets/images/transit/icon24x24.png +0 -0
  3. data/app/assets/images/transit/icon24x24_files.png +0 -0
  4. data/app/assets/images/transit/jplayer.swf +0 -0
  5. data/app/assets/images/transit/uploadify.swf +0 -0
  6. data/app/assets/images/transit/video_player.swf +0 -0
  7. data/app/assets/javascripts/jqtools/expose.js +224 -0
  8. data/app/assets/javascripts/jqtools/flashembed.js +300 -0
  9. data/app/assets/javascripts/jqtools/overlay.js +294 -0
  10. data/app/assets/javascripts/jqtools/scrollable.js +3 -0
  11. data/app/assets/javascripts/jqtools/scrollable/autoscroll.js +81 -0
  12. data/app/assets/javascripts/jqtools/scrollable/base.js +335 -0
  13. data/app/assets/javascripts/jqtools/scrollable/navigator.js +139 -0
  14. data/app/assets/javascripts/jqtools/validator.js +590 -0
  15. data/app/assets/javascripts/jqueryui/accordion.js +611 -0
  16. data/app/assets/javascripts/jqueryui/autocomplete.js +612 -0
  17. data/app/assets/javascripts/jqueryui/button.js +388 -0
  18. data/app/assets/javascripts/jqueryui/core.js +312 -0
  19. data/app/assets/javascripts/jqueryui/datepicker.js +1791 -0
  20. data/app/assets/javascripts/jqueryui/dialog.js +878 -0
  21. data/app/assets/javascripts/jqueryui/draggable.js +815 -0
  22. data/app/assets/javascripts/jqueryui/droppable.js +285 -0
  23. data/app/assets/javascripts/jqueryui/effects/blind.js +49 -0
  24. data/app/assets/javascripts/jqueryui/effects/bounce.js +78 -0
  25. data/app/assets/javascripts/jqueryui/effects/clip.js +54 -0
  26. data/app/assets/javascripts/jqueryui/effects/core.js +746 -0
  27. data/app/assets/javascripts/jqueryui/effects/drop.js +50 -0
  28. data/app/assets/javascripts/jqueryui/effects/explode.js +79 -0
  29. data/app/assets/javascripts/jqueryui/effects/fade.js +32 -0
  30. data/app/assets/javascripts/jqueryui/effects/fold.js +56 -0
  31. data/app/assets/javascripts/jqueryui/effects/highlight.js +50 -0
  32. data/app/assets/javascripts/jqueryui/effects/pulsate.js +51 -0
  33. data/app/assets/javascripts/jqueryui/effects/scale.js +178 -0
  34. data/app/assets/javascripts/jqueryui/effects/shake.js +57 -0
  35. data/app/assets/javascripts/jqueryui/effects/slide.js +50 -0
  36. data/app/assets/javascripts/jqueryui/effects/transfer.js +45 -0
  37. data/app/assets/javascripts/jqueryui/mouse.js +160 -0
  38. data/app/assets/javascripts/jqueryui/position.js +252 -0
  39. data/app/assets/javascripts/jqueryui/progressbar.js +109 -0
  40. data/app/assets/javascripts/jqueryui/resizable.js +814 -0
  41. data/app/assets/javascripts/jqueryui/selectable.js +266 -0
  42. data/app/assets/javascripts/jqueryui/slider.js +666 -0
  43. data/app/assets/javascripts/jqueryui/sortable.js +1077 -0
  44. data/app/assets/javascripts/jqueryui/tabs.js +758 -0
  45. data/app/assets/javascripts/jqueryui/widget.js +262 -0
  46. data/app/assets/javascripts/libs/backbone.js +1152 -0
  47. data/app/assets/javascripts/libs/cookie.js +89 -0
  48. data/app/assets/javascripts/libs/fileinput.js +130 -0
  49. data/app/assets/javascripts/libs/jplayer.js +1768 -0
  50. data/app/assets/javascripts/libs/proper.js +541 -0
  51. data/app/assets/javascripts/libs/sanitize.js +282 -0
  52. data/app/assets/javascripts/libs/selecttolist.js +75 -0
  53. data/app/assets/javascripts/libs/underscore.js +807 -0
  54. data/app/assets/javascripts/libs/uploadify.js +677 -0
  55. data/app/assets/javascripts/libs/wymeditor.js +9538 -0
  56. data/app/assets/javascripts/transit.js +4 -0
  57. data/app/assets/javascripts/transit/admin.js +22 -0
  58. data/app/assets/javascripts/transit/admin/contexts.js +52 -0
  59. data/app/assets/javascripts/transit/admin/fields.js +36 -0
  60. data/app/assets/javascripts/transit/admin/upload.js +109 -0
  61. data/app/assets/javascripts/transit/config.js.erb +101 -0
  62. data/app/assets/javascripts/transit/contexts/audio.js +39 -0
  63. data/app/assets/javascripts/transit/contexts/video.js +79 -0
  64. data/app/assets/javascripts/transit/core.js +171 -0
  65. data/app/assets/javascripts/transit/frontend.js +3 -0
  66. data/app/assets/javascripts/transit/lib/base64.js +120 -0
  67. data/app/assets/javascripts/transit/lib/editor.js +177 -0
  68. data/app/assets/javascripts/transit/views/audio_player.jst +22 -0
  69. data/app/assets/javascripts/transit/views/editor_toolbar.jst +12 -0
  70. data/app/assets/javascripts/transit/views/file_upload.jst +5 -0
  71. data/app/assets/javascripts/transit/views/video_player.jst +20 -0
  72. data/app/assets/javascripts/transit/views/wym_box.jst +4 -0
  73. data/app/assets/javascripts/transit/views/wym_iframe.jst +3 -0
  74. data/app/assets/stylesheets/transit.css.scss.erb +42 -0
  75. data/app/assets/stylesheets/transit/forms.css.scss +66 -0
  76. data/app/assets/stylesheets/transit/media/audio.css.scss +65 -0
  77. data/app/assets/stylesheets/transit/media/video.css.scss +30 -0
  78. data/app/assets/stylesheets/transit/panel.css.scss +100 -0
  79. data/app/assets/stylesheets/transit/ui.css.scss +507 -0
  80. data/app/controllers/pages_controller.rb +3 -0
  81. data/app/controllers/posts_controller.rb +3 -0
  82. data/app/controllers/transit/assets_controller.rb +38 -0
  83. data/app/controllers/transit/contexts_controller.rb +12 -9
  84. data/app/controllers/transit/pages_controller.rb +26 -0
  85. data/app/controllers/transit/posts_controller.rb +31 -0
  86. data/app/controllers/transit/topics_controller.rb +5 -0
  87. data/app/controllers/transit_controller.rb +16 -0
  88. data/app/helpers/transit/admin_helper.rb +43 -0
  89. data/app/helpers/transit/form_helper.rb +17 -0
  90. data/app/helpers/transit/package_helper.rb +41 -0
  91. data/app/helpers/transit/pagination_helper.rb +58 -0
  92. data/app/helpers/transit_helper.rb +42 -0
  93. data/app/models/comment.rb +37 -0
  94. data/app/models/contexts/audio.rb +12 -0
  95. data/app/models/{text.rb → contexts/text.rb} +0 -0
  96. data/app/models/contexts/video.rb +24 -0
  97. data/app/models/topic.rb +19 -0
  98. data/app/models/transit/asset.rb +68 -0
  99. data/{lib → app/models}/transit/context.rb +29 -0
  100. data/app/views/contexts/_text.html.erb +1 -1
  101. data/app/views/posts/index.rss.builder +18 -0
  102. data/app/views/transit/assets/_file.html.erb +4 -0
  103. data/app/views/transit/assets/_image.html.erb +13 -0
  104. data/app/views/transit/assets/create.js.erb +8 -0
  105. data/app/views/transit/assets/destroy.js.erb +3 -0
  106. data/app/views/transit/assets/manage.html.erb +20 -0
  107. data/app/views/transit/contexts/_audio.html.erb +18 -0
  108. data/app/views/transit/contexts/_text.html.erb +6 -0
  109. data/app/views/transit/contexts/_video.html.erb +13 -0
  110. data/app/views/transit/contexts/destroy.js.erb +1 -0
  111. data/app/views/transit/contexts/index.html.erb +5 -0
  112. data/app/views/transit/contexts/new.js.erb +7 -0
  113. data/app/views/transit/contexts/show.html.erb +8 -0
  114. data/app/views/transit/index.html.erb +26 -0
  115. data/app/views/transit/index.js.erb +1 -0
  116. data/app/views/transit/interface/post_panel.html.erb +96 -0
  117. data/app/views/transit/pages/_table.html.erb +7 -0
  118. data/app/views/transit/pages/edit.html.erb +17 -0
  119. data/app/views/transit/pages/index.html.erb +17 -0
  120. data/app/views/transit/pages/update.js.erb +1 -0
  121. data/app/views/transit/posts/_form.html.erb +49 -0
  122. data/app/views/transit/posts/edit.html.erb +14 -0
  123. data/app/views/transit/posts/new.html.erb +21 -0
  124. data/app/views/transit/table.html.erb +13 -0
  125. data/app/views/transit/table.js.erb +8 -0
  126. data/app/views/transit/topics/manage.html.erb +28 -0
  127. data/config/locales/en.yml +22 -0
  128. data/config/routes.rb +3 -3
  129. data/lib/transit.rb +51 -17
  130. data/lib/transit/admin.rb +85 -0
  131. data/lib/transit/builders/form_builder.rb +319 -0
  132. data/lib/transit/builders/jst_builder.rb +38 -0
  133. data/lib/transit/builders/package_builder.rb +45 -0
  134. data/lib/transit/config.rb +20 -0
  135. data/lib/transit/controller/generator.rb +42 -0
  136. data/lib/transit/controller/responder.rb +34 -0
  137. data/lib/transit/core_ext.rb +18 -0
  138. data/lib/transit/errors/resource_not_found.rb +6 -0
  139. data/lib/transit/model/assets.rb +14 -0
  140. data/lib/transit/model/attachments.rb +55 -0
  141. data/lib/transit/model/auto_increment.rb +22 -0
  142. data/lib/transit/model/base.rb +56 -0
  143. data/lib/transit/model/comments.rb +19 -0
  144. data/lib/transit/model/hooks.rb +38 -0
  145. data/lib/transit/model/owners.rb +14 -0
  146. data/lib/transit/model/paginator.rb +92 -0
  147. data/lib/transit/model/topics.rb +14 -0
  148. data/lib/transit/package/page.rb +20 -12
  149. data/lib/transit/package/post.rb +87 -33
  150. data/lib/transit/package/post/validations.rb +14 -0
  151. data/lib/transit/rails/engine.rb +29 -13
  152. data/lib/transit/rails/railtie.rb +31 -0
  153. data/lib/transit/rails/routing.rb +11 -6
  154. data/lib/transit/services.rb +13 -0
  155. data/lib/transit/services/base.rb +14 -0
  156. data/lib/transit/services/facebook.rb +13 -0
  157. data/lib/transit/services/ted.rb +10 -0
  158. data/lib/transit/services/twitter.rb +13 -0
  159. data/lib/transit/services/vimeo.rb +10 -0
  160. data/lib/transit/services/you_tube.rb +12 -0
  161. data/lib/transit/version.rb +1 -1
  162. metadata +178 -31
  163. data/app/assets/stylesheets/includes/_compat.scss +0 -24
  164. data/app/assets/stylesheets/includes/_defaults.scss +0 -99
  165. data/app/assets/stylesheets/includes/_global.scss +0 -16
  166. data/app/assets/stylesheets/includes/_imports.scss +0 -27
  167. data/app/assets/stylesheets/includes/_mixins.scss +0 -38
  168. data/app/assets/stylesheets/includes/_setup.scss +0 -85
  169. data/app/assets/stylesheets/layout.css.scss +0 -29
  170. data/app/assets/stylesheets/transit.css +0 -3
  171. data/app/controllers/application_controller.rb +0 -5
  172. data/app/controllers/transit/index_controller.rb +0 -7
  173. data/app/controllers/transit/packages_controller.rb +0 -64
  174. data/app/controllers/transit/transit_controller.rb +0 -4
  175. data/app/helpers/routing_helpers.rb +0 -7
  176. data/app/models/audio.rb +0 -4
  177. data/app/models/package_asset.rb +0 -11
  178. data/app/models/video.rb +0 -8
  179. data/app/views/contexts/_audio.html.erb +0 -1
  180. data/app/views/contexts/_video.html.erb +0 -1
  181. data/app/views/layouts/transit.html.erb +0 -31
  182. data/app/views/transit/index/index.html.erb +0 -0
  183. data/lib/transit/helpers/controller_helpers.rb +0 -40
  184. data/lib/transit/helpers/model_helpers.rb +0 -26
  185. data/lib/transit/package.rb +0 -25
  186. data/lib/transit/package/base.rb +0 -49
@@ -0,0 +1,878 @@
1
+ /*
2
+ * jQuery UI Dialog 1.8.13
3
+ *
4
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI/Dialog
9
+ *
10
+ * Depends:
11
+ * jquery.ui.core.js
12
+ * jquery.ui.widget.js
13
+ * jquery.ui.button.js
14
+ * jquery.ui.draggable.js
15
+ * jquery.ui.mouse.js
16
+ * jquery.ui.position.js
17
+ * jquery.ui.resizable.js
18
+ */
19
+ (function( $, undefined ) {
20
+
21
+ var uiDialogClasses =
22
+ 'ui-dialog ' +
23
+ 'ui-widget ' +
24
+ 'ui-widget-content ' +
25
+ 'ui-corner-all ',
26
+ sizeRelatedOptions = {
27
+ buttons: true,
28
+ height: true,
29
+ maxHeight: true,
30
+ maxWidth: true,
31
+ minHeight: true,
32
+ minWidth: true,
33
+ width: true
34
+ },
35
+ resizableRelatedOptions = {
36
+ maxHeight: true,
37
+ maxWidth: true,
38
+ minHeight: true,
39
+ minWidth: true
40
+ },
41
+ // support for jQuery 1.3.2 - handle common attrFn methods for dialog
42
+ attrFn = $.attrFn || {
43
+ val: true,
44
+ css: true,
45
+ html: true,
46
+ text: true,
47
+ data: true,
48
+ width: true,
49
+ height: true,
50
+ offset: true,
51
+ click: true
52
+ };
53
+
54
+ $.widget("ui.dialog", {
55
+ options: {
56
+ autoOpen: true,
57
+ buttons: {},
58
+ closeOnEscape: true,
59
+ closeText: 'close',
60
+ dialogClass: '',
61
+ draggable: true,
62
+ hide: null,
63
+ height: 'auto',
64
+ maxHeight: false,
65
+ maxWidth: false,
66
+ minHeight: 150,
67
+ minWidth: 150,
68
+ modal: false,
69
+ position: {
70
+ my: 'center',
71
+ at: 'center',
72
+ collision: 'fit',
73
+ // ensure that the titlebar is never outside the document
74
+ using: function(pos) {
75
+ var topOffset = $(this).css(pos).offset().top;
76
+ if (topOffset < 0) {
77
+ $(this).css('top', pos.top - topOffset);
78
+ }
79
+ }
80
+ },
81
+ resizable: true,
82
+ show: null,
83
+ stack: true,
84
+ title: '',
85
+ width: 300,
86
+ zIndex: 1000
87
+ },
88
+
89
+ _create: function() {
90
+ this.originalTitle = this.element.attr('title');
91
+ // #5742 - .attr() might return a DOMElement
92
+ if ( typeof this.originalTitle !== "string" ) {
93
+ this.originalTitle = "";
94
+ }
95
+
96
+ this.options.title = this.options.title || this.originalTitle;
97
+ var self = this,
98
+ options = self.options,
99
+
100
+ title = options.title || '&#160;',
101
+ titleId = $.ui.dialog.getTitleId(self.element),
102
+
103
+ uiDialog = (self.uiDialog = $('<div></div>'))
104
+ .appendTo(document.body)
105
+ .hide()
106
+ .addClass(uiDialogClasses + options.dialogClass)
107
+ .css({
108
+ zIndex: options.zIndex
109
+ })
110
+ // setting tabIndex makes the div focusable
111
+ // setting outline to 0 prevents a border on focus in Mozilla
112
+ .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
113
+ if (options.closeOnEscape && event.keyCode &&
114
+ event.keyCode === $.ui.keyCode.ESCAPE) {
115
+
116
+ self.close(event);
117
+ event.preventDefault();
118
+ }
119
+ })
120
+ .attr({
121
+ role: 'dialog',
122
+ 'aria-labelledby': titleId
123
+ })
124
+ .mousedown(function(event) {
125
+ self.moveToTop(false, event);
126
+ }),
127
+
128
+ uiDialogContent = self.element
129
+ .show()
130
+ .removeAttr('title')
131
+ .addClass(
132
+ 'ui-dialog-content ' +
133
+ 'ui-widget-content')
134
+ .appendTo(uiDialog),
135
+
136
+ uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
137
+ .addClass(
138
+ 'ui-dialog-titlebar ' +
139
+ 'ui-widget-header ' +
140
+ 'ui-corner-all ' +
141
+ 'ui-helper-clearfix'
142
+ )
143
+ .prependTo(uiDialog),
144
+
145
+ uiDialogTitlebarClose = $('<a href="#"></a>')
146
+ .addClass(
147
+ 'ui-dialog-titlebar-close ' +
148
+ 'ui-corner-all'
149
+ )
150
+ .attr('role', 'button')
151
+ .hover(
152
+ function() {
153
+ uiDialogTitlebarClose.addClass('ui-state-hover');
154
+ },
155
+ function() {
156
+ uiDialogTitlebarClose.removeClass('ui-state-hover');
157
+ }
158
+ )
159
+ .focus(function() {
160
+ uiDialogTitlebarClose.addClass('ui-state-focus');
161
+ })
162
+ .blur(function() {
163
+ uiDialogTitlebarClose.removeClass('ui-state-focus');
164
+ })
165
+ .click(function(event) {
166
+ self.close(event);
167
+ return false;
168
+ })
169
+ .appendTo(uiDialogTitlebar),
170
+
171
+ uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
172
+ .addClass(
173
+ 'ui-icon ' +
174
+ 'ui-icon-closethick'
175
+ )
176
+ .text(options.closeText)
177
+ .appendTo(uiDialogTitlebarClose),
178
+
179
+ uiDialogTitle = $('<span></span>')
180
+ .addClass('ui-dialog-title')
181
+ .attr('id', titleId)
182
+ .html(title)
183
+ .prependTo(uiDialogTitlebar);
184
+
185
+ //handling of deprecated beforeclose (vs beforeClose) option
186
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
187
+ //TODO: remove in 1.9pre
188
+ if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
189
+ options.beforeClose = options.beforeclose;
190
+ }
191
+
192
+ uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
193
+
194
+ if (options.draggable && $.fn.draggable) {
195
+ self._makeDraggable();
196
+ }
197
+ if (options.resizable && $.fn.resizable) {
198
+ self._makeResizable();
199
+ }
200
+
201
+ self._createButtons(options.buttons);
202
+ self._isOpen = false;
203
+
204
+ if ($.fn.bgiframe) {
205
+ uiDialog.bgiframe();
206
+ }
207
+ },
208
+
209
+ _init: function() {
210
+ if ( this.options.autoOpen ) {
211
+ this.open();
212
+ }
213
+ },
214
+
215
+ destroy: function() {
216
+ var self = this;
217
+
218
+ if (self.overlay) {
219
+ self.overlay.destroy();
220
+ }
221
+ self.uiDialog.hide();
222
+ self.element
223
+ .unbind('.dialog')
224
+ .removeData('dialog')
225
+ .removeClass('ui-dialog-content ui-widget-content')
226
+ .hide().appendTo('body');
227
+ self.uiDialog.remove();
228
+
229
+ if (self.originalTitle) {
230
+ self.element.attr('title', self.originalTitle);
231
+ }
232
+
233
+ return self;
234
+ },
235
+
236
+ widget: function() {
237
+ return this.uiDialog;
238
+ },
239
+
240
+ close: function(event) {
241
+ var self = this,
242
+ maxZ, thisZ;
243
+
244
+ if (false === self._trigger('beforeClose', event)) {
245
+ return;
246
+ }
247
+
248
+ if (self.overlay) {
249
+ self.overlay.destroy();
250
+ }
251
+ self.uiDialog.unbind('keypress.ui-dialog');
252
+
253
+ self._isOpen = false;
254
+
255
+ if (self.options.hide) {
256
+ self.uiDialog.hide(self.options.hide, function() {
257
+ self._trigger('close', event);
258
+ });
259
+ } else {
260
+ self.uiDialog.hide();
261
+ self._trigger('close', event);
262
+ }
263
+
264
+ $.ui.dialog.overlay.resize();
265
+
266
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
267
+ if (self.options.modal) {
268
+ maxZ = 0;
269
+ $('.ui-dialog').each(function() {
270
+ if (this !== self.uiDialog[0]) {
271
+ thisZ = $(this).css('z-index');
272
+ if(!isNaN(thisZ)) {
273
+ maxZ = Math.max(maxZ, thisZ);
274
+ }
275
+ }
276
+ });
277
+ $.ui.dialog.maxZ = maxZ;
278
+ }
279
+
280
+ return self;
281
+ },
282
+
283
+ isOpen: function() {
284
+ return this._isOpen;
285
+ },
286
+
287
+ // the force parameter allows us to move modal dialogs to their correct
288
+ // position on open
289
+ moveToTop: function(force, event) {
290
+ var self = this,
291
+ options = self.options,
292
+ saveScroll;
293
+
294
+ if ((options.modal && !force) ||
295
+ (!options.stack && !options.modal)) {
296
+ return self._trigger('focus', event);
297
+ }
298
+
299
+ if (options.zIndex > $.ui.dialog.maxZ) {
300
+ $.ui.dialog.maxZ = options.zIndex;
301
+ }
302
+ if (self.overlay) {
303
+ $.ui.dialog.maxZ += 1;
304
+ self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
305
+ }
306
+
307
+ //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
308
+ // http://ui.jquery.com/bugs/ticket/3193
309
+ saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
310
+ $.ui.dialog.maxZ += 1;
311
+ self.uiDialog.css('z-index', $.ui.dialog.maxZ);
312
+ self.element.attr(saveScroll);
313
+ self._trigger('focus', event);
314
+
315
+ return self;
316
+ },
317
+
318
+ open: function() {
319
+ if (this._isOpen) { return; }
320
+
321
+ var self = this,
322
+ options = self.options,
323
+ uiDialog = self.uiDialog;
324
+
325
+ self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
326
+ self._size();
327
+ self._position(options.position);
328
+ uiDialog.show(options.show);
329
+ self.moveToTop(true);
330
+
331
+ // prevent tabbing out of modal dialogs
332
+ if (options.modal) {
333
+ uiDialog.bind('keypress.ui-dialog', function(event) {
334
+ if (event.keyCode !== $.ui.keyCode.TAB) {
335
+ return;
336
+ }
337
+
338
+ var tabbables = $(':tabbable', this),
339
+ first = tabbables.filter(':first'),
340
+ last = tabbables.filter(':last');
341
+
342
+ if (event.target === last[0] && !event.shiftKey) {
343
+ first.focus(1);
344
+ return false;
345
+ } else if (event.target === first[0] && event.shiftKey) {
346
+ last.focus(1);
347
+ return false;
348
+ }
349
+ });
350
+ }
351
+
352
+ // set focus to the first tabbable element in the content area or the first button
353
+ // if there are no tabbable elements, set focus on the dialog itself
354
+ $(self.element.find(':tabbable').get().concat(
355
+ uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
356
+ uiDialog.get()))).eq(0).focus();
357
+
358
+ self._isOpen = true;
359
+ self._trigger('open');
360
+
361
+ return self;
362
+ },
363
+
364
+ _createButtons: function(buttons) {
365
+ var self = this,
366
+ hasButtons = false,
367
+ uiDialogButtonPane = $('<div></div>')
368
+ .addClass(
369
+ 'ui-dialog-buttonpane ' +
370
+ 'ui-widget-content ' +
371
+ 'ui-helper-clearfix'
372
+ ),
373
+ uiButtonSet = $( "<div></div>" )
374
+ .addClass( "ui-dialog-buttonset" )
375
+ .appendTo( uiDialogButtonPane );
376
+
377
+ // if we already have a button pane, remove it
378
+ self.uiDialog.find('.ui-dialog-buttonpane').remove();
379
+
380
+ if (typeof buttons === 'object' && buttons !== null) {
381
+ $.each(buttons, function() {
382
+ return !(hasButtons = true);
383
+ });
384
+ }
385
+ if (hasButtons) {
386
+ $.each(buttons, function(name, props) {
387
+ props = $.isFunction( props ) ?
388
+ { click: props, text: name } :
389
+ props;
390
+ var button = $('<button type="button"></button>')
391
+ .click(function() {
392
+ props.click.apply(self.element[0], arguments);
393
+ })
394
+ .appendTo(uiButtonSet);
395
+ // can't use .attr( props, true ) with jQuery 1.3.2.
396
+ $.each( props, function( key, value ) {
397
+ if ( key === "click" ) {
398
+ return;
399
+ }
400
+ if ( key in attrFn ) {
401
+ button[ key ]( value );
402
+ } else {
403
+ button.attr( key, value );
404
+ }
405
+ });
406
+ if ($.fn.button) {
407
+ button.button();
408
+ }
409
+ });
410
+ uiDialogButtonPane.appendTo(self.uiDialog);
411
+ }
412
+ },
413
+
414
+ _makeDraggable: function() {
415
+ var self = this,
416
+ options = self.options,
417
+ doc = $(document),
418
+ heightBeforeDrag;
419
+
420
+ function filteredUi(ui) {
421
+ return {
422
+ position: ui.position,
423
+ offset: ui.offset
424
+ };
425
+ }
426
+
427
+ self.uiDialog.draggable({
428
+ cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
429
+ handle: '.ui-dialog-titlebar',
430
+ containment: 'document',
431
+ start: function(event, ui) {
432
+ heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
433
+ $(this).height($(this).height()).addClass("ui-dialog-dragging");
434
+ self._trigger('dragStart', event, filteredUi(ui));
435
+ },
436
+ drag: function(event, ui) {
437
+ self._trigger('drag', event, filteredUi(ui));
438
+ },
439
+ stop: function(event, ui) {
440
+ options.position = [ui.position.left - doc.scrollLeft(),
441
+ ui.position.top - doc.scrollTop()];
442
+ $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
443
+ self._trigger('dragStop', event, filteredUi(ui));
444
+ $.ui.dialog.overlay.resize();
445
+ }
446
+ });
447
+ },
448
+
449
+ _makeResizable: function(handles) {
450
+ handles = (handles === undefined ? this.options.resizable : handles);
451
+ var self = this,
452
+ options = self.options,
453
+ // .ui-resizable has position: relative defined in the stylesheet
454
+ // but dialogs have to use absolute or fixed positioning
455
+ position = self.uiDialog.css('position'),
456
+ resizeHandles = (typeof handles === 'string' ?
457
+ handles :
458
+ 'n,e,s,w,se,sw,ne,nw'
459
+ );
460
+
461
+ function filteredUi(ui) {
462
+ return {
463
+ originalPosition: ui.originalPosition,
464
+ originalSize: ui.originalSize,
465
+ position: ui.position,
466
+ size: ui.size
467
+ };
468
+ }
469
+
470
+ self.uiDialog.resizable({
471
+ cancel: '.ui-dialog-content',
472
+ containment: 'document',
473
+ alsoResize: self.element,
474
+ maxWidth: options.maxWidth,
475
+ maxHeight: options.maxHeight,
476
+ minWidth: options.minWidth,
477
+ minHeight: self._minHeight(),
478
+ handles: resizeHandles,
479
+ start: function(event, ui) {
480
+ $(this).addClass("ui-dialog-resizing");
481
+ self._trigger('resizeStart', event, filteredUi(ui));
482
+ },
483
+ resize: function(event, ui) {
484
+ self._trigger('resize', event, filteredUi(ui));
485
+ },
486
+ stop: function(event, ui) {
487
+ $(this).removeClass("ui-dialog-resizing");
488
+ options.height = $(this).height();
489
+ options.width = $(this).width();
490
+ self._trigger('resizeStop', event, filteredUi(ui));
491
+ $.ui.dialog.overlay.resize();
492
+ }
493
+ })
494
+ .css('position', position)
495
+ .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
496
+ },
497
+
498
+ _minHeight: function() {
499
+ var options = this.options;
500
+
501
+ if (options.height === 'auto') {
502
+ return options.minHeight;
503
+ } else {
504
+ return Math.min(options.minHeight, options.height);
505
+ }
506
+ },
507
+
508
+ _position: function(position) {
509
+ var myAt = [],
510
+ offset = [0, 0],
511
+ isVisible;
512
+
513
+ if (position) {
514
+ // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
515
+ // if (typeof position == 'string' || $.isArray(position)) {
516
+ // myAt = $.isArray(position) ? position : position.split(' ');
517
+
518
+ if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
519
+ myAt = position.split ? position.split(' ') : [position[0], position[1]];
520
+ if (myAt.length === 1) {
521
+ myAt[1] = myAt[0];
522
+ }
523
+
524
+ $.each(['left', 'top'], function(i, offsetPosition) {
525
+ if (+myAt[i] === myAt[i]) {
526
+ offset[i] = myAt[i];
527
+ myAt[i] = offsetPosition;
528
+ }
529
+ });
530
+
531
+ position = {
532
+ my: myAt.join(" "),
533
+ at: myAt.join(" "),
534
+ offset: offset.join(" ")
535
+ };
536
+ }
537
+
538
+ position = $.extend({}, $.ui.dialog.prototype.options.position, position);
539
+ } else {
540
+ position = $.ui.dialog.prototype.options.position;
541
+ }
542
+
543
+ // need to show the dialog to get the actual offset in the position plugin
544
+ isVisible = this.uiDialog.is(':visible');
545
+ if (!isVisible) {
546
+ this.uiDialog.show();
547
+ }
548
+ this.uiDialog
549
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
550
+ .css({ top: 0, left: 0 })
551
+ .position($.extend({ of: window }, position));
552
+ if (!isVisible) {
553
+ this.uiDialog.hide();
554
+ }
555
+ },
556
+
557
+ _setOptions: function( options ) {
558
+ var self = this,
559
+ resizableOptions = {},
560
+ resize = false;
561
+
562
+ $.each( options, function( key, value ) {
563
+ self._setOption( key, value );
564
+
565
+ if ( key in sizeRelatedOptions ) {
566
+ resize = true;
567
+ }
568
+ if ( key in resizableRelatedOptions ) {
569
+ resizableOptions[ key ] = value;
570
+ }
571
+ });
572
+
573
+ if ( resize ) {
574
+ this._size();
575
+ }
576
+ if ( this.uiDialog.is( ":data(resizable)" ) ) {
577
+ this.uiDialog.resizable( "option", resizableOptions );
578
+ }
579
+ },
580
+
581
+ _setOption: function(key, value){
582
+ var self = this,
583
+ uiDialog = self.uiDialog;
584
+
585
+ switch (key) {
586
+ //handling of deprecated beforeclose (vs beforeClose) option
587
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
588
+ //TODO: remove in 1.9pre
589
+ case "beforeclose":
590
+ key = "beforeClose";
591
+ break;
592
+ case "buttons":
593
+ self._createButtons(value);
594
+ break;
595
+ case "closeText":
596
+ // ensure that we always pass a string
597
+ self.uiDialogTitlebarCloseText.text("" + value);
598
+ break;
599
+ case "dialogClass":
600
+ uiDialog
601
+ .removeClass(self.options.dialogClass)
602
+ .addClass(uiDialogClasses + value);
603
+ break;
604
+ case "disabled":
605
+ if (value) {
606
+ uiDialog.addClass('ui-dialog-disabled');
607
+ } else {
608
+ uiDialog.removeClass('ui-dialog-disabled');
609
+ }
610
+ break;
611
+ case "draggable":
612
+ var isDraggable = uiDialog.is( ":data(draggable)" );
613
+ if ( isDraggable && !value ) {
614
+ uiDialog.draggable( "destroy" );
615
+ }
616
+
617
+ if ( !isDraggable && value ) {
618
+ self._makeDraggable();
619
+ }
620
+ break;
621
+ case "position":
622
+ self._position(value);
623
+ break;
624
+ case "resizable":
625
+ // currently resizable, becoming non-resizable
626
+ var isResizable = uiDialog.is( ":data(resizable)" );
627
+ if (isResizable && !value) {
628
+ uiDialog.resizable('destroy');
629
+ }
630
+
631
+ // currently resizable, changing handles
632
+ if (isResizable && typeof value === 'string') {
633
+ uiDialog.resizable('option', 'handles', value);
634
+ }
635
+
636
+ // currently non-resizable, becoming resizable
637
+ if (!isResizable && value !== false) {
638
+ self._makeResizable(value);
639
+ }
640
+ break;
641
+ case "title":
642
+ // convert whatever was passed in o a string, for html() to not throw up
643
+ $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
644
+ break;
645
+ }
646
+
647
+ $.Widget.prototype._setOption.apply(self, arguments);
648
+ },
649
+
650
+ _size: function() {
651
+ /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
652
+ * divs will both have width and height set, so we need to reset them
653
+ */
654
+ var options = this.options,
655
+ nonContentHeight,
656
+ minContentHeight,
657
+ isVisible = this.uiDialog.is( ":visible" );
658
+
659
+ // reset content sizing
660
+ this.element.show().css({
661
+ width: 'auto',
662
+ minHeight: 0,
663
+ height: 0
664
+ });
665
+
666
+ if (options.minWidth > options.width) {
667
+ options.width = options.minWidth;
668
+ }
669
+
670
+ // reset wrapper sizing
671
+ // determine the height of all the non-content elements
672
+ nonContentHeight = this.uiDialog.css({
673
+ height: 'auto',
674
+ width: options.width
675
+ })
676
+ .height();
677
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
678
+
679
+ if ( options.height === "auto" ) {
680
+ // only needed for IE6 support
681
+ if ( $.support.minHeight ) {
682
+ this.element.css({
683
+ minHeight: minContentHeight,
684
+ height: "auto"
685
+ });
686
+ } else {
687
+ this.uiDialog.show();
688
+ var autoHeight = this.element.css( "height", "auto" ).height();
689
+ if ( !isVisible ) {
690
+ this.uiDialog.hide();
691
+ }
692
+ this.element.height( Math.max( autoHeight, minContentHeight ) );
693
+ }
694
+ } else {
695
+ this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
696
+ }
697
+
698
+ if (this.uiDialog.is(':data(resizable)')) {
699
+ this.uiDialog.resizable('option', 'minHeight', this._minHeight());
700
+ }
701
+ }
702
+ });
703
+
704
+ $.extend($.ui.dialog, {
705
+ version: "1.8.13",
706
+
707
+ uuid: 0,
708
+ maxZ: 0,
709
+
710
+ getTitleId: function($el) {
711
+ var id = $el.attr('id');
712
+ if (!id) {
713
+ this.uuid += 1;
714
+ id = this.uuid;
715
+ }
716
+ return 'ui-dialog-title-' + id;
717
+ },
718
+
719
+ overlay: function(dialog) {
720
+ this.$el = $.ui.dialog.overlay.create(dialog);
721
+ }
722
+ });
723
+
724
+ $.extend($.ui.dialog.overlay, {
725
+ instances: [],
726
+ // reuse old instances due to IE memory leak with alpha transparency (see #5185)
727
+ oldInstances: [],
728
+ maxZ: 0,
729
+ events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
730
+ function(event) { return event + '.dialog-overlay'; }).join(' '),
731
+ create: function(dialog) {
732
+ if (this.instances.length === 0) {
733
+ // prevent use of anchors and inputs
734
+ // we use a setTimeout in case the overlay is created from an
735
+ // event that we're going to be cancelling (see #2804)
736
+ setTimeout(function() {
737
+ // handle $(el).dialog().dialog('close') (see #4065)
738
+ if ($.ui.dialog.overlay.instances.length) {
739
+ $(document).bind($.ui.dialog.overlay.events, function(event) {
740
+ // stop events if the z-index of the target is < the z-index of the overlay
741
+ // we cannot return true when we don't want to cancel the event (#3523)
742
+ if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
743
+ return false;
744
+ }
745
+ });
746
+ }
747
+ }, 1);
748
+
749
+ // allow closing by pressing the escape key
750
+ $(document).bind('keydown.dialog-overlay', function(event) {
751
+ if (dialog.options.closeOnEscape && event.keyCode &&
752
+ event.keyCode === $.ui.keyCode.ESCAPE) {
753
+
754
+ dialog.close(event);
755
+ event.preventDefault();
756
+ }
757
+ });
758
+
759
+ // handle window resize
760
+ $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
761
+ }
762
+
763
+ var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
764
+ .appendTo(document.body)
765
+ .css({
766
+ width: this.width(),
767
+ height: this.height()
768
+ });
769
+
770
+ if ($.fn.bgiframe) {
771
+ $el.bgiframe();
772
+ }
773
+
774
+ this.instances.push($el);
775
+ return $el;
776
+ },
777
+
778
+ destroy: function($el) {
779
+ var indexOf = $.inArray($el, this.instances);
780
+ if (indexOf != -1){
781
+ this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
782
+ }
783
+
784
+ if (this.instances.length === 0) {
785
+ $([document, window]).unbind('.dialog-overlay');
786
+ }
787
+
788
+ $el.remove();
789
+
790
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
791
+ var maxZ = 0;
792
+ $.each(this.instances, function() {
793
+ maxZ = Math.max(maxZ, this.css('z-index'));
794
+ });
795
+ this.maxZ = maxZ;
796
+ },
797
+
798
+ height: function() {
799
+ var scrollHeight,
800
+ offsetHeight;
801
+ // handle IE 6
802
+ if ($.browser.msie && $.browser.version < 7) {
803
+ scrollHeight = Math.max(
804
+ document.documentElement.scrollHeight,
805
+ document.body.scrollHeight
806
+ );
807
+ offsetHeight = Math.max(
808
+ document.documentElement.offsetHeight,
809
+ document.body.offsetHeight
810
+ );
811
+
812
+ if (scrollHeight < offsetHeight) {
813
+ return $(window).height() + 'px';
814
+ } else {
815
+ return scrollHeight + 'px';
816
+ }
817
+ // handle "good" browsers
818
+ } else {
819
+ return $(document).height() + 'px';
820
+ }
821
+ },
822
+
823
+ width: function() {
824
+ var scrollWidth,
825
+ offsetWidth;
826
+ // handle IE 6
827
+ if ($.browser.msie && $.browser.version < 7) {
828
+ scrollWidth = Math.max(
829
+ document.documentElement.scrollWidth,
830
+ document.body.scrollWidth
831
+ );
832
+ offsetWidth = Math.max(
833
+ document.documentElement.offsetWidth,
834
+ document.body.offsetWidth
835
+ );
836
+
837
+ if (scrollWidth < offsetWidth) {
838
+ return $(window).width() + 'px';
839
+ } else {
840
+ return scrollWidth + 'px';
841
+ }
842
+ // handle "good" browsers
843
+ } else {
844
+ return $(document).width() + 'px';
845
+ }
846
+ },
847
+
848
+ resize: function() {
849
+ /* If the dialog is draggable and the user drags it past the
850
+ * right edge of the window, the document becomes wider so we
851
+ * need to stretch the overlay. If the user then drags the
852
+ * dialog back to the left, the document will become narrower,
853
+ * so we need to shrink the overlay to the appropriate size.
854
+ * This is handled by shrinking the overlay before setting it
855
+ * to the full document size.
856
+ */
857
+ var $overlays = $([]);
858
+ $.each($.ui.dialog.overlay.instances, function() {
859
+ $overlays = $overlays.add(this);
860
+ });
861
+
862
+ $overlays.css({
863
+ width: 0,
864
+ height: 0
865
+ }).css({
866
+ width: $.ui.dialog.overlay.width(),
867
+ height: $.ui.dialog.overlay.height()
868
+ });
869
+ }
870
+ });
871
+
872
+ $.extend($.ui.dialog.overlay.prototype, {
873
+ destroy: function() {
874
+ $.ui.dialog.overlay.destroy(this.$el);
875
+ }
876
+ });
877
+
878
+ }(jQuery));