class @Mercury.Region
type = 'region'
constructor: (@element, @window, @options = {}) ->
@type = 'region' unless @type
Mercury.log("building #{@type}", @element, @options)
@document = @window.document
@name = @element.attr('id')
@history = new Mercury.HistoryBuffer()
@build()
@bindEvents()
@pushHistory()
build: ->
focus: ->
bindEvents: ->
Mercury.bind 'mode', (event, options) =>
@togglePreview() if options.mode == 'preview'
Mercury.bind 'focus:frame', =>
return if @previewing
return unless Mercury.region == @
@focus()
Mercury.bind 'action', (event, options) =>
return if @previewing
return unless Mercury.region == @
@execCommand(options.action, options) if options.action
@element.mousemove (event) =>
return if @previewing
return unless Mercury.region == @
snippet = jQuery(event.target).closest('.mercury-snippet')
if snippet.length
@snippet = snippet
Mercury.trigger('show:toolbar', {type: 'snippet', snippet: @snippet})
@element.mouseout (event) =>
return if @previewing
Mercury.trigger('hide:toolbar', {type: 'snippet', immediately: false})
content: (value = null, filterSnippets = false) ->
if value != null
@element.html(value)
else
# sanitize the html before we return it
container = jQuery('
').appendTo(@document.createDocumentFragment())
container.html(@element.html().replace(/^\s+|\s+$/g, ''))
# replace snippet contents to be an identifier
if filterSnippets then for snippet, index in container.find('.mercury-snippet')
snippet = jQuery(snippet)
snippet.attr({contenteditable: null, 'data-version': null})
snippet.html("[#{snippet.data('snippet')}]")
return container.html()
togglePreview: ->
if @previewing
@previewing = false
@element.addClass(Mercury.config.regionClass).removeClass("#{Mercury.config.regionClass}-preview")
@focus() if Mercury.region == @
else
@previewing = true
@element.addClass("#{Mercury.config.regionClass}-preview").removeClass(Mercury.config.regionClass)
Mercury.trigger('region:blurred', {region: @})
execCommand: (action, options = {}) ->
@focus()
@pushHistory() unless action == 'redo'
Mercury.log('execCommand', action, options.value)
Mercury.changes = true
pushHistory: ->
@history.push(@content())
snippets: ->
snippets = {}
for element in @element.find('[data-snippet]')
snippet = Mercury.Snippet.find(jQuery(element).data('snippet'))
snippet.setVersion(jQuery(element).data('version'))
snippets[snippet.identity] = snippet.serialize()
return snippets
serialize: ->
return {
type: @type
value: @content(null, true)
snippets: @snippets()
}