mercury-rails 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. data/LICENSE +5 -0
  2. data/{README.rdoc → README.md} +150 -60
  3. data/VERSION +1 -1
  4. data/annotated_source.template +57 -0
  5. data/app/controllers/mercury_controller.rb +8 -4
  6. data/app/models/image.rb +2 -2
  7. data/app/views/layouts/mercury.html.erb +14 -0
  8. data/app/views/mercury/lightviews/about.html +7 -0
  9. data/app/views/mercury/lightviews/imageprocessor.html +3 -0
  10. data/app/views/mercury/modals/character.html +255 -0
  11. data/app/views/mercury/modals/htmleditor.html +13 -0
  12. data/app/views/mercury/modals/link.html +75 -0
  13. data/app/views/mercury/modals/media.html +82 -0
  14. data/app/views/mercury/modals/sanitizer.html +9 -0
  15. data/app/views/mercury/modals/table.html +84 -0
  16. data/app/views/mercury/palettes/backcolor.html +73 -0
  17. data/app/views/mercury/palettes/forecolor.html +73 -0
  18. data/app/views/mercury/panels/history.html +3 -0
  19. data/app/views/mercury/panels/notes.html +3 -0
  20. data/app/views/mercury/panels/snippets.html +12 -0
  21. data/app/views/mercury/selects/formatblock.html +11 -0
  22. data/app/views/mercury/selects/style.html +5 -0
  23. data/app/views/mercury/snippets/example.html.erb +1 -0
  24. data/app/views/mercury/snippets/example_options.html.erb +23 -0
  25. data/config/routes.rb +1 -1
  26. data/features/editing/basic.feature +1 -1
  27. data/features/support/paths.rb +1 -0
  28. data/lib/generators/mercury/install/install_generator.rb +14 -0
  29. data/mercury-rails.gemspec +115 -106
  30. data/spec/javascripts/mercury/dialog_spec.js.coffee +54 -38
  31. data/spec/javascripts/mercury/dialogs/backcolor_spec.js.coffee +1 -1
  32. data/spec/javascripts/mercury/dialogs/forecolor_spec.js.coffee +1 -1
  33. data/spec/javascripts/mercury/dialogs/formatblock_spec.js.coffee +1 -1
  34. data/spec/javascripts/mercury/dialogs/{objectspanel_spec.js.coffee → snippetpanel_spec.js.coffee} +4 -4
  35. data/spec/javascripts/mercury/dialogs/style_spec.js.coffee +1 -1
  36. data/spec/javascripts/mercury/history_buffer_spec.js.coffee +0 -1
  37. data/spec/javascripts/mercury/lightview_spec.js.coffee +448 -0
  38. data/spec/javascripts/mercury/mercury_spec.js.coffee +1 -1
  39. data/spec/javascripts/mercury/modal_spec.js.coffee +474 -0
  40. data/spec/javascripts/mercury/modals/htmleditor_spec.js.coffee +1 -1
  41. data/spec/javascripts/mercury/modals/insertcharacter_spec.js.coffee +1 -1
  42. data/spec/javascripts/mercury/modals/insertlink_spec.js.coffee +8 -2
  43. data/spec/javascripts/mercury/modals/insertmedia_spec.js.coffee +1 -1
  44. data/spec/javascripts/mercury/modals/insertsnippet_spec.js.coffee +1 -1
  45. data/spec/javascripts/mercury/modals/inserttable_spec.js.coffee +1 -1
  46. data/spec/javascripts/mercury/native_extensions_spec.js.coffee +1 -1
  47. data/spec/javascripts/mercury/page_editor_spec.js.coffee +160 -20
  48. data/spec/javascripts/mercury/palette_spec.js.coffee +1 -1
  49. data/spec/javascripts/mercury/panel_spec.js.coffee +1 -1
  50. data/spec/javascripts/mercury/region_spec.js.coffee +1 -1
  51. data/spec/javascripts/mercury/regions/editable_spec.js.coffee +191 -6
  52. data/spec/javascripts/mercury/regions/markupable_spec.js.coffee +369 -0
  53. data/spec/javascripts/mercury/regions/snippetable_spec.js.coffee +1 -1
  54. data/spec/javascripts/mercury/select_spec.js.coffee +1 -1
  55. data/spec/javascripts/mercury/snippet_spec.js.coffee +3 -3
  56. data/spec/javascripts/mercury/snippet_toolbar_spec.js.coffee +2 -2
  57. data/spec/javascripts/mercury/statusbar_spec.js.coffee +91 -17
  58. data/spec/javascripts/mercury/table_editor_spec.js.coffee +5 -1
  59. data/spec/javascripts/mercury/toolbar.button_group_spec.js.coffee +1 -1
  60. data/spec/javascripts/mercury/toolbar.button_spec.js.coffee +1 -1
  61. data/spec/javascripts/mercury/toolbar.expander_spec.js.coffee +1 -1
  62. data/spec/javascripts/mercury/toolbar_spec.js.coffee +70 -15
  63. data/spec/javascripts/mercury/tooltip_spec.js.coffee +1 -1
  64. data/spec/javascripts/mercury/uploader_spec.js.coffee +9 -1
  65. data/spec/javascripts/templates/mercury/dialogs/{objectspanel.html → snippetpanel.html} +0 -0
  66. data/spec/javascripts/templates/mercury/lightview.html +13 -0
  67. data/spec/javascripts/templates/mercury/modal.html +13 -0
  68. data/spec/javascripts/templates/mercury/page_editor.html +11 -1
  69. data/spec/javascripts/templates/mercury/statusbar.html +1 -0
  70. data/spec/javascripts/templates/mercury/toolbar.html +1 -0
  71. data/{app → vendor}/assets/images/mercury/button.png +0 -0
  72. data/{app → vendor}/assets/images/mercury/clippy.png +0 -0
  73. data/{app → vendor}/assets/images/mercury/default-snippet.png +0 -0
  74. data/{app → vendor}/assets/images/mercury/loading-dark.gif +0 -0
  75. data/{app → vendor}/assets/images/mercury/loading-light.gif +0 -0
  76. data/{app → vendor}/assets/images/mercury/search-icon.png +0 -0
  77. data/vendor/assets/images/mercury/temp-logo.png +0 -0
  78. data/{app → vendor}/assets/images/mercury/toolbar/editable/buttons.png +0 -0
  79. data/{app → vendor}/assets/images/mercury/toolbar/primary/_expander.png +0 -0
  80. data/{app → vendor}/assets/images/mercury/toolbar/primary/_pressed.png +0 -0
  81. data/{app → vendor}/assets/images/mercury/toolbar/primary/historypanel.png +0 -0
  82. data/{app → vendor}/assets/images/mercury/toolbar/primary/insertcharacter.png +0 -0
  83. data/{app → vendor}/assets/images/mercury/toolbar/primary/insertlink.png +0 -0
  84. data/{app → vendor}/assets/images/mercury/toolbar/primary/insertmedia.png +0 -0
  85. data/{app → vendor}/assets/images/mercury/toolbar/primary/inserttable.png +0 -0
  86. data/{app → vendor}/assets/images/mercury/toolbar/primary/inspectorpanel.png +0 -0
  87. data/{app → vendor}/assets/images/mercury/toolbar/primary/notespanel.png +0 -0
  88. data/{app → vendor}/assets/images/mercury/toolbar/primary/preview.png +0 -0
  89. data/{app → vendor}/assets/images/mercury/toolbar/primary/redo.png +0 -0
  90. data/{app → vendor}/assets/images/mercury/toolbar/primary/save.png +0 -0
  91. data/{app/assets/images/mercury/toolbar/primary/objectspanel.png → vendor/assets/images/mercury/toolbar/primary/snippetpanel.png} +0 -0
  92. data/{app → vendor}/assets/images/mercury/toolbar/primary/undo.png +0 -0
  93. data/{app → vendor}/assets/images/mercury/toolbar/snippetable/buttons.png +0 -0
  94. data/vendor/assets/javascripts/mercury.js +302 -0
  95. data/vendor/assets/javascripts/mercury/dialog.js.coffee +157 -0
  96. data/{app → vendor}/assets/javascripts/mercury/dialogs/backcolor.js.coffee +0 -0
  97. data/{app → vendor}/assets/javascripts/mercury/dialogs/forecolor.js.coffee +0 -0
  98. data/{app → vendor}/assets/javascripts/mercury/dialogs/formatblock.js.coffee +0 -0
  99. data/{app → vendor}/assets/javascripts/mercury/dialogs/objectspanel.js.coffee +1 -1
  100. data/{app → vendor}/assets/javascripts/mercury/dialogs/style.js.coffee +0 -0
  101. data/{app → vendor}/assets/javascripts/mercury/history_buffer.js.coffee +0 -0
  102. data/vendor/assets/javascripts/mercury/lightview.js.coffee +156 -0
  103. data/vendor/assets/javascripts/mercury/lightviews/imageprocessor.js.coffee +2 -0
  104. data/vendor/assets/javascripts/mercury/mercury.js.coffee +63 -0
  105. data/{app → vendor}/assets/javascripts/mercury/modal.js.coffee +25 -17
  106. data/{app → vendor}/assets/javascripts/mercury/modals/htmleditor.js.coffee +0 -0
  107. data/{app → vendor}/assets/javascripts/mercury/modals/insertcharacter.js.coffee +0 -0
  108. data/{app → vendor}/assets/javascripts/mercury/modals/insertlink.js.coffee +3 -0
  109. data/{app → vendor}/assets/javascripts/mercury/modals/insertmedia.js.coffee +10 -2
  110. data/{app → vendor}/assets/javascripts/mercury/modals/insertsnippet.js.coffee +0 -0
  111. data/{app → vendor}/assets/javascripts/mercury/modals/inserttable.js.coffee +2 -2
  112. data/{app → vendor}/assets/javascripts/mercury/native_extensions.js.coffee +0 -0
  113. data/{app → vendor}/assets/javascripts/mercury/page_editor.js.coffee +44 -13
  114. data/{app → vendor}/assets/javascripts/mercury/palette.js.coffee +0 -0
  115. data/{app → vendor}/assets/javascripts/mercury/panel.js.coffee +0 -0
  116. data/{app → vendor}/assets/javascripts/mercury/region.js.coffee +0 -0
  117. data/{app → vendor}/assets/javascripts/mercury/regions/editable.js.coffee +58 -12
  118. data/{app → vendor}/assets/javascripts/mercury/regions/markupable.js.coffee +26 -24
  119. data/{app → vendor}/assets/javascripts/mercury/regions/snippetable.js.coffee +0 -0
  120. data/{app → vendor}/assets/javascripts/mercury/select.js.coffee +3 -0
  121. data/{app → vendor}/assets/javascripts/mercury/snippet.js.coffee +9 -5
  122. data/{app → vendor}/assets/javascripts/mercury/snippet_toolbar.js.coffee +0 -0
  123. data/vendor/assets/javascripts/mercury/statusbar.js.coffee +51 -0
  124. data/{app → vendor}/assets/javascripts/mercury/table_editor.js.coffee +9 -8
  125. data/{app → vendor}/assets/javascripts/mercury/toolbar.button.js.coffee +0 -0
  126. data/{app → vendor}/assets/javascripts/mercury/toolbar.button_group.js.coffee +0 -0
  127. data/{app → vendor}/assets/javascripts/mercury/toolbar.expander.js.coffee +0 -0
  128. data/{app → vendor}/assets/javascripts/mercury/toolbar.js.coffee +14 -1
  129. data/{app → vendor}/assets/javascripts/mercury/tooltip.js.coffee +3 -0
  130. data/{app → vendor}/assets/javascripts/mercury/uploader.js.coffee +22 -13
  131. data/vendor/assets/javascripts/{jquery-1.6.js → mercury_dependencies/jquery-1.6.js} +0 -0
  132. data/vendor/assets/javascripts/{jquery-ui-1.8.13.custom.js → mercury_dependencies/jquery-ui-1.8.13.custom.js} +0 -0
  133. data/vendor/assets/javascripts/{jquery.additions.js → mercury_dependencies/jquery.additions.js} +0 -0
  134. data/vendor/assets/javascripts/{liquidmetal.js → mercury_dependencies/liquidmetal.js} +0 -0
  135. data/vendor/assets/javascripts/{showdown.js → mercury_dependencies/showdown.js} +0 -0
  136. data/vendor/assets/javascripts/mercury_loader.js +191 -0
  137. data/{app → vendor}/assets/stylesheets/mercury.css +3 -6
  138. data/vendor/assets/stylesheets/mercury/dialog.css +199 -0
  139. data/vendor/assets/stylesheets/mercury/lightview.css +92 -0
  140. data/vendor/assets/stylesheets/mercury/mercury.css +134 -0
  141. data/vendor/assets/stylesheets/mercury/modal.css +191 -0
  142. data/{app/assets/stylesheets/mercury/statusbar.scss → vendor/assets/stylesheets/mercury/statusbar.css} +9 -1
  143. data/vendor/assets/stylesheets/mercury/toolbar.css +329 -0
  144. data/{app/assets/stylesheets/mercury/tooltip.scss → vendor/assets/stylesheets/mercury/tooltip.css} +7 -7
  145. data/vendor/assets/stylesheets/mercury/uploader.css +111 -0
  146. metadata +230 -225
  147. data/app/assets/images/mercury/toolbar/markupable/buttons.png +0 -0
  148. data/app/assets/images/mercury/toolbar/primary/todospanel.png +0 -0
  149. data/app/assets/javascripts/mercury.js +0 -30
  150. data/app/assets/javascripts/mercury/dialog.js.coffee +0 -75
  151. data/app/assets/javascripts/mercury/mercury.js.coffee +0 -286
  152. data/app/assets/javascripts/mercury/statusbar.js.coffee +0 -29
  153. data/app/assets/javascripts/mercury_loader.js +0 -98
  154. data/app/assets/stylesheets/mercury/dialog.scss +0 -179
  155. data/app/assets/stylesheets/mercury/mercury.scss +0 -127
  156. data/app/assets/stylesheets/mercury/modal.scss +0 -194
  157. data/app/assets/stylesheets/mercury/toolbar.scss +0 -415
  158. data/app/assets/stylesheets/mercury/uploader.scss +0 -109
  159. data/app/views/layouts/mercury.html.haml +0 -8
  160. data/app/views/mercury/modals/character.html.haml +0 -252
  161. data/app/views/mercury/modals/htmleditor.html.haml +0 -8
  162. data/app/views/mercury/modals/link.html.haml +0 -31
  163. data/app/views/mercury/modals/media.html.haml +0 -33
  164. data/app/views/mercury/modals/sanitizer.html.haml +0 -4
  165. data/app/views/mercury/modals/table.html.haml +0 -49
  166. data/app/views/mercury/palettes/backcolor.html.haml +0 -79
  167. data/app/views/mercury/palettes/forecolor.html.haml +0 -79
  168. data/app/views/mercury/panels/history.html.haml +0 -0
  169. data/app/views/mercury/panels/notes.html.haml +0 -0
  170. data/app/views/mercury/panels/snippets.html.haml +0 -10
  171. data/app/views/mercury/selects/formatblock.html.haml +0 -10
  172. data/app/views/mercury/selects/style.html.haml +0 -4
  173. data/app/views/mercury/snippets/example.html.haml +0 -2
  174. data/app/views/mercury/snippets/example_options.html.haml +0 -16
  175. data/log/.gitkeep +0 -0
  176. data/spec/javascripts/mercury/regions/_markupable_.js.coffee +0 -0
