transit 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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));