planit
Version:
Interactive markers on an image or blank canvas
120 lines (105 loc) • 3.87 kB
text/coffeescript
# ======================================================== Options
# (private) Add default options if the necessary options
# are missing
#
initOptions = ->
if @options.container
@options.container = $("##{@options.container}")
else
@options.container = $('#planit')
# direct access to planit container
@container = @options.container
# ======================================================== Container
# (private) Draw the container and the subcontainers
#
initContainer = ->
@container.addClass(Planit.containerClass)
@container.append """
<div class="#{Planit.infoboxContainerClass}"></div>
<div class="#{Planit.markerContainerClass}"></div>
"""
@markersContainer = @container.find(".#{Planit.markerContainerClass}")
.first() # direct access to markers container
# ======================================================== Background Image
# (private) Create image container and add image if
# necessary
#
initImage = ->
if @options.image && @options.image.url
@container.prepend """
<div class="#{Planit.imageContainer}">
<img src="#{@options.image.url}">
</div>
"""
@image = @container.find('img').first()
@image.load () =>
@container.css(height: @image.height())
initZoomable.call(@)
initMarkers.call(@)
# ======================================================== Zooming
# (private) Sets our references for working with zoom, and
# controls whether or not to add controls
#
initZoomable = ->
# add zoom ID to markers container
@zoomId = Planit.randomString()
@markersContainer.attr('data-zoom-id', @zoomId)
# set initial background coordinates
@resetImage()
# add zoom controls if necessary
initZoomControls.call(@) if @options.image.zoom
# (private) Render the zoom controls and binds necessary
# events
#
initZoomControls = ->
# draw the controls dinkus
@container.prepend """
<div class="planit-controls">
<a href="#" class="zoom" data-action="in">+</a>
<a href="#" class="zoom" data-action="out">-</a>
</div>
"""
@container.find(".zoom[data-action='in']").click (e) =>
e.preventDefault()
@zoomIn()
@container.find(".zoom[data-action='out']").click (e) =>
e.preventDefault()
@zoomOut()
# bind draggable events
@container.on 'dblclick', (e) =>
zDblClick.call(@, e)
@container.on 'mousedown', (e) =>
zMouseDown.call(@, e)
$(document).on 'mousemove', (e) =>
zMouseMove.call(@, e)
$(document).on 'mouseup', (e) =>
zMouseUp.call(@, e)
# ======================================================== Markers
# (private) Will call initMarkers if there is no image,
# otherwise it's called from initImage, which waits for
# the image to be loaded.
#
initCanvasMarkers = ->
initMarkers.call(@) unless @options.image && @options.image.url
# Interval method that continues to check for image being
# loaded before adding markers to the plan
#
initMarkers = ->
if @options.markers && @options.markers.length > 0
for marker in @options.markers
marker.plan = @
Planit.Marker.create(marker)
# ======================================================== Plan Events
# (private) Bind events to the plan. These events deal
# mostly with markers, since some event should be attached
# to the plan and later find the appropriate marker
#
initEvents = ->
if @container.find(".#{Planit.imageContainer} > img").length > 0
@image = @container.find(".#{Planit.imageContainer} > img").first()
$(document).on 'mousemove', (e) =>
mousemove.call(@, e)
$(document).on 'mouseup', (e) =>
mouseup.call(@, e)
$(window).resize (e) =>
resize.call(@, e)