@@ -0,0 +1,157 @@
1
+ # # Mercury Dialog
2
+ #
3
+ # Dialog is a base class that's used by Palette, Select, Panel, and through Palette, the Toolbar.Expander. It's basic
4
+ # function is to provide an interface element that can be opened, interacted with, and then closed.
5
+ #
6
+ class @Mercury.Dialog
7
+
8
+ # The constructor expects a url to load, a name, and options.
9
+ #
10
+ # @url _string_ used to load the contents, either using Ajax or by pulling content from preloadedViews
11
+ #
12
+ # @name _string_ used in building of the element, and is assigned as part of the elements class (eg.
13
+ # `mercury-[name]-dialog`)
14
+ #
15
+ # @options _object_
16
+ #
17
+ # **Options**
18
+ #
19
+ # @for _Toolbar.Button_ used so the dialog can be shown/hidden based on button interactions.
20
+ #
21
+ # @preload _boolean_ if true, the view for this dialog will be loaded prior to being shown, otherwise the view will be
22
+ # loaded the first time it's shown, and cached for all future interactions.
23
+ #
24
+ # @appendTo _element_ you can append a dialog to any element by providing this option.
25
+ constructor: (@url, @name, @options = {}) ->
26
+ @button = @options.for
27
+
28
+ @build()
29
+ @bindEvents()
30
+ @preload()
31
+
32
+
33
+ # ## #build
34
+ #
35
+ # Builds the element and appends it to the DOM. You can provide an element to append it to in the options, otherwise
36
+ # it will be appended to the body.
37
+ build: ->
38
+ @element = jQuery('<div>', {class: "mercury-dialog mercury-#{@name}-dialog loading", style: 'display:none'})
39
+ @element.appendTo(jQuery(@options.appendTo).get(0) ? 'body')
40
+
41
+
42
+ # ## #bindEvents
43
+ #
44
+ # Bind to all the events we should handle. In this case we only stop the mousedown event, since dialogs aren't
45
+ # expected to have inputs etc.
46
+ #
47
+ # **Note:** By stopping the mousedown event we're limiting what's possible in dialogs, but this is needed to keep
48
+ # focus from being taken away from the active region when different things are clicked on in dialogs.
49
+ bindEvents: ->
50
+ @element.mousedown (event) -> event.stopPropagation()
51
+
52
+
53
+ # ## #preload
54
+ #
55
+ # If the options dictate that the content should be preloaded we load the view before we do anything else. This is
56
+ # useful if you don't want to make the user wait the half second or however long the server may take to respond when
57
+ # they open various dialogs.
58
+ preload: ->
59
+ @load() if @options.preload
60
+
61
+
62
+ # ## #toggle
63
+ #
64
+ # Toggle the dialog based on current visibility.
65
+ toggle: ->
66
+ if @visible then @hide() else @show()
67
+
68
+
69
+ # ## #resize
70
+ #
71
+ # In the base class resize just calls through to show, but in the implementation classes resize typically adjusts the
72
+ # size based on it's contents.
73
+ resize: ->
74
+ @show()
75
+
76
+
77
+ # ## #show
78
+ #
79
+ # When showing a dialog it's expected that all other dialogs will close, and we fire an event for this. The dialog is
80
+ # then positioned and shown. The show animation of the dialog is typically dictated by the implementation class.
81
+ show: ->
82
+ # Tell all other dialogs to close.
83
+ Mercury.trigger('hide:dialogs', @)
84
+ @visible = true
85
+ if @loaded
86
+ @element.css({width: 'auto', height: 'auto'})
87
+ @position(@visible)
88
+ else
89
+ @position()
90
+ # Then show the element.
91
+ @appear()
92
+
93
+
94
+ # ## #position
95
+ #
96
+ # Interface method. Implemenations are expected to position the dialog themselves.
97
+ #
98
+ # @keepVisible _boolean_ specifies if the element should stay visible if it's already visible.
99
+ position: (keepVisible) ->
100
+
101
+
102
+ # ## #appear
103
+ #
104
+ # Animate the element into view. After it's done showing, we load and resize it if it's not already loaded, so in
105
+ # cases where content is not preloaded we can display the dialog, fill it's contents, and then animate the resize.
106
+ appear: ->
107
+ @element.css({display: 'block', opacity: 0})
108
+ @element.animate {opacity: 0.95}, 200, 'easeInOutSine', =>
109
+ @load(=> @resize()) unless @loaded
110
+
111
+
112
+ # ## #hide
113
+ #
114
+ # Hides the element and keeps track of it's visibility.
115
+ hide: ->
116
+ @element.hide()
117
+ @visible = false
118
+
119
+
120
+ # ## #load
121
+ #
122
+ # Fetches the content that will be loaded into the dialog.
123
+ #
124
+ # @callback _function_ will be called after the content is loaded.
125
+ load: (callback) ->
126
+ return unless @url
127
+ if Mercury.preloadedViews[@url]
128
+ # If there's a preloadedView defined for the url being requested, load that one.
129
+ @loadContent(Mercury.preloadedViews[@url])
130
+ # And call the dialog handler if there's one. We've broken the handlers out into seperate files so they can be
131
+ # tested more easily, but you can define your own by putting them in dialogHanders.
132
+ Mercury.dialogHandlers[@name].call(@) if Mercury.dialogHandlers[@name]
133
+ callback() if callback
134
+ else
135
+ # Otherwise make an Ajax request to get the content.
136
+ jQuery.ajax @url, {
137
+ success: (data) =>
138
+ @loadContent(data)
139
+ Mercury.dialogHandlers[@name].call(@) if Mercury.dialogHandlers[@name]
140
+ callback() if callback
141
+ error: =>
142
+ # If the Ajax fails, we hide the dialog and alert the user about the error.
143
+ @hide()
144
+ @button.removeClass('pressed') if @button
145
+ alert("Mercury was unable to load #{@url} for the #{@name} dialog.")
146
+ }
147
+
148
+
149
+ # ## #loadContent
150
+ #
151
+ # Loads content into the element, and removes the loading class.
152
+ #
153
+ # @data _mixed_ a string or jQuery object that can be inserted into the dialog.
154
+ loadContent: (data) ->
155
+ @loaded = true
156
+ @element.removeClass('loading')
157
+ @element.html(data)
@@ -1,4 +1,4 @@
1
- @Mercury.dialogHandlers.objectsPanel = ->
1
+ @Mercury.dialogHandlers.snippetPanel = ->
2
2
  # make the filter work
