mirror of
https://github.com/Poniverse/Pony.fm.git
synced 2024-11-23 13:37:59 +01:00
87 lines
2 KiB
CoffeeScript
87 lines
2 KiB
CoffeeScript
|
angular.module('ponyfm').directive 'pfmPopup', () ->
|
||
|
(scope, element, attrs) ->
|
||
|
align = 'left'
|
||
|
elementId = attrs.pfmPopup
|
||
|
if elementId.indexOf ',' != -1
|
||
|
parts = elementId.split ','
|
||
|
elementId = parts[0]
|
||
|
align = parts[1]
|
||
|
|
||
|
$popup = $ '#' + attrs.pfmPopup
|
||
|
$element = $ element
|
||
|
$positionParent = null
|
||
|
open = false
|
||
|
|
||
|
|
||
|
documentClickHandler = () ->
|
||
|
return if !open
|
||
|
$popup.removeClass 'open'
|
||
|
open = false
|
||
|
|
||
|
calculatePosition = ->
|
||
|
$popup.parents().each () ->
|
||
|
$this = $ this
|
||
|
$positionParent = $this if $positionParent == null && ($this.css('position') == 'relative' || $this.is 'body')
|
||
|
|
||
|
position = $element.offset()
|
||
|
parentPosition = $positionParent.offset()
|
||
|
|
||
|
windowWidth = $(window).width() - 15
|
||
|
left = position.left
|
||
|
right = left + $popup.width()
|
||
|
|
||
|
if align == 'left' && right > windowWidth
|
||
|
left -= right - windowWidth
|
||
|
else if align == 'right'
|
||
|
left -= $popup.outerWidth() - $element.outerWidth()
|
||
|
|
||
|
height = 'auto'
|
||
|
top = position.top + $element.height() + 10
|
||
|
bottom = top + $popup.height()
|
||
|
windowHeight = $(window).height()
|
||
|
if bottom > windowHeight
|
||
|
height = windowHeight - top;
|
||
|
|
||
|
return {
|
||
|
left: left - parentPosition.left
|
||
|
top: top - parentPosition.top,
|
||
|
height: height - 15}
|
||
|
|
||
|
windowResizeHandler = () ->
|
||
|
return if !open
|
||
|
$popup.css 'height', 'auto'
|
||
|
position = calculatePosition()
|
||
|
$popup.css
|
||
|
left: position.left
|
||
|
top: position.top
|
||
|
height: position.height
|
||
|
|
||
|
$(document.body).bind 'click', documentClickHandler
|
||
|
$(window).bind 'resize', windowResizeHandler
|
||
|
|
||
|
$(element).click (e) ->
|
||
|
e.preventDefault()
|
||
|
e.stopPropagation()
|
||
|
|
||
|
if open
|
||
|
open = false
|
||
|
$popup.removeClass 'open'
|
||
|
return
|
||
|
|
||
|
$popup.addClass 'open'
|
||
|
|
||
|
$popup.css 'height', 'auto'
|
||
|
window.setTimeout (->
|
||
|
position = calculatePosition()
|
||
|
$popup.css
|
||
|
left: position.left
|
||
|
top: position.top
|
||
|
height: position.height
|
||
|
|
||
|
open = true
|
||
|
), 0
|
||
|
|
||
|
scope.$on '$destroy', () ->
|
||
|
$(document.body).unbind 'click', documentClickHandler
|
||
|
$(window).unbind 'click', windowResizeHandler
|