- @iframe.onload = =>
- @idoc = @iframe.contentDocument
-
- ignore_key_codes =
- '18': true # alt
- '20': true # capslock
- '17': true # ctrl
- '144': true # numlock
- '16': true # shift
- '91': true # windows "start" key
- control_key_codes = # we react to these, but they aren't typing
- '37': KEY_LEFT
- '38': KEY_UP
- '39': KEY_RIGHT
- '40': KEY_DOWN
- '35': KEY_END
- '8': KEY_BACKSPACE
- '46': KEY_DELETE
- '13': KEY_ENTER
- '27': KEY_ESCAPE
- '36': KEY_HOME
- '45': KEY_INSERT
- '33': KEY_PAGE_UP
- '34': KEY_PAGE_DOWN
- '9': KEY_TAB
-
- @idoc.body.onclick = (e) =>
- # idoc.body.offset().left/top
- new_cursor = find_loc_cursor_position @tree, x: e.pageX, y: e.pageY
- if new_cursor?
- @move_cursor new_cursor
- @idoc.body.onkeyup = (e) =>
- return if e.ctrlKey
- return false if ignore_key_codes[e.keyCode]?
- #return false if control_key_codes[e.keyCode]?
- @idoc.body.onkeydown = (e) =>
- return if e.ctrlKey
- return false if ignore_key_codes[e.keyCode]?
- #return false if control_key_codes[e.keyCode]?
- switch e.keyCode
- when KEY_LEFT
- if @cursor?
- new_cursor = find_prev_cursor_position @tree, @cursor...
- if new_cursor?
- @move_cursor new_cursor
- else
- for c in @tree
- new_cursor = find_next_cursor_position @tree, c, -1
- if new_cursor?
- @move_cursor new_cursor
- break
- return false
- when KEY_UP
- return false
- when KEY_RIGHT
- if @cursor?
- new_cursor = find_next_cursor_position @tree, @cursor...
- if new_cursor?
- @move_cursor new_cursor
- else
- for c in @tree
- new_cursor = find_prev_cursor_position @tree, c, -1
- if new_cursor?
- @move_cursor new_cursor
- break
- return false
- when KEY_DOWN
- return false
- when KEY_END
- return false
- when KEY_BACKSPACE
- return false unless @cursor?
- return false unless @cursor[1] > 0
- @cursor[0].text = @cursor[0].text.substr(0, @cursor[1] - 1) + @cursor[0].text.substr(@cursor[1])
- @cursor[0].el.nodeValue = @cursor[0].text
- @move_cursor [@cursor[0], @cursor[1] - 1]
- return false
- when KEY_DELETE
- return false unless @cursor?
- return false unless @cursor[1] < @cursor[0].text.length
- @cursor[0].text = @cursor[0].text.substr(0, @cursor[1]) + @cursor[0].text.substr(@cursor[1] + 1)
- @cursor[0].el.nodeValue = @cursor[0].text
- @move_cursor [@cursor[0], @cursor[1]]
- return false
- when KEY_ENTER
- return false
- when KEY_ESCAPE
- return false
- when KEY_HOME
- return false
- when KEY_INSERT
- return false
- when KEY_PAGE_UP
- return false
- when KEY_PAGE_DOWN
- return false
- when KEY_TAB
- return false
- @idoc.body.onkeypress = (e) =>
- return if e.ctrlKey
- return false if ignore_key_codes[e.keyCode]?
- return false if control_key_codes[e.keyCode]? # handled in keydown
- char = e.charCode ? e.keyCode
- if char and @cursor?
- char = String.fromCharCode char
- if @cursor[1] is 0
- @cursor[0].text = char + @cursor[0].text
- else if @cursor[1] is @cursor[0].text.length - 1
- @cursor[0].text += char
- else
- @cursor[0].text =
- @cursor[0].text.substr(0, @cursor[1]) +
- char +
- @cursor[0].text.substr(@cursor[1])
- @cursor[0].el.nodeValue = @cursor[0].text
- @move_cursor [@cursor[0], @cursor[1] + 1]
- @changed()
+ @outer_iframe = domify document, iframe: {}
+ outer_iframe_style = 'border: none !important; margin: 0 !important; padding: 0 !important; height: 100% !important; width: 100% !important;'
+ if @options.editor_id?
+ @outer_iframe.setAttribute 'id', @options.editor_id
+ @outer_iframe.onload = =>
+ @outer_idoc = @outer_iframe.contentDocument
+ icss = domify @outer_idoc, style: children: [
+ domify @outer_idoc, text: css
+ ]
+ @outer_idoc.head.appendChild icss
+ @iframe = domify @outer_idoc, iframe: {}
+ @iframe.onload = =>
+ @init()
+ setTimeout (=> @init()), 200 # firefox never fires this onload
+ @outer_idoc.body.appendChild(
+ domify @outer_idoc, div: id: 'wrap1', children: [
+ domify @outer_idoc, div: id: 'wrap2', children: [
+ domify @outer_idoc, div: id: 'wrap3', children: [
+ @iframe
+ @overlay = domify @outer_idoc, div: id: 'overlay'
+ ]
+ ]
+ ]
+ )
+ outer_wrap = domify document, div: class: 'peach_html5_editor'
+ @in_el.parentNode.appendChild outer_wrap
+ outer_bounds = get_el_bounds outer_wrap
+ if outer_bounds.w < 300
+ outer_bounds.w = 300
+ if outer_bounds.h < 300
+ outer_bounds.h = 300
+ outer_iframe_style += "width: #{outer_bounds.w}px; height: #{outer_bounds.h}px;"
+ @outer_iframe.setAttribute 'style', outer_iframe_style
+ css = outer_css w: outer_bounds.w, h: outer_bounds.h
+ outer_wrap.appendChild @outer_iframe
+ init: -> # called by @iframe's onload (or timeout on firefox)
+ return if @initialized # ignore timeout for non-broken browsers
+ @idoc = @iframe.contentDocument
+ @overlay.onclick = (e) =>
+ return @onclick e
+ @outer_idoc.body.onkeyup = (e) =>
+ return @onkeyup e
+ @outer_idoc.body.onkeydown = (e) =>
+ return @onkeydown e
+ @outer_idoc.body.onkeypress = (e) =>
+ return @onkeypress e
+ if @options.stylesheet
+ # TODO test this
+ @idoc.head.appendChild domify @idoc, style: src: @options.stylesheet
+ @load_html @in_el.value
+ @initialized = true
+ if @options.initialized_cb?
+ @options.initialized_cb()
+ onclick: (e) ->
+ x = (e.offsetX ? e.layerX) - overlay_padding
+ y = (e.offsetY ? e.layerY) - overlay_padding
+ new_cursor = find_loc_cursor_position @tree, x: x, y: y
+ if new_cursor?
+ @move_cursor new_cursor
+ onkeyup: (e) ->
+ return if e.ctrlKey
+ return false if ignore_key_codes[e.keyCode]?
+ #return false if control_key_codes[e.keyCode]?
+ onkeydown: (e) ->
+ return if e.ctrlKey
+ return false if ignore_key_codes[e.keyCode]?
+ #return false if control_key_codes[e.keyCode]?
+ switch e.keyCode
+ when KEY_LEFT
+ if @cursor?
+ new_cursor = find_prev_cursor_position @tree, @cursor...
+ if new_cursor?
+ @move_cursor new_cursor
+ else
+ for c in @tree
+ new_cursor = find_next_cursor_position @tree, c, -1
+ if new_cursor?
+ @move_cursor new_cursor
+ break