3
3
  @element.find('input.filter').keyup =>
4
4
  value = @element.find('input.filter').val()
@@ -0,0 +1,156 @@
1
+ @Mercury.lightview = (url, options = {}) ->
2
+ Mercury.lightview.show(url, options)
3
+ return Mercury.lightview
4
+
5
+ jQuery.extend Mercury.lightview, {
6
+
7
+ minWidth: 400
8
+
9
+ show: (@url, @options = {}) ->
10
+ Mercury.trigger('focus:window')
11
+ @initialize()
12
+ if @visible then @update() else @appear()
13
+
14
+
15
+ initialize: ->
16
+ return if @initialized
17
+ @build()
18
+ @bindEvents()
19
+ @initialized = true
20
+
21
+
22
+ build: ->
23
+ @element = jQuery('<div>', {class: 'mercury-lightview loading'})
24
+ @element.html('<h1 class="mercury-lightview-title"><span></span></h1>')
25
+ @element.append('<div class="mercury-lightview-content"></div>')
26
+
27
+ @overlay = jQuery('<div>', {class: 'mercury-lightview-overlay'})
28
+
29
+ @titleElement = @element.find('.mercury-lightview-title')
30
+ @contentElement = @element.find('.mercury-lightview-content')
31
+
32
+ @element.appendTo(jQuery(@options.appendTo).get(0) ? 'body')
33
+ @overlay.appendTo(jQuery(@options.appendTo).get(0) ? 'body')
34
+
35
+ @titleElement.find('span').html(@options.title)
36
+
37
+
38
+ bindEvents: ->
39
+ Mercury.bind 'refresh', => @resize(true)
40
+ Mercury.bind 'resize', => @position() if @visible
41
+
42
+ @overlay.click => @hide()
43
+
44
+ jQuery(document).bind 'keydown', (event) =>
45
+ @hide() if event.keyCode == 27 && @visible
46
+
47
+
48
+ appear: ->
49
+ @position()
50
+
51
+ @overlay.show().css({opacity: 0})
52
+ @overlay.animate {opacity: 1}, 200, 'easeInOutSine', =>
53
+ @setTitle()
54
+ @element.show().css({opacity: 0})
55
+ @element.animate {opacity: 1}, 200, 'easeInOutSine', =>
56
+ @visible = true
57
+ @load()
58
+
59
+
60
+ resize: (keepVisible) ->
61
+ viewportWidth = Mercury.displayRect.width
62
+ viewportHeight = Mercury.displayRect.fullHeight
63
+
64
+ @element.css({overflow: 'hidden'})
65
+ @contentElement.css({visibility: 'hidden', display: 'none', width: 'auto', height: 'auto'})
66
+
67
+ width = @contentElement.outerWidth() + 40 + 2
68
+ width = viewportWidth - 40 if width > viewportWidth - 40 || @options.fullSize
69
+ height = @contentElement.outerHeight() + @titleElement.outerHeight() + 30
70
+ height = viewportHeight - 20 if height > viewportHeight - 20 || @options.fullSize
71
+
72
+ width = 300 if width < 300
73
+ height = 150 if height < 150
74
+
75
+ @element.stop().animate {top: ((viewportHeight - height) / 2) + 10, left: (Mercury.displayRect.width - width) / 2, width: width, height: height}, 200, 'easeInOutSine', =>
76
+ @contentElement.css({visibility: 'visible', display: 'block', opacity: 0})
77
+ @contentElement.stop().animate({opacity: 1}, 200, 'easeInOutSine')
78
+ @element.css({overflow: 'auto'})
79
+
80
+
81
+ position: ->
82
+ viewportWidth = Mercury.displayRect.width
83
+ viewportHeight = Mercury.displayRect.fullHeight
84
+
85
+ @contentElement.css({position: 'absolute', width: 'auto', height: 'auto'})
86
+ width = @contentElement.width() + 40 + 2
87
+ width = viewportWidth - 40 if width > viewportWidth - 40 || @options.fullSize
88
+
89
+ height = @contentElement.height() + @titleElement.outerHeight() + 30
90
+ height = viewportHeight - 20 if height > viewportHeight - 20 || @options.fullSize
91
+ @contentElement.css({position: 'relative'})
92
+
93
+ width = 300 if width < 300
94
+ height = 150 if height < 150
95
+
96
+ @element.css({top: ((viewportHeight - height) / 2) + 10, left: (viewportWidth - width) / 2, width: width, height: height, overflow: 'auto'})
97
+ @contentElement.css({width: width - 40, height: height - 30 - @titleElement.outerHeight()}) if @visible
98
+
99
+
100
+ update: ->
101
+ @reset()
102
+ @resize()
103
+ @load()
104
+
105
+
106
+ load: ->
107
+ @setTitle()
108
+ return unless @url
109
+ @element.addClass('loading')
110
+ if Mercury.preloadedViews[@url]
111
+ setTimeout((=> @loadContent(Mercury.preloadedViews[@url])), 10)
112
+ else
113
+ jQuery.ajax @url, {
114
+ type: @options.loadType || 'get'
115
+ data: @options.loadData
116
+ success: (data) => @loadContent(data)
117
+ error: =>
118
+ @hide()
119
+ alert("Mercury was unable to load #{@url} for the lightview.")
120
+ }
121
+
122
+
123
+ loadContent: (data, options = null) ->
124
+ @initialize()
125
+ @options = options || @options
126
+ @setTitle()
127
+ @loaded = true
128
+ @element.removeClass('loading')
129
+ @contentElement.html(data)
130
+ @contentElement.css({display: 'none', visibility: 'hidden'})
131
+
132
+ @options.afterLoad.call(@) if @options.afterLoad
133
+ if @options.handler && Mercury.lightviewHandlers[@options.handler]
134
+ Mercury.lightviewHandlers[@options.handler].call(@)
135
+
136
+ @resize()
137
+
138
+
139
+ setTitle: ->
140
+ @titleElement.find('span').html(@options.title)
141
+
142
+
143
+ reset: ->
144
+ @titleElement.find('span').html('')
145
+ @contentElement.html('')
146
+
147
+
148
+ hide: ->
149
+ Mercury.trigger('focus:frame')
150
+ @element.hide()
151
+ @overlay.hide()
152
+ @reset()
153
+
154
+ @visible = false
155
+
156
+ }
@@ -0,0 +1,2 @@
1
+ @Mercury.lightviewHandlers.imageProcessor = ->
2
+ ''
@@ -0,0 +1,63 @@
1
+ # ## Require all the dependencies
2
+ #= require mercury_dependencies/jquery-1.6
3
+ #= require mercury_dependencies/jquery-ui-1.8.13.custom
4
+ #= require mercury_dependencies/jquery.additions
5
+ #= require mercury_dependencies/liquidmetal
6
+ #= require mercury_dependencies/showdown
7
+ #
8
+ # ## Require all mercury files
9
+ #= require_self
10
+ #= require ./native_extensions
11
+ #= require ./page_editor
12
+ #= require ./history_buffer
13
+ #= require ./table_editor
14
+ #= require ./dialog
15
+ #= require ./palette
16
+ #= require ./select
17
+ #= require ./panel
18
+ #= require ./modal
19
+ #= require ./lightview
20
+ #= require ./statusbar
21
+ #= require ./toolbar
22
+ #= require ./toolbar.button
23
+ #= require ./toolbar.button_group
24
+ #= require ./toolbar.expander
25
+ #= require ./tooltip
26
+ #= require ./snippet
27
+ #= require ./snippet_toolbar
28
+ #= require ./region
29
+ #= require ./uploader
30
+ #= require_tree ./regions
31
+ #= require_tree ./dialogs
32
+ #= require_tree ./modals
33
+ #
34
+ @Mercury ||= {}
35
+ jQuery.extend @Mercury, {
36
+ version: '0.2.0'
37
+
38
+ # No IE support yet because it doesn't follow the W3C standards for HTML5 contentEditable (aka designMode).
39
+ supported: document.getElementById && document.designMode && !jQuery.browser.konqueror && !jQuery.browser.msie
40
+
41
+ # Mercury object namespaces
42
+ Regions: {}
43
+ modalHandlers: {}
44
+ lightviewHandlers: {}
45
+ dialogHandlers: {}
46
+ preloadedViews: {}
47
+
48
+ # Custom event and logging methods
49
+ bind: (eventName, callback) ->
50
+ jQuery(document).bind("mercury:#{eventName}", callback)
51
+
52
+
53
+ trigger: (eventName, options) ->
54
+ Mercury.log(eventName, options)
55
+ jQuery(document).trigger("mercury:#{eventName}", options)
56
+
57
+
58
+ log: ->
59
+ if Mercury.debug && console
60
+ return if arguments[0] == 'hide:toolbar' || arguments[0] == 'show:toolbar'
61
+ try console.debug(arguments) catch e
62
+
63
+ }
@@ -44,8 +44,12 @@ jQuery.extend Mercury.modal, {
44
44
 
45
45
  @titleElement.find('a').click => @hide()
46
46
 
47
+ jQuery(document).bind 'keydown', (event) =>
48
+ @hide() if event.keyCode == 27 && @visible
49
+
47
50
 
48
51
  appear: ->
52
+ @showing = true
49
53
  @position()
50
54
 
51
55
  @overlay.show()
@@ -55,14 +59,13 @@ jQuery.extend Mercury.modal, {
55
59
  @element.show()
56
60
  @element.animate {top: 0}, 200, 'easeInOutSine', =>
57
61
  @visible = true
62
+ @showing = false
58
63
  @load()
59
64
 
60
65
 
61
66
  resize: (keepVisible) ->
62
- # TODO: resizing is a bit shitty when the modal has panes and is scrollable
63
67
  visibility = if keepVisible then 'visible' else 'hidden'
64
68
 
65
- viewportHeight = jQuery(window).height()
66
69
  titleHeight = @titleElement.outerHeight()
67
70
 
68
71
  width = @contentElement.outerWidth()
@@ -73,9 +76,9 @@ jQuery.extend Mercury.modal, {
73
76
  height = @contentElement.outerHeight() + titleHeight
74
77
 
75
78
  width = @minWidth if width < @minWidth
76
- height = viewportHeight - 20 if height > viewportHeight - 20 || @options.fullHeight
79
+ height = Mercury.displayRect.fullHeight - 20 if height > Mercury.displayRect.fullHeight - 20 || @options.fullHeight
77
80
 
78
- @element.stop().animate {left: (jQuery(window).width() - width) / 2, width: width, height: height}, 200, 'easeInOutSine', =>
81
+ @element.stop().animate {left: (Mercury.displayRect.width - width) / 2, width: width, height: height}, 200, 'easeInOutSine', =>
79
82
  @contentElement.css({visibility: 'visible', display: 'block'})
80
83
  if @contentPane.length
81
84
  @contentElement.css({height: height - titleHeight, overflow: 'visible'})
@@ -87,8 +90,7 @@ jQuery.extend Mercury.modal, {
87
90
 
88
91
 
89
92
  position: ->
90
- viewportWidth = jQuery(window).width()
91
- viewportHeight = jQuery(window).height()
93
+ viewportWidth = Mercury.displayRect.width
92
94
 
93
95
  @contentPane.css({height: 'auto'}) if @contentPane
94
96
  @contentElement.css({height: 'auto'})
@@ -98,7 +100,7 @@ jQuery.extend Mercury.modal, {
98
100
  height = @element.height()
99
101
 
100
102
  width = @minWidth if width < @minWidth
101
- height = viewportHeight - 20 if height > viewportHeight - 20 || @options.fullHeight
103
+ height = Mercury.displayRect.fullHeight - 20 if height > Mercury.displayRect.fullHeight - 20 || @options.fullHeight
102
104
 
103
105
  titleHeight = @titleElement.outerHeight()
104
106
  if @contentPane && @contentPane.length
@@ -125,19 +127,23 @@ jQuery.extend Mercury.modal, {
125
127
 
126
128
 
127
129
  load: ->
128
- @element.addClass('loading')
129
130
  @setTitle()
130
- jQuery.ajax @url, {
131
- type: @options.loadType || 'get'
132
- data: @options.loadData
133
- success: (data) => @loadContent(data)
134
- error: =>
135
- @hide()
136
- alert("Mercury was unable to load #{@url} for the modal.")
137
- }
131
+ return unless @url
132
+ @element.addClass('loading')
133
+ if Mercury.preloadedViews[@url]
134
+ setTimeout((=> @loadContent(Mercury.preloadedViews[@url])), 10)
135
+ else
136
+ jQuery.ajax @url, {
137
+ type: @options.loadType || 'get'
138
+ data: @options.loadData
139
+ success: (data) => @loadContent(data)
140
+ error: =>
141
+ @hide()
142
+ alert("Mercury was unable to load #{@url} for the modal.")
143
+ }
138
144
 
139
145
 
140
- loadContent: (data, options) ->
146
+ loadContent: (data, options = null) ->
141
147
  @initialize()
142
148
  @options = options || @options
143
149
  @setTitle()
@@ -167,6 +173,8 @@ jQuery.extend Mercury.modal, {
167
173
 
168
174
 
169
175
  hide: ->
176
+ return if @showing
177
+
170
178
  Mercury.trigger('focus:frame')
171
179
  @element.hide()
172
180
  @overlay.hide()