-1
}
function showPosterImage(mediaItem) {
if(isVimeo(mediaItem)) {
return !(STATE.overrides.videoAutoPlay || STATE.overrides.vimeoDefault)
} else {
return !STATE.overrides.videoAutoPlay
}
}
function getCursorAxis(transitionType) {
switch(transitionType) {
case 'fade':
case 'hSlide':
case 'mSlide':
case 'hScroll':
case 'hScrollNC':
case 'grid':
return 'x'
case 'vSlide':
case 'vScroll':
case 'vScrollNC':
return 'y'
}
}
function inBounds(position, bounds) {
return position.x < bounds.width &&
position.y < bounds.height &&
position.x >= 0 &&
position.y >= 0
}
function adjustOutOfBoundsPanel(panelX, panelY, panelWidth, panelHeight) {
var x = panelX
var y = panelY
if(y < 0) y = 0
if(y + theme.titleBarHeight > stage.height) y = stage.height - theme.titleBarHeight
if(x + panelWidth - theme.titleBarHeight - 100 < 0) x = -(panelWidth - theme.titleBarHeight - 100)
if(x + theme.titleBarHeight > stage.width) x = stage.width - theme.titleBarHeight
return { x:x, y:y }
}
function isSpacer(section) {
return section.label === '%SPACER%'
}
function isSingleTextPage(section) {
return section && section.media && section.media.length === 1 && /html|contact/.test(getMediaById(section.media[0]).type)
}
function getPropWithoutReflow(el, prop) {
var display = el.style.display || 'block'
el.style.display = 'none'
var output = el[prop]
el.style.display = display
return output
}
function clamp(min, max) {
return function(x) {
return x < min ? min :
x > max ? max :
x
}
}
function resolveSectionPath(section) {
var firstSub = getFirstValidSub(section)
if(!sectionHasMedia(section)) {
if(section.isIndex) {
return section.key
} else if(firstSub) {
return firstSub.key
} else {
return section.key
}
}
return false
}
function fullscreen(el) {
return function() {
if(document.fullscreenElement) {
document.exitFullscreen()
} else if(document.webkitFullscreenElement) {
document.webkitExitFullscreen()
} else {
if(el.webkitSupportsPresentationMode && el.webkitSupportsPresentationMode('fullscreen')) {
el.webkitSetPresentationMode('fullscreen')
el.setAttribute("controls", true)
} else if(el.requestFullscreen) {
el.requestFullscreen()
el.setAttribute("controls", true)
} else if(el.webkitRequestFullscreen) {
el.webkitRequestFullscreen()
el.setAttribute("controls", true)
}
}
function fullscreenChange() {
if(el.webkitSupportsPresentationMode && el.webkitSupportsPresentationMode('fullscreen') && el.webkitPresentationMode === 'inline') {
el.removeAttribute("controls")
} else if(!(document.isFullscreen || document.webkitIsFullscreen)) {
el.removeAttribute("controls")
}
}
document.addEventListener('fullscreenchange', fullscreenChange, false)
document.addEventListener('webkitfullscreenchange', fullscreenChange, false)
el.addEventListener('webkitendfullscreen', fullscreenChange, false)
}
}
function buildAttachmentButton(options) {
var attachmentBtn = new Sprite()
attachmentBtn.selectable = false
attachmentBtn.style.display = 'flex'
attachmentBtn.style.alignItems = 'center'
attachmentBtn.style.gap = '4px'
// attachmentBtn.pointerEvents = 'none'
var svg = new Svg();
svg.id = 'svg';
svg.position = 'relative'
svg.width = 21;
svg.height = 21;
svg.left = 0;
svg.top = 0;
attachmentBtn.addChild(svg);
var icon = new Path();
icon.id = 'icon';
icon.position = 'relative'
icon.d = options.icon;
icon.strokeWidth = 0;
icon.fill = options.iconColor;
svg.addChild(icon);
var label = new TextField()
label.selectable = false
label.cursor = 'pointer'
label.position = 'relative'
label.fontFamily = options.font
label.fontColor = options.fontColor
label.fontSize = options.fontSize
// label.lineHeight = 21
label.text = options.text
if(options.text) attachmentBtn.addChild(label)
switch(options.alignVertical) {
case "top":
attachmentBtn.element.style.top = "calc(0% + " + (options.verticalOffset || 20) + "px)"
break;
case "center":
attachmentBtn.element.style.top = "calc(50% + " + (options.verticalOffset || 0) + "px)"
break;
case "bottom":
attachmentBtn.element.style.bottom = "calc(0% + " + (options.verticalOffset || 20) + "px)"
break;
}
switch(options.alignHorizontal) {
case "left":
attachmentBtn.element.style.left = "calc(0% + " + (options.horizontalOffset || 20) + "px)"
break;
case "center":
attachmentBtn.element.style.left = "calc(50% + " + (options.horizontalOffset || 0) + "px)"
break;
case "right":
attachmentBtn.element.style.right = "calc(0% + " + (options.horizontalOffset || 20) + "px)"
break;
}
if(options.alignVertical === 'center' && options.alignHorizontal === 'center') {
attachmentBtn.element.style.transform = "translate(-50%, -50%)"
} else if(options.alignVertical === 'center') {
attachmentBtn.element.style.transform = "translateY(-50%)"
} else if(options.alignHorizontal === 'center') {
attachmentBtn.element.style.transform = "translateX(-50%)"
}
attachmentBtn.element.style['mix-blend-mode'] = options.blendMode
attachmentBtn.cursor = 'pointer'
return attachmentBtn
}
function buildAlignedButton(options) {
var button = new Sprite()
button.selectable = false
button.fontFamily = options.font
button.fontColor = options.fontColor
button.fontSize = options.fontSize
switch(options.alignVertical) {
case "top":
button.element.style.top = "calc(0% + " + (options.verticalOffset || 20) + "px)"
break;
case "center":
button.element.style.top = "calc(50% + " + (options.verticalOffset || 0) + "px)"
break;
case "bottom":
button.element.style.bottom = "calc(0% + " + (options.verticalOffset || 20) + "px)"
break;
}
switch(options.alignHorizontal) {
case "left":
button.element.style.left = "calc(0% + " + (options.horizontalOffset || 20) + "px)"
break;
case "center":
button.element.style.left = "calc(50% + " + (options.horizontalOffset || 0) + "px)"
break;
case "right":
button.element.style.right = "calc(0% + " + (options.horizontalOffset || 20) + "px)"
break;
}
if(options.alignVertical === 'center' && options.alignHorizontal === 'center') {
button.element.style.transform = "translate(-50%, -50%) rotate(" + (options.rotation || 0) + "deg)"
} else if(options.alignVertical === 'center') {
button.element.style.transform = "translateY(-50%) rotate(" + (options.rotation || 0) + "deg)"
} else if(options.alignHorizontal === 'center') {
button.element.style.transform = "translateX(-50%) rotate(" + (options.rotation || 0) + "deg)"
} else {
button.element.style.transform = "rotate(" + (options.rotation || 0) + "deg)"
}
button.element.style['mix-blend-mode'] = options.blendMode
button.cursor = 'pointer'
return button
}
function copyToClipboard(text) {
var input = document.createElement('input')
input.value = text
input.style.opacity = 0
document.body.appendChild(input)
input.select()
input.setSelectionRange(0, 99999)
document.execCommand("copy")
document.body.removeChild(input)
}
function isOverlayAndNotGalleryOnly() {
return STATE.overrides.siteDisplayBehavior === 'overlay' && !STATE.overrides.siteDisplayGalleryOnlyOverlay
}
function isClosedGalleryOnlyOverlay() {
return (STATE.overrides.siteDisplayBehavior === 'overlay' && STATE.overrides.siteDisplayGalleryOnlyOverlay && layoutCalcs.mediaOverlayState !== 'open')
}
function isInMediaOverlay() {
return isOverlayAndNotGalleryOnly()
|| (STATE.overrides.siteDisplayBehavior === 'overlay' && STATE.overrides.siteDisplayGalleryOnlyOverlay && layoutCalcs.mediaOverlayState === 'open')
}
function getMarginOverlap() {
return /top|bottom/.test(STATE.menuView.placement()) ? percentToPixels(LAYOUT_MODEL.marginOverlap, stage.height) : percentToPixels(LAYOUT_MODEL.marginOverlap, stage.width)
}
function hasMode(value, mode) {
return mode ? mode.indexOf(value) !== -1 : false;
}
var parallax = (function() {
var prlxEls
var scrollElement
var control = {
get scrollY() {
return scrollElement === window ? window.scrollY : scrollElement.scrollTop
},
get scrollX() {
return scrollElement === window ? window.scrollX : scrollElement.scrollLeft
},
get totalHeight() {
return scrollElement === window ? document.documentElement.clientHeight : scrollElement.offsetHeight
}
}
function getPrlxEls() {
return Array.from(document.getElementsByClassName('parallax'))
.map(function(el) {
var geometry = el.getBoundingClientRect()
el.initialPosition = { x:geometry.x + control.scrollX, y:geometry.y + control.scrollY }
el.speed = el.getAttribute('data-speed')
return el
})
}
function updatePrlxEls(e) {
//console.log('prlxEls', prlxEls.length)
prlxEls
.forEach(function(el) {
var halfViewport = window.innerHeight / 2
// default to center of viewport
var viewportPosition = halfViewport
if(el.initialPosition.y < halfViewport) {
// el initial position is less than top half viewport
viewportPosition = el.initialPosition.y
} else if(el.initialPosition.y > (control.totalHeight - halfViewport)) {
// el initial position is greater than bottom half of viewport
viewportPosition = window.innerHeight - (control.totalHeight - el.initialPosition.y)
}
var posY = (viewportPosition - (el.initialPosition.y - control.scrollY)) * -(el.speed)
el.transY = posY
el.style.transform = 'translate3d(0px, ' + (Math.round(posY * 100000) / 100000) + 'px, 0px)'
})
}
function update() {
prlxEls = getPrlxEls()
updatePrlxEls()
}
function init(container) {
if(scrollElement !== container) {
if(scrollElement) {
scrollElement.removeEventListener('scroll', updatePrlxEls)
}
scrollElement = container
scrollElement.addEventListener('scroll', updatePrlxEls)
}
update()
}
var parallaxResize = debouncer(update, 350)
window.addEventListener('resize', parallaxResize)
return {
setContainer: function(container) {
if(scrollElement !== container) {
scrollElement = container
scrollElement.removeEventListener('scroll', updatePrlxEls)
}
},
update: update,
init: init
}
})()
var keyCode = {
"8":DELETE,
"13":ENTER,
"27":ESCAPE,
"32":SPACE_BAR,
"37":LEFT_ARROW,
"38":UP_ARROW,
"39":RIGHT_ARROW,
"40":DOWN_ARROW,
"16":SHIFT,
"91":COMMAND,
"93":COMMAND,
"224":COMMAND,
"17":CONTROL,
"65":'a',
"72":'h',
"77":'m'
};
var keyName = {
DELETE:8,
ENTER:13,
ESCAPE:27,
SPACE_BAR:32,
LEFT_ARROW:37,
UP_ARROW:38,
RIGHT_ARROW:39,
DOWN_ARROW:40,
LEFT_ARROW:37,
RIGHT_ARROW:39,
SHIFT:16,
COMMAND:91,
COMMAND:93,
COMMAND:224,
CONTROL:17,
'a':65,
'h':72,
'm':77
};
var emailIcon = {
filename: 'email@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M17.977,14.762 L13.317,9.71 L17.981,5.038 C18.077,4.941 18.242,5.009 18.242,5.146 L18.242,14.659 C18.242,14.798 18.071,14.865 17.977,14.762 z M10.86,12.171 C10.592,12.439 10.229,12.59 9.851,12.59 L9.838,12.59 C9.453,12.59 9.084,12.437 8.811,12.165 L7.43,10.786 L2.69,15.611 C2.595,15.707 2.663,15.871 2.799,15.871 L17.191,15.871 C17.325,15.871 17.394,15.712 17.304,15.614 L12.559,10.469 L10.86,12.171 z M9.839,11.518 L9.839,11.518 C9.941,11.518 10.037,11.478 10.11,11.405 L17.165,4.338 C17.261,4.242 17.193,4.077 17.056,4.077 L2.597,4.077 C2.461,4.077 2.392,4.242 2.489,4.338 L9.568,11.406 C9.64,11.478 9.736,11.518 9.839,11.518 z M1.692,5.427 L1.692,14.722 C1.692,14.859 1.859,14.927 1.955,14.829 L6.671,10.028 L1.954,5.319 C1.857,5.222 1.692,5.291 1.692,5.427 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M17.9766923,14.7623077 L13.3169231,9.70953846 L17.9809231,5.03761538 C18.0773846,4.941 18.2423846,5.00930769 18.2423846,5.14576923 L18.2423846,14.6585385 C18.2423846,14.7979231 18.0712308,14.8648462 17.9766923,14.7623077 Z M10.8596923,12.1710769 C10.5922308,12.439 10.2291538,12.5896154 9.85053846,12.5896154 L9.83846154,12.5896154 C9.45323077,12.5896154 9.08369231,12.4367692 8.811,12.1645385 L7.42969231,10.7856154 L2.69,15.6105385 C2.59484615,15.7073846 2.66346154,15.871 2.79923077,15.871 L17.1914615,15.871 C17.3249231,15.871 17.3944615,15.7121538 17.304,15.6140769 L12.5590769,10.4688462 L10.8596923,12.1710769 Z M9.83853846,11.5176923 L9.83884615,11.5176923 C9.94115385,11.5176923 10.0373077,11.4777692 10.1096154,11.4053846 L17.1646923,4.33823077 C17.261,4.24169231 17.1926923,4.07692308 17.0563077,4.07692308 L2.59707692,4.07692308 C2.46061538,4.07692308 2.39230769,4.242 2.48892308,4.33838462 L9.56823077,11.4058462 C9.64038462,11.4780769 9.73638462,11.5176923 9.83853846,11.5176923 Z M1.69230769,5.427 L1.69230769,14.7220769 C1.69230769,14.8591538 1.85861538,14.9271538 1.95469231,14.8293846 L6.67115385,10.0281538 L1.95369231,5.31861538 C1.85715385,5.22230769 1.69230769,5.29069231 1.69230769,5.427 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M16.9796058,14.8654487 L12.9023077,10.2337436 L16.9833077,5.95114744 C17.0677115,5.86258333 17.2120865,5.92519872 17.2120865,6.05028846 L17.2120865,14.7703269 C17.2120865,14.8980962 17.0623269,14.9594423 16.9796058,14.8654487 Z M10.7522308,12.4901538 C10.5182019,12.73575 10.2005096,12.8738141 9.86922115,12.8738141 L9.85865385,12.8738141 C9.52157692,12.8738141 9.19823077,12.7337051 8.959625,12.4841603 L7.75098077,11.2201474 L3.60375,15.6429936 C3.52049038,15.7317692 3.58052885,15.88175 3.69932692,15.88175 L16.2925288,15.88175 C16.4093077,15.88175 16.4701538,15.736141 16.391,15.6462372 L12.2391923,10.9297756 L10.7522308,12.4901538 Z M9.85872115,11.8912179 L9.85899038,11.8912179 C9.94850962,11.8912179 10.0326442,11.8546218 10.0959135,11.7882692 L16.2691058,5.31004487 C16.353375,5.22155128 16.2936058,5.07051282 16.1742692,5.07051282 L3.52244231,5.07051282 C3.40303846,5.07051282 3.34326923,5.22183333 3.42780769,5.3101859 L9.62220192,11.7886923 C9.68533654,11.8549038 9.76933654,11.8912179 9.85872115,11.8912179 Z M2.73076923,6.30808333 L2.73076923,14.8285705 C2.73076923,14.9542244 2.87628846,15.0165577 2.96035577,14.9269359 L7.08725962,10.5258077 L2.95948077,6.20873077 C2.87500962,6.12044872 2.73076923,6.18313462 2.73076923,6.30808333 Z'
}
var plus1Icon = {
filename: 'plus1b@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M6.336,3.8 C2.955,3.8 0.137,6.618 0.136,10 C0.137,13.382 2.955,16.2 6.336,16.2 C9.859,16.2 12.255,13.664 12.255,10.141 C12.255,9.718 12.255,9.155 12.114,8.732 L6.336,8.732 L6.336,11.127 L9.577,11.127 C9.296,12.537 8.027,13.664 6.336,13.664 C4.364,13.664 2.673,11.973 2.673,10 C2.673,8.027 4.364,6.337 6.336,6.336 C7.182,6.337 8.027,6.618 8.591,7.182 L10.423,5.35 C9.296,4.505 8.027,3.8 6.336,3.8 z M17.75,6.759 L16.2,6.759 L16.2,8.873 L13.946,8.873 L13.946,10.423 L16.059,10.423 L16.059,12.536 L17.609,12.536 L17.609,10.423 L19.864,10.423 L19.864,8.873 L17.75,8.873 L17.75,6.759 z',
svgRectPath: 'M1.991,20 C0.898,20 0,19.109 0,18.009 L0,1.969 L0.004,1.972 C0.122,0.656 0.812,0.24 1.991,0 L18.009,0 C19.102,0 20,0.891 20,1.991 L20,18.009 C19.886,19.306 19.218,19.754 18.039,19.994 L18.031,20 L1.991,20 z M6.521,4.113 C3.31,4.113 0.634,6.788 0.633,10 C0.634,13.212 3.31,15.887 6.521,15.887 C9.866,15.887 12.141,13.479 12.141,10.134 C12.141,9.732 12.141,9.198 12.007,8.796 L6.521,8.796 L6.521,11.07 L9.598,11.07 C9.331,12.409 8.126,13.479 6.521,13.479 C4.648,13.479 3.042,11.874 3.042,10 C3.042,8.126 4.648,6.522 6.521,6.521 C7.324,6.522 8.126,6.788 8.662,7.324 L10.402,5.584 C9.331,4.782 8.126,4.113 6.521,4.113 z M17.359,6.922 L15.887,6.922 L15.887,8.93 L13.747,8.93 L13.747,10.402 L15.754,10.402 L15.754,12.408 L17.225,12.408 L17.225,10.402 L19.367,10.402 L19.367,8.93 L17.359,8.93 L17.359,6.922 z',
svgCircPath: 'M10,0 C15.523,-0 20,4.477 20,10 C20,15.523 15.523,20 10,20 C4.477,20 -0,15.523 -0,10 C-0,4.477 4.477,-0 10,-0 z M6.521,4.113 C3.31,4.113 0.634,6.788 0.633,10 C0.634,13.212 3.31,15.887 6.521,15.887 C9.866,15.887 12.141,13.479 12.141,10.134 C12.141,9.732 12.141,9.198 12.007,8.796 L6.521,8.796 L6.521,11.07 L9.598,11.07 C9.331,12.409 8.126,13.479 6.521,13.479 C4.648,13.479 3.042,11.874 3.042,10 C3.042,8.126 4.648,6.522 6.521,6.521 C7.324,6.522 8.126,6.788 8.662,7.324 L10.402,5.584 C9.331,4.782 8.126,4.113 6.521,4.113 z M17.359,6.922 L15.888,6.922 L15.888,8.93 L13.747,8.93 L13.747,10.402 L15.754,10.402 L15.754,12.408 L17.225,12.408 L17.225,10.402 L19.367,10.402 L19.367,8.93 L17.359,8.93 L17.359,6.922 z'
}
var socialIcons = {
'[500px]': {
filename: '500px@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M7.013,9.897 C7.139,9.565 7.294,9.275 7.515,9.024 C7.999,8.474 8.61,8.177 9.337,8.11 C10.362,8.016 11.204,8.411 11.941,9.084 C12.246,9.362 12.516,9.675 12.782,9.991 C12.838,10.058 12.863,10.064 12.923,9.993 C13.265,9.587 13.605,9.179 14.026,8.85 C14.511,8.469 15.045,8.195 15.665,8.122 C17.197,7.943 18.478,8.777 18.804,10.358 C18.941,11.024 18.899,11.681 18.668,12.322 C18.242,13.507 17.255,14.184 15.995,14.169 C15.227,14.16 14.571,13.862 13.973,13.409 C13.582,13.112 13.247,12.757 12.925,12.39 C12.871,12.328 12.846,12.314 12.78,12.383 C12.451,12.724 12.139,13.083 11.769,13.384 C11.301,13.765 10.785,14.051 10.181,14.133 C9.113,14.278 8.19,13.996 7.472,13.158 C7.31,12.968 7.187,12.751 7.086,12.522 C7.074,12.493 7.07,12.459 7.037,12.434 C6.896,12.738 6.722,13.018 6.493,13.261 C5.917,13.873 5.207,14.192 4.369,14.222 C3.763,14.243 3.17,14.166 2.617,13.904 C1.691,13.465 1.182,12.735 1.119,11.704 C1.114,11.625 1.136,11.605 1.214,11.606 C1.712,11.609 2.209,11.609 2.707,11.606 C2.782,11.605 2.803,11.627 2.816,11.7 C2.911,12.268 3.217,12.664 3.789,12.806 C4.588,13.004 5.322,12.551 5.532,11.729 C5.673,11.175 5.612,10.646 5.245,10.185 C5.002,9.879 4.671,9.73 4.283,9.703 C3.724,9.663 3.266,9.847 2.936,10.312 C2.906,10.355 2.87,10.366 2.82,10.365 C2.371,10.364 1.923,10.363 1.474,10.366 C1.396,10.367 1.38,10.345 1.393,10.271 C1.626,8.976 1.857,7.681 2.088,6.386 C2.12,6.209 2.152,6.032 2.181,5.854 C2.191,5.796 2.213,5.774 2.276,5.775 C3.766,5.777 5.257,5.777 6.747,5.775 C6.818,5.774 6.833,5.798 6.833,5.864 C6.83,6.264 6.829,6.664 6.833,7.063 C6.834,7.144 6.813,7.167 6.731,7.166 C5.663,7.164 4.595,7.166 3.528,7.163 C3.439,7.162 3.4,7.177 3.383,7.277 C3.289,7.845 3.185,8.412 3.086,8.979 C3.082,9.003 3.065,9.035 3.091,9.051 C3.12,9.069 3.136,9.034 3.153,9.017 C3.642,8.546 4.239,8.402 4.897,8.437 C5.53,8.471 6.071,8.709 6.517,9.159 C6.703,9.347 6.848,9.564 6.964,9.801 C6.977,9.826 6.99,9.852 7.013,9.897 z M17.33,11.123 C17.333,11.066 17.323,10.982 17.312,10.897 C17.218,10.143 16.583,9.656 15.831,9.755 C15.436,9.807 15.111,10.003 14.804,10.238 C14.462,10.5 14.175,10.82 13.88,11.131 C13.84,11.173 13.858,11.195 13.887,11.228 C14.094,11.46 14.309,11.686 14.552,11.881 C14.955,12.206 15.392,12.456 15.924,12.505 C16.524,12.561 17.01,12.281 17.224,11.737 C17.298,11.549 17.329,11.353 17.33,11.123 z M8.376,11.197 C8.379,11.235 8.382,11.297 8.387,11.358 C8.438,11.942 8.828,12.381 9.393,12.484 C9.703,12.541 10.005,12.5 10.298,12.386 C10.923,12.142 11.399,11.704 11.835,11.212 C11.867,11.176 11.851,11.158 11.826,11.132 C11.514,10.805 11.196,10.484 10.828,10.219 C10.572,10.035 10.303,9.87 9.994,9.794 C9.523,9.677 9.094,9.744 8.759,10.128 C8.499,10.425 8.375,10.777 8.376,11.197 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M7.14517241,9.90206897 C7.26551724,9.58448276 7.41413793,9.30758621 7.625,9.06775862 C8.08758621,8.54189655 8.67189655,8.25844828 9.36655172,8.19431034 C10.3455172,8.10396552 11.15,8.48189655 11.8543103,9.12465517 C12.1460345,9.39086207 12.4044828,9.68931034 12.6581034,9.99137931 C12.712069,10.0558621 12.7356897,10.0615517 12.7931034,9.99362069 C13.1196552,9.60568966 13.445,9.21603448 13.8468966,8.90086207 C14.3103448,8.53741379 14.8210345,8.275 15.4134483,8.20568966 C16.8775862,8.03413793 18.1012069,8.83155172 18.4127586,10.3427586 C18.5437931,10.9784483 18.5034483,11.6068966 18.2832759,12.2196552 C17.8762069,13.352069 16.9332759,13.9984483 15.7284483,13.9843103 C14.9944828,13.9756897 14.367931,13.6912069 13.7963793,13.2577586 C13.422931,12.9744828 13.1031034,12.6346552 12.7953448,12.2837931 C12.7436207,12.225 12.7196552,12.2118966 12.6568966,12.277069 C12.3422414,12.6037931 12.0434483,12.9467241 11.6901724,13.2343103 C11.2434483,13.597931 10.7503448,13.8712069 10.172931,13.9496552 C9.15172414,14.0884483 8.26982759,13.8193103 7.58413793,13.0181034 C7.4287931,12.8363793 7.31155172,12.6293103 7.21534483,12.4105172 C7.20327586,12.382931 7.19965517,12.3496552 7.16844828,12.3265517 C7.03396552,12.6167241 6.86741379,12.8839655 6.6487931,13.1162069 C6.09844828,13.7013793 5.41965517,14.0065517 4.61844828,14.0348276 C4.03948276,14.0553448 3.47241379,13.9815517 2.94431034,13.7312069 C2.05965517,13.3118966 1.57310345,12.6139655 1.51275862,11.6282759 C1.50827586,11.5532759 1.52896552,11.5343103 1.60327586,11.5346552 C2.07913793,11.5381034 2.555,11.5381034 3.03068966,11.5346552 C3.10206897,11.5341379 3.12206897,11.5551724 3.13413793,11.625 C3.22568966,12.167931 3.51775862,12.5460345 4.06482759,12.6818966 C4.82827586,12.8713793 5.52965517,12.4381034 5.73017241,11.6522414 C5.86517241,11.1232759 5.80689655,10.6175862 5.4562069,10.177069 C5.22344828,9.88465517 4.90724138,9.74224138 4.53603448,9.71603448 C4.00189655,9.67844828 3.565,9.85448276 3.24948276,10.297931 C3.22017241,10.3394828 3.18603448,10.3496552 3.13862069,10.3494828 C2.70965517,10.3482759 2.28086207,10.347069 1.85206897,10.3503448 C1.77741379,10.3508621 1.76224138,10.33 1.775,10.2591379 C1.99758621,9.02189655 2.21810345,7.78431034 2.43913793,6.54672414 C2.46931034,6.37741379 2.50017241,6.20810345 2.52810345,6.03844828 C2.53706897,5.98275862 2.55844828,5.96224138 2.61844828,5.96241379 C4.04275862,5.96431034 5.46689655,5.96431034 6.89103448,5.96241379 C6.95913793,5.96224138 6.97362069,5.98448276 6.97327586,6.04810345 C6.97034483,6.42982759 6.96965517,6.81189655 6.9737931,7.19362069 C6.97448276,7.27137931 6.95465517,7.29275862 6.87568966,7.29241379 C5.85534483,7.28965517 4.835,7.29155172 3.81465517,7.2887931 C3.73,7.28862069 3.69224138,7.30258621 3.67637931,7.39775862 C3.58655172,7.94068966 3.48741379,8.48224138 3.39241379,9.02431034 C3.38844828,9.04724138 3.37224138,9.07844828 3.39706897,9.09362069 C3.42465517,9.11051724 3.44017241,9.07706897 3.45655172,9.0612069 C3.92413793,8.61103448 4.49448276,8.47344828 5.12344828,8.50706897 C5.72844828,8.53931034 6.245,8.76637931 6.67103448,9.19672414 C6.84896552,9.3762069 6.98724138,9.58396552 7.0987931,9.81 C7.11103448,9.83431034 7.12362069,9.8587931 7.14517241,9.90206897 Z M17.0048276,11.0737931 C17.007069,11.0189655 16.997931,10.9382759 16.9877586,10.8575862 C16.8974138,10.1372414 16.2906897,9.67137931 15.572069,9.7662069 C15.1948276,9.8162069 14.8836207,10.0027586 14.5905172,10.2274138 C14.2637931,10.4781034 13.9898276,10.7841379 13.7075862,11.0813793 C13.6696552,11.1212069 13.6865517,11.1422414 13.7143103,11.1732759 C13.9125862,11.3953448 14.1174138,11.6112069 14.3496552,11.7981034 C14.7353448,12.1084483 15.1527586,12.3474138 15.6613793,12.3944828 C16.2341379,12.4477586 16.6982759,12.1796552 16.9031034,11.6605172 C16.9741379,11.4808621 17.0037931,11.2932759 17.0048276,11.0737931 Z M8.44758621,11.1437931 C8.45034483,11.18 8.45344828,11.2394828 8.45862069,11.2984483 C8.50724138,11.8562069 8.87965517,12.2755172 9.41948276,12.3741379 C9.7162069,12.4284483 10.0046552,12.3889655 10.2844828,12.2801724 C10.8818966,12.0472414 11.337069,11.6287931 11.7532759,11.1584483 C11.7837931,11.1239655 11.7687931,11.107069 11.7448276,11.082069 C11.4468966,10.7694828 11.1431034,10.462931 10.7912069,10.2093103 C10.5468966,10.0332759 10.2898276,9.8762069 9.99413793,9.80310345 C9.54396552,9.69172414 9.13396552,9.75568966 8.8137931,10.1222414 C8.56551724,10.4063793 8.44689655,10.7431034 8.44758621,11.1437931 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M7.14517241,9.90206897 C7.26551724,9.58448276 7.41413793,9.30758621 7.625,9.06775862 C8.08758621,8.54189655 8.67189655,8.25844828 9.36655172,8.19431034 C10.3455172,8.10396552 11.15,8.48189655 11.8543103,9.12465517 C12.1460345,9.39086207 12.4044828,9.68931034 12.6581034,9.99137931 C12.712069,10.0558621 12.7356897,10.0615517 12.7931034,9.99362069 C13.1196552,9.60568966 13.445,9.21603448 13.8468966,8.90086207 C14.3103448,8.53741379 14.8210345,8.275 15.4134483,8.20568966 C16.8775862,8.03413793 18.1012069,8.83155172 18.4127586,10.3427586 C18.5437931,10.9784483 18.5034483,11.6068966 18.2832759,12.2196552 C17.8762069,13.352069 16.9332759,13.9984483 15.7284483,13.9843103 C14.9944828,13.9756897 14.367931,13.6912069 13.7963793,13.2577586 C13.422931,12.9744828 13.1031034,12.6346552 12.7953448,12.2837931 C12.7436207,12.225 12.7196552,12.2118966 12.6568966,12.277069 C12.3422414,12.6037931 12.0434483,12.9467241 11.6901724,13.2343103 C11.2434483,13.597931 10.7503448,13.8712069 10.172931,13.9496552 C9.15172414,14.0884483 8.26982759,13.8193103 7.58413793,13.0181034 C7.4287931,12.8363793 7.31155172,12.6293103 7.21534483,12.4105172 C7.20327586,12.382931 7.19965517,12.3496552 7.16844828,12.3265517 C7.03396552,12.6167241 6.86741379,12.8839655 6.6487931,13.1162069 C6.09844828,13.7013793 5.41965517,14.0065517 4.61844828,14.0348276 C4.03948276,14.0553448 3.47241379,13.9815517 2.94431034,13.7312069 C2.05965517,13.3118966 1.57310345,12.6139655 1.51275862,11.6282759 C1.50827586,11.5532759 1.52896552,11.5343103 1.60327586,11.5346552 C2.07913793,11.5381034 2.555,11.5381034 3.03068966,11.5346552 C3.10206897,11.5341379 3.12206897,11.5551724 3.13413793,11.625 C3.22568966,12.167931 3.51775862,12.5460345 4.06482759,12.6818966 C4.82827586,12.8713793 5.52965517,12.4381034 5.73017241,11.6522414 C5.86517241,11.1232759 5.80689655,10.6175862 5.4562069,10.177069 C5.22344828,9.88465517 4.90724138,9.74224138 4.53603448,9.71603448 C4.00189655,9.67844828 3.565,9.85448276 3.24948276,10.297931 C3.22017241,10.3394828 3.18603448,10.3496552 3.13862069,10.3494828 C2.70965517,10.3482759 2.28086207,10.347069 1.85206897,10.3503448 C1.77741379,10.3508621 1.76224138,10.33 1.775,10.2591379 C1.99758621,9.02189655 2.21810345,7.78431034 2.43913793,6.54672414 C2.46931034,6.37741379 2.50017241,6.20810345 2.52810345,6.03844828 C2.53706897,5.98275862 2.55844828,5.96224138 2.61844828,5.96241379 C4.04275862,5.96431034 5.46689655,5.96431034 6.89103448,5.96241379 C6.95913793,5.96224138 6.97362069,5.98448276 6.97327586,6.04810345 C6.97034483,6.42982759 6.96965517,6.81189655 6.9737931,7.19362069 C6.97448276,7.27137931 6.95465517,7.29275862 6.87568966,7.29241379 C5.85534483,7.28965517 4.835,7.29155172 3.81465517,7.2887931 C3.73,7.28862069 3.69224138,7.30258621 3.67637931,7.39775862 C3.58655172,7.94068966 3.48741379,8.48224138 3.39241379,9.02431034 C3.38844828,9.04724138 3.37224138,9.07844828 3.39706897,9.09362069 C3.42465517,9.11051724 3.44017241,9.07706897 3.45655172,9.0612069 C3.92413793,8.61103448 4.49448276,8.47344828 5.12344828,8.50706897 C5.72844828,8.53931034 6.245,8.76637931 6.67103448,9.19672414 C6.84896552,9.3762069 6.98724138,9.58396552 7.0987931,9.81 C7.11103448,9.83431034 7.12362069,9.8587931 7.14517241,9.90206897 Z M17.0048276,11.0737931 C17.007069,11.0189655 16.997931,10.9382759 16.9877586,10.8575862 C16.8974138,10.1372414 16.2906897,9.67137931 15.572069,9.7662069 C15.1948276,9.8162069 14.8836207,10.0027586 14.5905172,10.2274138 C14.2637931,10.4781034 13.9898276,10.7841379 13.7075862,11.0813793 C13.6696552,11.1212069 13.6865517,11.1422414 13.7143103,11.1732759 C13.9125862,11.3953448 14.1174138,11.6112069 14.3496552,11.7981034 C14.7353448,12.1084483 15.1527586,12.3474138 15.6613793,12.3944828 C16.2341379,12.4477586 16.6982759,12.1796552 16.9031034,11.6605172 C16.9741379,11.4808621 17.0037931,11.2932759 17.0048276,11.0737931 Z M8.44758621,11.1437931 C8.45034483,11.18 8.45344828,11.2394828 8.45862069,11.2984483 C8.50724138,11.8562069 8.87965517,12.2755172 9.41948276,12.3741379 C9.7162069,12.4284483 10.0046552,12.3889655 10.2844828,12.2801724 C10.8818966,12.0472414 11.337069,11.6287931 11.7532759,11.1584483 C11.7837931,11.1239655 11.7687931,11.107069 11.7448276,11.082069 C11.4468966,10.7694828 11.1431034,10.462931 10.7912069,10.2093103 C10.5468966,10.0332759 10.2898276,9.8762069 9.99413793,9.80310345 C9.54396552,9.69172414 9.13396552,9.75568966 8.8137931,10.1222414 C8.56551724,10.4063793 8.44689655,10.7431034 8.44758621,11.1437931 Z'
},
'[behance]': {
filename: 'behance@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10.485,12.191 C10.485,15.326 7.287,15.223 7.287,15.223 L4.356,15.223 L4.27,15.223 L2.048,15.223 L2.048,4.95 L4.27,4.95 L4.356,4.95 L7.287,4.95 C8.879,4.95 10.135,5.847 10.135,7.685 C10.135,9.523 8.599,9.64 8.599,9.64 C10.624,9.64 10.485,12.191 10.485,12.191 z M12.584,5.555 L16.738,5.555 L16.738,6.82 L12.584,6.82 L12.584,5.555 L12.584,5.555 z M18.255,12.023 L13.038,12.023 C13.038,13.931 14.809,13.811 14.809,13.811 C16.482,13.811 16.424,12.705 16.424,12.705 L18.196,12.705 C18.196,15.639 14.75,15.438 14.75,15.438 C10.616,15.438 10.883,11.51 10.883,11.51 C10.883,11.51 10.879,7.564 14.75,7.564 C18.825,7.564 18.255,12.023 18.255,12.023 z M14.885,9.175 C13.354,9.175 13.141,10.767 13.141,10.767 L16.397,10.767 C16.397,10.767 16.418,9.175 14.885,9.175 z M7.496,10.767 L4.609,10.767 L4.609,13.527 L7.165,13.527 C7.209,13.527 7.274,13.528 7.35,13.527 C7.761,13.517 8.541,13.392 8.541,12.185 C8.541,10.752 7.496,10.767 7.496,10.767 z M8.198,7.945 C8.198,6.871 7.496,6.871 7.496,6.871 L7.125,6.871 L4.609,6.871 L4.609,9.175 L7.317,9.175 C7.784,9.175 8.198,9.018 8.198,7.945 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M10.484622,12.1908776 C10.484622,15.3263776 7.287372,15.2228776 7.287372,15.2228776 L4.356192,15.2228776 L4.270442,15.2228776 L2.048292,15.2228776 L2.048292,4.94987755 L4.270442,4.94987755 L4.356192,4.94987755 L7.287372,4.94987755 C8.878892,4.94987755 10.135252,5.84687755 10.135252,7.68487755 C10.135252,9.52287755 8.599102,9.63987755 8.599102,9.63987755 C10.624272,9.63987755 10.484622,12.1908776 10.484622,12.1908776 Z M12.584272,5.55487755 L16.738002,5.55487755 L16.738002,6.81987755 L12.584272,6.81987755 L12.584272,5.55487755 L12.584272,5.55487755 Z M18.255042,12.0228776 L13.038012,12.0228776 C13.038012,13.9308776 14.809362,13.8108776 14.809362,13.8108776 C16.482222,13.8108776 16.423912,12.7053776 16.423912,12.7053776 L18.196242,12.7053776 C18.196242,15.6388776 14.750072,15.4378776 14.750072,15.4378776 C10.616432,15.4378776 10.882502,11.5103776 10.882502,11.5103776 C10.882502,11.5103776 10.878582,7.56387755 14.750072,7.56387755 C18.825402,7.56387755 18.255042,12.0228776 18.255042,12.0228776 Z M14.8853775,9.17470139 C13.3535087,9.17470139 13.1406686,10.7667184 13.1406686,10.7667184 L16.3974586,10.7667184 C16.3974586,10.7667184 16.4182117,9.17470139 14.8853775,9.17470139 Z M7.49630612,10.7667184 L4.60921107,10.7667184 L4.60921107,13.5266165 L7.16522166,13.5266165 C7.2086584,13.5266165 7.2738135,13.5276216 7.35006911,13.5266165 C7.76127021,13.5165659 8.5407183,13.3919383 8.5407183,12.1848598 C8.5407183,10.752145 7.49630612,10.7667184 7.49630612,10.7667184 Z M8.19756809,7.94500898 C8.19756809,6.87110106 7.49630612,6.87110106 7.49630612,6.87110106 L7.12468071,6.87110106 L4.60921107,6.87110106 L4.60921107,9.17470139 L7.31725024,9.17470139 C7.78443647,9.17470139 8.19756809,9.01841437 8.19756809,7.94500898 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M10.4240442,12.4717898 C10.4240442,15.2937398 7.6264505,15.2005898 7.6264505,15.2005898 L5.061668,15.2005898 L4.98663675,15.2005898 L3.0422555,15.2005898 L3.0422555,5.9548898 L4.98663675,5.9548898 L5.061668,5.9548898 L7.6264505,5.9548898 C9.0190305,5.9548898 10.1183455,6.7621898 10.1183455,8.4163898 C10.1183455,10.0705898 8.77421425,10.1758898 8.77421425,10.1758898 C10.546238,10.1758898 10.4240442,12.4717898 10.4240442,12.4717898 Z M12.261238,6.4993898 L15.8957518,6.4993898 L15.8957518,7.6378898 L12.261238,7.6378898 L12.261238,6.4993898 L12.261238,6.4993898 Z M17.2231618,12.3205898 L12.6582605,12.3205898 C12.6582605,14.0377898 14.2081918,13.9297898 14.2081918,13.9297898 C15.6719443,13.9297898 15.620923,12.9348398 15.620923,12.9348398 L17.1717118,12.9348398 C17.1717118,15.5749898 14.156313,15.3940898 14.156313,15.3940898 C10.539378,15.3940898 10.7721893,11.8593398 10.7721893,11.8593398 C10.7721893,11.8593398 10.7687593,8.3074898 14.156313,8.3074898 C17.7222268,8.3074898 17.2231618,12.3205898 17.2231618,12.3205898 Z M14.2747053,9.75723125 C12.9343201,9.75723125 12.7480851,11.1900465 12.7480851,11.1900465 L15.5977763,11.1900465 C15.5977763,11.1900465 15.6159352,9.75723125 14.2747053,9.75723125 Z M7.80926785,11.1900465 L5.28305968,11.1900465 L5.28305968,13.6739548 L7.51956896,13.6739548 C7.5575761,13.6739548 7.61458682,13.6748594 7.68131047,13.6739548 C8.04111143,13.6649093 8.72312852,13.5527445 8.72312852,12.4663738 C8.72312852,11.1769305 7.80926785,11.1900465 7.80926785,11.1900465 Z M8.42287208,8.65050808 C8.42287208,7.68399096 7.80926785,7.68399096 7.80926785,7.68399096 L7.48409562,7.68399096 L5.28305968,7.68399096 L5.28305968,9.75723125 L7.65259396,9.75723125 C8.06138191,9.75723125 8.42287208,9.61657293 8.42287208,8.65050808 Z'
},
'[blogger]': {
filename: 'blogger@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M16.509,12.704 C16.497,14.991 14.635,16.864 12.344,16.864 L7.559,16.864 C5.267,16.864 3.395,14.991 3.395,12.704 L3.395,7.844 C3.395,5.551 5.267,3.674 7.559,3.674 L10.471,3.674 C11.547,3.803 13.111,4.723 13.689,5.949 C13.847,6.292 13.931,6.345 14.062,7.365 C14.134,7.889 14.17,8.276 14.404,8.491 C14.733,8.792 15.958,8.59 16.2,8.778 L16.386,8.924 L16.497,9.153 L16.535,9.337 L16.509,12.704 z M12.304,11.851 L7.611,11.851 C7.171,11.851 6.814,12.204 6.814,12.642 C6.814,13.073 7.171,13.436 7.611,13.436 L12.304,13.436 C12.743,13.436 13.097,13.073 13.097,12.642 C13.097,12.204 12.743,11.851 12.304,11.851 z M7.611,8.674 L9.921,8.674 C10.361,8.674 10.719,8.311 10.719,7.876 C10.719,7.439 10.361,7.08 9.921,7.08 L7.611,7.08 C7.171,7.08 6.814,7.439 6.814,7.876 C6.814,8.311 7.171,8.674 7.611,8.674 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M16.509,12.704 C16.4965,14.991 14.635,16.864 12.344,16.864 L7.559,16.864 C5.2675,16.864 3.395,14.991 3.395,12.704 L3.395,7.8435 C3.395,5.5515 5.2675,3.6745 7.559,3.6745 L10.471,3.6745 C11.547,3.8025 13.1115,4.7235 13.689,5.949 C13.847,6.292 13.931,6.3455 14.062,7.3645 C14.1335,7.889 14.1695,8.2765 14.404,8.4915 C14.733,8.7915 15.9585,8.59 16.2,8.7785 L16.3865,8.924 L16.497,9.1535 L16.535,9.337 L16.509,12.704 Z M12.304,11.8505 L7.6115,11.8505 C7.171,11.8505 6.8145,12.204 6.8145,12.6425 C6.8145,13.073 7.171,13.4365 7.6115,13.4365 L12.304,13.4365 C12.7425,13.4365 13.097,13.073 13.097,12.6425 C13.097,12.204 12.7425,11.8505 12.304,11.8505 Z M7.6115,8.6735 L9.921,8.6735 C10.3615,8.6735 10.719,8.311 10.719,7.8755 C10.719,7.439 10.3615,7.0795 9.921,7.0795 L7.6115,7.0795 C7.171,7.0795 6.8145,7.439 6.8145,7.8755 C6.8145,8.3115 7.171,8.6735 7.6115,8.6735 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M16.509,12.704 C16.4965,14.991 14.635,16.864 12.344,16.864 L7.559,16.864 C5.2675,16.864 3.395,14.991 3.395,12.704 L3.395,7.8435 C3.395,5.5515 5.2675,3.6745 7.559,3.6745 L10.471,3.6745 C11.547,3.8025 13.1115,4.7235 13.689,5.949 C13.847,6.292 13.931,6.3455 14.062,7.3645 C14.1335,7.889 14.1695,8.2765 14.404,8.4915 C14.733,8.7915 15.9585,8.59 16.2,8.7785 L16.3865,8.924 L16.497,9.1535 L16.535,9.337 L16.509,12.704 Z M12.304,11.8505 L7.6115,11.8505 C7.171,11.8505 6.8145,12.204 6.8145,12.6425 C6.8145,13.073 7.171,13.4365 7.6115,13.4365 L12.304,13.4365 C12.7425,13.4365 13.097,13.073 13.097,12.6425 C13.097,12.204 12.7425,11.8505 12.304,11.8505 Z M7.6115,8.6735 L9.921,8.6735 C10.3615,8.6735 10.719,8.311 10.719,7.8755 C10.719,7.439 10.3615,7.0795 9.921,7.0795 L7.6115,7.0795 C7.171,7.0795 6.8145,7.439 6.8145,7.8755 C6.8145,8.3115 7.171,8.6735 7.6115,8.6735 Z'
},
'[digg]': {
filename: 'digg@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M5.968,12.68 L2.081,12.68 L2.081,7.931 L4.437,7.931 L4.437,5.856 L5.968,5.856 L5.968,12.68 z M8.342,12.698 L6.757,12.698 L6.757,7.922 L8.342,7.922 L8.342,12.698 z M8.342,7.236 L6.757,7.236 L6.757,5.941 L8.342,5.941 L8.342,7.236 z M13.046,14.774 L12.37,14.774 L9.132,14.774 L9.132,13.441 L11.515,13.441 L11.515,12.698 L9.158,12.698 L9.158,7.95 L13.046,7.95 L13.046,14.774 z M17.74,14.774 L17.065,14.774 L13.826,14.774 L13.826,13.441 L16.21,13.441 L16.21,12.698 L13.853,12.698 L13.853,7.95 L17.74,7.95 L17.74,14.774 z M3.51,9.162 L3.51,11.321 L4.308,11.321 L4.308,9.162 L3.51,9.162 z M10.783,9.162 L10.783,11.321 L11.582,11.321 L11.582,9.162 L10.783,9.162 z M15.328,9.162 L15.328,11.321 L16.126,11.321 L16.126,9.162 L15.328,9.162 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M5.96772727,12.68 L2.08090909,12.68 L2.08090909,7.93136364 L4.43727273,7.93136364 L4.43727273,5.85636364 L5.96772727,5.85636364 L5.96772727,12.68 Z M8.34181818,12.6977273 L6.75727273,12.6977273 L6.75727273,7.92181818 L8.34181818,7.92181818 L8.34181818,12.6977273 Z M8.34181818,7.23636364 L6.75727273,7.23636364 L6.75727273,5.94090909 L8.34181818,5.94090909 L8.34181818,7.23636364 Z M13.0459091,14.7736364 L12.3695455,14.7736364 L9.13181818,14.7736364 L9.13181818,13.4409091 L11.5154545,13.4409091 L11.5154545,12.6977273 L9.15818182,12.6977273 L9.15818182,7.95 L13.0459091,7.95 L13.0459091,14.7736364 Z M17.74,14.7736364 L17.0645455,14.7736364 L13.8259091,14.7736364 L13.8259091,13.4409091 L16.2095455,13.4409091 L16.2095455,12.6977273 L13.8531818,12.6977273 L13.8531818,7.95 L17.74,7.95 L17.74,14.7736364 Z M3.51,9.16227273 L3.51,11.3213636 L4.30818182,11.3213636 L4.30818182,9.16227273 L3.51,9.16227273 Z M10.7827273,9.16227273 L10.7827273,11.3213636 L11.5818182,11.3213636 L11.5818182,9.16227273 L10.7827273,9.16227273 Z M15.3281818,9.16227273 L15.3281818,11.3213636 L16.1263636,11.3213636 L16.1263636,9.16227273 L15.3281818,9.16227273 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M5.96772727,12.68 L2.08090909,12.68 L2.08090909,7.93136364 L4.43727273,7.93136364 L4.43727273,5.85636364 L5.96772727,5.85636364 L5.96772727,12.68 Z M8.34181818,12.6977273 L6.75727273,12.6977273 L6.75727273,7.92181818 L8.34181818,7.92181818 L8.34181818,12.6977273 Z M8.34181818,7.23636364 L6.75727273,7.23636364 L6.75727273,5.94090909 L8.34181818,5.94090909 L8.34181818,7.23636364 Z M13.0459091,14.7736364 L12.3695455,14.7736364 L9.13181818,14.7736364 L9.13181818,13.4409091 L11.5154545,13.4409091 L11.5154545,12.6977273 L9.15818182,12.6977273 L9.15818182,7.95 L13.0459091,7.95 L13.0459091,14.7736364 Z M17.74,14.7736364 L17.0645455,14.7736364 L13.8259091,14.7736364 L13.8259091,13.4409091 L16.2095455,13.4409091 L16.2095455,12.6977273 L13.8531818,12.6977273 L13.8531818,7.95 L17.74,7.95 L17.74,14.7736364 Z M3.51,9.16227273 L3.51,11.3213636 L4.30818182,11.3213636 L4.30818182,9.16227273 L3.51,9.16227273 Z M10.7827273,9.16227273 L10.7827273,11.3213636 L11.5818182,11.3213636 L11.5818182,9.16227273 L10.7827273,9.16227273 Z M15.3281818,9.16227273 L15.3281818,11.3213636 L16.1263636,11.3213636 L16.1263636,9.16227273 L15.3281818,9.16227273 Z'
},
'[dribbble]': {
filename: 'dribbble@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10,1.516 C14.686,1.516 18.484,5.314 18.484,10 C18.484,14.686 14.686,18.484 10,18.484 C5.314,18.484 1.516,14.686 1.516,10 C1.516,5.314 5.314,1.516 10,1.516 z M11.289,11.159 C11.272,11.164 11.256,11.169 11.24,11.175 C8.959,12.044 6.68,13.47 5.533,15.712 C6.786,16.799 8.405,17.122 10.001,17.263 C11.01,17.263 11.97,17.058 12.844,16.687 C12.736,16.05 12.313,13.821 11.289,11.159 z M13.516,10.725 L12.652,10.822 C13.607,13.446 13.995,15.582 14.069,16.022 C15.704,14.918 16.865,13.168 17.189,11.14 C16,10.73 14.754,10.74 13.516,10.725 z M5.365,15.595 C5.46,15.673 5.528,15.722 5.528,15.722 L5.533,15.712 L5.365,15.595 z M10.201,8.716 C6.454,9.838 2.856,9.756 2.728,9.753 C2.725,9.83 2.722,9.906 2.722,9.983 C2.722,11.853 3.428,13.559 4.587,14.849 C4.587,14.847 4.584,14.845 4.584,14.845 C4.584,14.845 6.607,11.412 10.792,9.953 C10.61,9.539 10.41,9.124 10.201,8.716 z M15.623,5.36 C15.61,5.38 14.442,7.068 11.567,8.241 C11.737,8.587 11.9,8.94 12.208,9.672 C14.71,9.358 17.173,9.888 17.278,9.911 C17.262,8.183 16.644,6.599 15.623,5.36 z M6.895,3.399 C4.865,4.358 3.35,6.228 2.877,8.483 C3.07,8.486 6.103,8.522 9.599,7.594 C8.339,5.354 6.992,3.529 6.895,3.399 z M8.375,2.875 C9.375,4.406 9.719,5 11.007,7.156 C13.755,6.126 14.832,4.544 14.809,4.52 C13.5,3.188 11.125,2.375 8.375,2.875 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M18.2541379,8.18724138 C18.1424138,7.63965517 17.9744828,7.10034483 17.7572414,6.58517241 C17.5437931,6.07931034 17.2789655,5.59241379 16.9713793,5.13724138 C16.6662069,4.68586207 16.3162069,4.26172414 15.9306897,3.87655172 C15.5455172,3.49068966 15.1210345,3.14034483 14.67,2.83586207 C14.2148276,2.52724138 13.7272414,2.26344828 13.222069,2.04931034 C12.7068966,1.83241379 12.167931,1.66413793 11.62,1.55310345 C11.0589655,1.43793103 10.4810345,1.37931034 9.9037931,1.37931034 C9.32586207,1.37931034 8.74862069,1.43793103 8.18689655,1.55310345 C7.63931034,1.66413793 7.1,1.83275862 6.58517241,2.04931034 C6.08,2.26344828 5.59241379,2.52758621 5.13655172,2.83586207 C4.68517241,3.14034483 4.26103448,3.49034483 3.87586207,3.87655172 C3.49034483,4.26172414 3.14068966,4.6862069 2.83586207,5.13724138 C2.52793103,5.59241379 2.26344828,6.07931034 2.05,6.58517241 C1.83172414,7.10034483 1.66448276,7.63965517 1.55241379,8.18724138 C1.43758621,8.74758621 1.37931034,9.32551724 1.37931034,9.90310345 C1.37931034,10.4817241 1.43758621,11.0596552 1.55241379,11.6203448 C1.66448276,12.167931 1.83206897,12.7072414 2.04965517,13.222069 C2.26310345,13.7272414 2.52793103,14.2155172 2.83551724,14.6706897 C3.14034483,15.122069 3.49,15.5455172 3.87551724,15.9313793 C4.26068966,16.3165517 4.68517241,16.6662069 5.1362069,16.9713793 C5.59206897,17.2793103 6.07965517,17.5437931 6.58482759,17.7572414 C7.09931034,17.9755172 7.63896552,18.1417241 8.18655172,18.2541379 C8.74827586,18.37 9.32551724,18.427931 9.90344828,18.427931 C10.4806897,18.427931 11.0586207,18.37 11.6196552,18.2541379 C12.167931,18.1417241 12.7065517,17.9751724 13.2217241,17.7572414 C13.7268966,17.5437931 14.2144828,17.2789655 14.6696552,16.9713793 C15.1210345,16.6662069 15.5451724,16.3168966 15.9303448,15.9313793 C16.3155172,15.5455172 16.6658621,15.1217241 16.9710345,14.6706897 C17.2789655,14.2155172 17.5434483,13.7272414 17.7568966,13.222069 C17.9744828,12.7075862 18.142069,12.167931 18.2537931,11.6203448 C18.3689655,11.0593103 18.4268966,10.4813793 18.4268966,9.90310345 C18.4272414,9.32551724 18.3693103,8.74758621 18.2541379,8.18724138 Z M17.1803448,9.83103448 C17.0751724,9.80827586 14.6117241,9.27793103 12.1103448,9.59241379 C12.0593103,9.46793103 12.0072414,9.34241379 11.9534483,9.21655172 C11.802069,8.86034483 11.6389655,8.50724138 11.4693103,8.16068966 C14.3444828,6.98758621 15.5117241,5.29965517 15.5251724,5.27965517 C16.5462069,6.51896552 17.1637931,8.10310345 17.1803448,9.83103448 Z M14.7113793,4.44 C14.6931034,4.46827586 13.6565517,6.0462069 10.9089655,7.0762069 C9.66448276,4.78965517 8.29724138,2.97344828 8.18793103,2.82931034 C8.73827586,2.69586207 9.31206897,2.6237931 9.90344828,2.6237931 C11.7468966,2.6237931 13.4286207,3.31068966 14.7113793,4.44 Z M8.15965517,2.83517241 C8.15965517,2.83586207 8.15827586,2.83655172 8.15827586,2.83655172 C8.15827586,2.83655172 8.15034483,2.83862069 8.13689655,2.84137931 C8.14413793,2.83931034 8.15241379,2.83793103 8.15965517,2.83517241 Z M6.79724138,3.31931034 C6.89413793,3.44931034 8.24068966,5.27448276 9.50068966,7.5137931 C6.00517241,8.44241379 2.97172414,8.4062069 2.77931034,8.40275862 C3.25241379,6.14793103 4.76724138,4.27827586 6.79724138,3.31931034 Z M2.6237931,9.90310345 C2.6237931,9.82551724 2.62724138,9.74965517 2.63,9.67310345 C2.75827586,9.67586207 6.35551724,9.75758621 10.1034483,8.63586207 C10.312069,9.04413793 10.5117241,9.45896552 10.6941379,9.87344828 C10.597931,9.90034483 10.502069,9.92931034 10.4072414,9.96034483 C6.47862069,11.23 4.48586207,14.7651724 4.48586207,14.7651724 C4.48586207,14.7651724 4.48862069,14.7672414 4.48862069,14.7686207 C3.32965517,13.4786207 2.6237931,11.7734483 2.6237931,9.90310345 Z M9.90344828,17.1834483 C8.14172414,17.1834483 6.52586207,16.5572414 5.26655172,15.5151724 C5.36206897,15.5927586 5.42965517,15.6424138 5.42965517,15.6424138 C5.42965517,15.6424138 6.82517241,12.5989655 11.142069,11.0948276 C11.1582759,11.0886207 11.1744828,11.0841379 11.1906897,11.0793103 C12.2151724,13.7410345 12.637931,15.9703448 12.7458621,16.6065517 C11.872069,16.9782759 10.9117241,17.1834483 9.90344828,17.1834483 Z M13.9713793,15.9417241 C13.8972414,15.502069 13.5093103,13.3655172 12.5544828,10.7417241 C14.9041379,10.3658621 16.9410345,11.0103448 17.0910345,11.0596552 C16.7668966,13.087931 15.6058621,14.8375862 13.9713793,15.9417241 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M18.2541379,8.18724138 C18.1424138,7.63965517 17.9744828,7.10034483 17.7572414,6.58517241 C17.5437931,6.07931034 17.2789655,5.59241379 16.9713793,5.13724138 C16.6662069,4.68586207 16.3162069,4.26172414 15.9306897,3.87655172 C15.5455172,3.49068966 15.1210345,3.14034483 14.67,2.83586207 C14.2148276,2.52724138 13.7272414,2.26344828 13.222069,2.04931034 C12.7068966,1.83241379 12.167931,1.66413793 11.62,1.55310345 C11.0589655,1.43793103 10.4810345,1.37931034 9.9037931,1.37931034 C9.32586207,1.37931034 8.74862069,1.43793103 8.18689655,1.55310345 C7.63931034,1.66413793 7.1,1.83275862 6.58517241,2.04931034 C6.08,2.26344828 5.59241379,2.52758621 5.13655172,2.83586207 C4.68517241,3.14034483 4.26103448,3.49034483 3.87586207,3.87655172 C3.49034483,4.26172414 3.14068966,4.6862069 2.83586207,5.13724138 C2.52793103,5.59241379 2.26344828,6.07931034 2.05,6.58517241 C1.83172414,7.10034483 1.66448276,7.63965517 1.55241379,8.18724138 C1.43758621,8.74758621 1.37931034,9.32551724 1.37931034,9.90310345 C1.37931034,10.4817241 1.43758621,11.0596552 1.55241379,11.6203448 C1.66448276,12.167931 1.83206897,12.7072414 2.04965517,13.222069 C2.26310345,13.7272414 2.52793103,14.2155172 2.83551724,14.6706897 C3.14034483,15.122069 3.49,15.5455172 3.87551724,15.9313793 C4.26068966,16.3165517 4.68517241,16.6662069 5.1362069,16.9713793 C5.59206897,17.2793103 6.07965517,17.5437931 6.58482759,17.7572414 C7.09931034,17.9755172 7.63896552,18.1417241 8.18655172,18.2541379 C8.74827586,18.37 9.32551724,18.427931 9.90344828,18.427931 C10.4806897,18.427931 11.0586207,18.37 11.6196552,18.2541379 C12.167931,18.1417241 12.7065517,17.9751724 13.2217241,17.7572414 C13.7268966,17.5437931 14.2144828,17.2789655 14.6696552,16.9713793 C15.1210345,16.6662069 15.5451724,16.3168966 15.9303448,15.9313793 C16.3155172,15.5455172 16.6658621,15.1217241 16.9710345,14.6706897 C17.2789655,14.2155172 17.5434483,13.7272414 17.7568966,13.222069 C17.9744828,12.7075862 18.142069,12.167931 18.2537931,11.6203448 C18.3689655,11.0593103 18.4268966,10.4813793 18.4268966,9.90310345 C18.4272414,9.32551724 18.3693103,8.74758621 18.2541379,8.18724138 Z M17.1803448,9.83103448 C17.0751724,9.80827586 14.6117241,9.27793103 12.1103448,9.59241379 C12.0593103,9.46793103 12.0072414,9.34241379 11.9534483,9.21655172 C11.802069,8.86034483 11.6389655,8.50724138 11.4693103,8.16068966 C14.3444828,6.98758621 15.5117241,5.29965517 15.5251724,5.27965517 C16.5462069,6.51896552 17.1637931,8.10310345 17.1803448,9.83103448 Z M14.7113793,4.44 C14.6931034,4.46827586 13.6565517,6.0462069 10.9089655,7.0762069 C9.66448276,4.78965517 8.29724138,2.97344828 8.18793103,2.82931034 C8.73827586,2.69586207 9.31206897,2.6237931 9.90344828,2.6237931 C11.7468966,2.6237931 13.4286207,3.31068966 14.7113793,4.44 Z M8.15965517,2.83517241 C8.15965517,2.83586207 8.15827586,2.83655172 8.15827586,2.83655172 C8.15827586,2.83655172 8.15034483,2.83862069 8.13689655,2.84137931 C8.14413793,2.83931034 8.15241379,2.83793103 8.15965517,2.83517241 Z M6.79724138,3.31931034 C6.89413793,3.44931034 8.24068966,5.27448276 9.50068966,7.5137931 C6.00517241,8.44241379 2.97172414,8.4062069 2.77931034,8.40275862 C3.25241379,6.14793103 4.76724138,4.27827586 6.79724138,3.31931034 Z M2.6237931,9.90310345 C2.6237931,9.82551724 2.62724138,9.74965517 2.63,9.67310345 C2.75827586,9.67586207 6.35551724,9.75758621 10.1034483,8.63586207 C10.312069,9.04413793 10.5117241,9.45896552 10.6941379,9.87344828 C10.597931,9.90034483 10.502069,9.92931034 10.4072414,9.96034483 C6.47862069,11.23 4.48586207,14.7651724 4.48586207,14.7651724 C4.48586207,14.7651724 4.48862069,14.7672414 4.48862069,14.7686207 C3.32965517,13.4786207 2.6237931,11.7734483 2.6237931,9.90310345 Z M9.90344828,17.1834483 C8.14172414,17.1834483 6.52586207,16.5572414 5.26655172,15.5151724 C5.36206897,15.5927586 5.42965517,15.6424138 5.42965517,15.6424138 C5.42965517,15.6424138 6.82517241,12.5989655 11.142069,11.0948276 C11.1582759,11.0886207 11.1744828,11.0841379 11.1906897,11.0793103 C12.2151724,13.7410345 12.637931,15.9703448 12.7458621,16.6065517 C11.872069,16.9782759 10.9117241,17.1834483 9.90344828,17.1834483 Z M13.9713793,15.9417241 C13.8972414,15.502069 13.5093103,13.3655172 12.5544828,10.7417241 C14.9041379,10.3658621 16.9410345,11.0103448 17.0910345,11.0596552 C16.7668966,13.087931 15.6058621,14.8375862 13.9713793,15.9417241 Z'
},
'[ello]': {
filename: 'ello@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10,1.667 C5.398,1.667 1.667,5.407 1.667,10 C1.667,14.602 5.407,18.333 10,18.333 C14.602,18.333 18.333,14.593 18.333,10 C18.333,5.398 14.593,1.667 10,1.667 z M10,15 C7.722,15 5.722,13.444 5.167,11.25 C5.111,11 5.25,10.722 5.5,10.667 C5.75,10.611 6.028,10.75 6.083,11 C6.556,12.778 8.167,14.028 10,14.028 C11.833,14.028 13.444,12.778 13.917,11 C13.972,10.75 14.25,10.583 14.5,10.667 C14.75,10.722 14.917,11 14.833,11.25 C14.278,13.444 12.278,15 10,15 L10,15 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M10,1.66666667 C5.39762708,1.66666667 1.66666667,5.40699199 1.66666667,10 C1.66666667,14.6023729 5.40699199,18.3333333 10,18.3333333 C14.6023729,18.3333333 18.3333333,14.593008 18.3333333,10 C18.3333333,5.39762708 14.593008,1.66666667 10,1.66666667 Z M10,15 C7.72222222,15 5.72222222,13.4444444 5.16666667,11.25 C5.11111111,11 5.25,10.7222222 5.5,10.6666667 C5.75,10.6111111 6.02777778,10.75 6.08333333,11 C6.55555556,12.7777778 8.16666667,14.0277778 10,14.0277778 C11.8333333,14.0277778 13.4444444,12.7777778 13.9166667,11 C13.9722222,10.75 14.25,10.5833333 14.5,10.6666667 C14.75,10.7222222 14.9166667,11 14.8333333,11.25 C14.2777778,13.4444444 12.2777778,15 10,15 L10,15 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M10,1.66666667 C5.39762708,1.66666667 1.66666667,5.40699199 1.66666667,10 C1.66666667,14.6023729 5.40699199,18.3333333 10,18.3333333 C14.6023729,18.3333333 18.3333333,14.593008 18.3333333,10 C18.3333333,5.39762708 14.593008,1.66666667 10,1.66666667 Z M10,15 C7.72222222,15 5.72222222,13.4444444 5.16666667,11.25 C5.11111111,11 5.25,10.7222222 5.5,10.6666667 C5.75,10.6111111 6.02777778,10.75 6.08333333,11 C6.55555556,12.7777778 8.16666667,14.0277778 10,14.0277778 C11.8333333,14.0277778 13.4444444,12.7777778 13.9166667,11 C13.9722222,10.75 14.25,10.5833333 14.5,10.6666667 C14.75,10.7222222 14.9166667,11 14.8333333,11.25 C14.2777778,13.4444444 12.2777778,15 10,15 L10,15 Z'
},
'[email]': emailIcon,
'[facebook]': {
filename: 'facebook@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10.25,17.876 L10.25,10.376 L12.75,10.376 L13.375,7.25 L10.25,7.25 L10.25,6 C10.25,4.75 10.876,4.126 12.125,4.126 L13.375,4.126 L13.375,1 L10.875,1 C8.578,1 7.125,2.801 7.125,5.376 L7.125,7.25 L4.625,7.25 L4.625,10.376 L7.125,10.376 L7.125,17.876 L10.25,17.876 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M13.75,20 L13.75,12.5 L16.25,12.5 L16.875,9.375 L13.75,9.375 L13.75,8.125 C13.75,6.875 14.37625,6.25 15.625,6.25 L16.875,6.25 L16.875,3.125 L14.375,3.125 C12.078125,3.125 10.625,4.925625 10.625,7.5 L10.625,9.375 L8.125,9.375 L8.125,12.5 L10.625,12.5 L10.625,20 L13.75,20 Z',
svgCircPath: 'M9.625,19.9931017 C4.27478571,19.7959399 0,15.3973202 0,10 C0,4.47593818 4.4771525,0 10,0 C15.5240618,0 20,4.4771525 20,10 C20,14.5701102 16.9356514,18.4228412 12.75,19.6172098 L12.75,12.5 L15.25,12.5 L15.875,9.375 L12.75,9.375 L12.75,8.125 C12.75,6.875 13.37625,6.25 14.625,6.25 L15.875,6.25 L15.875,3.125 L13.375,3.125 C11.078125,3.125 9.625,4.925625 9.625,7.5 L9.625,9.375 L7.125,9.375 L7.125,12.5 L9.625,12.5 L9.625,19.9931017 Z'
},
'[flickr]': {
filename: 'flickr@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M5.731,13.154 C3.87,13.154 2.361,11.647 2.361,9.785 C2.361,7.923 3.87,6.416 5.731,6.416 C7.593,6.416 9.101,7.923 9.101,9.785 C9.1,11.647 7.593,13.154 5.731,13.154 z M14.187,13.154 C12.325,13.154 10.817,11.647 10.817,9.785 C10.817,7.923 12.325,6.416 14.187,6.416 C16.047,6.416 17.556,7.923 17.556,9.785 C17.556,11.647 16.047,13.154 14.187,13.154 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M5.73130435,13.153913 C3.87,13.153913 2.36130435,11.6465217 2.36130435,9.78521739 C2.36130435,7.92304348 3.87,6.41565217 5.73130435,6.41565217 C7.5926087,6.41565217 9.10086957,7.92304348 9.10086957,9.78521739 C9.10043478,11.6465217 7.5926087,13.153913 5.73130435,13.153913 Z M14.1865217,13.153913 C12.3252174,13.153913 10.8169565,11.6465217 10.8169565,9.78521739 C10.8169565,7.92304348 12.3252174,6.41565217 14.1865217,6.41565217 C16.0469565,6.41565217 17.556087,7.92304348 17.556087,9.78521739 C17.556087,11.6465217 16.0469565,13.153913 14.1865217,13.153913 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M5.73130435,13.153913 C3.87,13.153913 2.36130435,11.6465217 2.36130435,9.78521739 C2.36130435,7.92304348 3.87,6.41565217 5.73130435,6.41565217 C7.5926087,6.41565217 9.10086957,7.92304348 9.10086957,9.78521739 C9.10043478,11.6465217 7.5926087,13.153913 5.73130435,13.153913 Z M14.1865217,13.153913 C12.3252174,13.153913 10.8169565,11.6465217 10.8169565,9.78521739 C10.8169565,7.92304348 12.3252174,6.41565217 14.1865217,6.41565217 C16.0469565,6.41565217 17.556087,7.92304348 17.556087,9.78521739 C17.556087,11.6465217 16.0469565,13.153913 14.1865217,13.153913 Z'
},
'[google plus]': plus1Icon,
'[houzz]': {
filename: 'houzz@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10.016,6.937 L10.016,6.824 L14.516,4 L14.516,9.717 L10.016,6.937 z M10.016,13.21 L10.016,19 L14.516,16.176 L14.516,10.345 L10.016,13.21 z M9.5,13.063 L9.5,13.176 L5,16 L5,10.283 L9.5,13.063 z M9.5,6.79 L9.5,1 L5,3.824 L5,9.655 L9.5,6.79 L9.5,6.79 z M5.5,9.963 L9.516,12.462 L9.479,7.464 L5.5,9.963 z M14.016,10.037 L10,7.538 L10.038,12.536 L14.016,10.037 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M10.0161105,6.9372511 L10.0161105,6.82434949 L14.5161105,4 L14.5161105,9.71724392 L10.0161105,6.9372511 Z M10.0161105,13.2103483 L10.0161105,19 L14.5161105,16.1756505 L14.5161105,10.3445536 L10.0161105,13.2103483 Z M9.5,13.0627489 L9.5,13.1756505 L5,16 L5,10.2827561 L9.5,13.0627489 Z M9.5,6.78965167 L9.5,1 L5,3.82434949 L5,9.65544636 L9.5,6.78965167 L9.5,6.78965167 Z M5.5,9.96340065 L9.51611053,12.4619386 L9.47856618,7.46421069 L5.5,9.96340065 Z M14.0161105,10.0365994 L10,7.53806139 L10.0375444,12.5357893 L14.0161105,10.0365994 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M10.0161105,6.9372511 L10.0161105,6.82434949 L14.5161105,4 L14.5161105,9.71724392 L10.0161105,6.9372511 Z M10.0161105,13.2103483 L10.0161105,19 L14.5161105,16.1756505 L14.5161105,10.3445536 L10.0161105,13.2103483 Z M9.5,13.0627489 L9.5,13.1756505 L5,16 L5,10.2827561 L9.5,13.0627489 Z M9.5,6.78965167 L9.5,1 L5,3.82434949 L5,9.65544636 L9.5,6.78965167 L9.5,6.78965167 Z M5.5,9.96340065 L9.51611053,12.4619386 L9.47856618,7.46421069 L5.5,9.96340065 Z M14.0161105,10.0365994 L10,7.53806139 L10.0375444,12.5357893 L14.0161105,10.0365994 Z'
},
'[imdb]': {
filename: 'imdb@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M3.608,6.714 L3.608,13.182 L1.926,13.182 L1.926,6.714 L3.608,6.714 z M9.473,6.714 L9.473,13.182 L8.003,13.182 L8.003,8.815 L7.416,13.182 L6.373,13.182 L5.754,8.915 L5.754,13.182 L4.284,13.182 L4.284,6.714 L6.461,6.714 C6.525,7.103 6.593,7.561 6.665,8.088 L6.896,9.734 L7.28,6.714 L9.473,6.714 z M10.148,6.714 L11.407,6.714 C12.219,6.714 12.768,6.751 13.055,6.826 C13.341,6.9 13.559,7.023 13.708,7.193 C13.857,7.364 13.95,7.553 13.987,7.763 C14.025,7.972 14.043,8.382 14.043,8.995 L14.043,11.26 C14.043,11.841 14.016,12.229 13.962,12.425 C13.907,12.621 13.812,12.774 13.676,12.884 C13.54,12.995 13.372,13.072 13.172,13.116 C12.973,13.16 12.672,13.182 12.27,13.182 L10.148,13.182 L10.148,6.714 z M16.237,6.714 L16.237,8.244 C16.37,8.089 16.518,7.974 16.682,7.898 C16.846,7.822 17.024,7.785 17.215,7.785 C17.437,7.785 17.628,7.819 17.791,7.888 C17.953,7.958 18.077,8.055 18.162,8.18 C18.248,8.305 18.299,8.428 18.316,8.548 C18.333,8.667 18.342,8.923 18.342,9.315 L18.342,11.704 C18.342,12.093 18.316,12.382 18.264,12.573 C18.212,12.763 18.09,12.928 17.899,13.068 C17.707,13.208 17.479,13.278 17.215,13.278 C17.026,13.278 16.85,13.236 16.686,13.154 C16.522,13.071 16.373,12.947 16.237,12.782 L16.133,13.182 L14.623,13.182 L14.623,6.714 L16.237,6.714 z M11.83,7.82 L11.83,12.075 C12.073,12.075 12.222,12.027 12.278,11.929 C12.334,11.832 12.362,11.568 12.362,11.136 L12.362,8.623 C12.362,8.331 12.352,8.143 12.334,8.06 C12.315,7.978 12.272,7.917 12.206,7.878 C12.139,7.84 12.014,7.82 11.83,7.82 z M16.728,9.387 C16.728,9.112 16.711,8.933 16.676,8.849 C16.642,8.765 16.574,8.723 16.472,8.723 C16.374,8.723 16.31,8.76 16.281,8.833 C16.251,8.906 16.237,9.091 16.237,9.387 L16.237,11.672 C16.237,11.957 16.253,12.139 16.287,12.219 C16.32,12.299 16.386,12.339 16.484,12.339 C16.586,12.339 16.652,12.298 16.682,12.215 C16.713,12.132 16.728,11.934 16.728,11.62 L16.728,9.387 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M3.60839844,6.71386719 L3.60839844,13.1818182 L1.92649148,13.1818182 L1.92649148,6.71386719 L3.60839844,6.71386719 Z M9.47310014,6.71386719 L9.47310014,13.1818182 L8.00292969,13.1818182 L8.00292969,8.81525213 L7.41566051,13.1818182 L6.3729581,13.1818182 L5.75372869,8.91512784 L5.75372869,13.1818182 L4.28355824,13.1818182 L4.28355824,6.71386719 L6.46084872,6.71386719 C6.5247695,7.10271856 6.5926843,7.56081057 6.66459517,8.08815696 L6.89630682,9.73410866 L7.27982955,6.71386719 L9.47310014,6.71386719 Z M10.1482599,6.71386719 L11.4066939,6.71386719 C12.2190204,6.71386719 12.7683313,6.75115375 13.0546431,6.82572798 C13.3409549,6.90030222 13.5586818,7.0228152 13.7078303,7.1932706 C13.8569787,7.36372599 13.9501951,7.55348795 13.9874822,7.76256214 C14.0247694,7.97163634 14.0434126,8.38245432 14.0434126,8.99502841 L14.0434126,11.2602095 C14.0434126,11.8408232 14.0161136,12.2290029 13.9615146,12.4247603 C13.9069156,12.6205177 13.8117017,12.7736589 13.67587,12.8841886 C13.5400384,12.9947182 13.3722489,13.0719547 13.1724964,13.1159002 C12.972744,13.1598457 12.6717882,13.1818182 12.26962,13.1818182 L10.1482599,13.1818182 L10.1482599,6.71386719 Z M16.2366832,6.71386719 L16.2366832,8.24396307 C16.3698515,8.08948786 16.5183319,7.97429903 16.6821289,7.89839311 C16.8459259,7.82248719 17.0237029,7.7845348 17.2154652,7.7845348 C17.4365245,7.7845348 17.628284,7.81915803 17.7907493,7.88840554 C17.9532146,7.95765305 18.0770592,8.05486443 18.1622869,8.18004261 C18.2475146,8.3052208 18.2987836,8.42773378 18.3160955,8.54758523 C18.3334074,8.66743668 18.3420632,8.92311594 18.3420632,9.31463068 L18.3420632,11.7036577 C18.3420632,12.092509 18.3160958,12.3821457 18.2641602,12.5725763 C18.2122245,12.763007 18.0903774,12.9281332 17.8986151,13.0679599 C17.7068527,13.2077866 17.4791384,13.2776989 17.2154652,13.2776989 C17.0263662,13.2776989 16.8499209,13.2364173 16.6861239,13.153853 C16.522327,13.0712886 16.3725149,12.947444 16.2366832,12.7823153 L16.1328125,13.1818182 L14.6226918,13.1818182 L14.6226918,6.71386719 L16.2366832,6.71386719 Z M11.8301669,7.82049006 L11.8301669,12.0751953 C12.0725332,12.0751953 12.2216794,12.0265896 12.2776101,11.9293768 C12.3335408,11.8321639 12.3615057,11.5678289 12.3615057,11.1363636 L12.3615057,8.62349077 C12.3615057,8.33052055 12.352184,8.14275609 12.3335405,8.06019176 C12.3148969,7.97762743 12.2722837,7.91703677 12.2056996,7.87841797 C12.1391154,7.83979917 12.0139391,7.82049006 11.8301669,7.82049006 Z M16.7280717,9.38654119 C16.7280717,9.11221454 16.7107601,8.93310589 16.6761364,8.84920987 C16.6415126,8.76531386 16.5735978,8.72336648 16.4723899,8.72336648 C16.3738454,8.72336648 16.3099256,8.7599872 16.2806286,8.83322976 C16.2513315,8.90647231 16.2366832,9.09090761 16.2366832,9.38654119 L16.2366832,11.6716974 C16.2366832,11.9566776 16.253329,12.1391154 16.2866211,12.2190163 C16.3199132,12.2989173 16.3858305,12.3388672 16.484375,12.3388672 C16.5855829,12.3388672 16.6515002,12.2975856 16.6821289,12.2150213 C16.7127576,12.132457 16.7280717,11.9340392 16.7280717,11.6197621 L16.7280717,9.38654119 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M3.60839844,6.71386719 L3.60839844,13.1818182 L1.92649148,13.1818182 L1.92649148,6.71386719 L3.60839844,6.71386719 Z M9.47310014,6.71386719 L9.47310014,13.1818182 L8.00292969,13.1818182 L8.00292969,8.81525213 L7.41566051,13.1818182 L6.3729581,13.1818182 L5.75372869,8.91512784 L5.75372869,13.1818182 L4.28355824,13.1818182 L4.28355824,6.71386719 L6.46084872,6.71386719 C6.5247695,7.10271856 6.5926843,7.56081057 6.66459517,8.08815696 L6.89630682,9.73410866 L7.27982955,6.71386719 L9.47310014,6.71386719 Z M10.1482599,6.71386719 L11.4066939,6.71386719 C12.2190204,6.71386719 12.7683313,6.75115375 13.0546431,6.82572798 C13.3409549,6.90030222 13.5586818,7.0228152 13.7078303,7.1932706 C13.8569787,7.36372599 13.9501951,7.55348795 13.9874822,7.76256214 C14.0247694,7.97163634 14.0434126,8.38245432 14.0434126,8.99502841 L14.0434126,11.2602095 C14.0434126,11.8408232 14.0161136,12.2290029 13.9615146,12.4247603 C13.9069156,12.6205177 13.8117017,12.7736589 13.67587,12.8841886 C13.5400384,12.9947182 13.3722489,13.0719547 13.1724964,13.1159002 C12.972744,13.1598457 12.6717882,13.1818182 12.26962,13.1818182 L10.1482599,13.1818182 L10.1482599,6.71386719 Z M16.2366832,6.71386719 L16.2366832,8.24396307 C16.3698515,8.08948786 16.5183319,7.97429903 16.6821289,7.89839311 C16.8459259,7.82248719 17.0237029,7.7845348 17.2154652,7.7845348 C17.4365245,7.7845348 17.628284,7.81915803 17.7907493,7.88840554 C17.9532146,7.95765305 18.0770592,8.05486443 18.1622869,8.18004261 C18.2475146,8.3052208 18.2987836,8.42773378 18.3160955,8.54758523 C18.3334074,8.66743668 18.3420632,8.92311594 18.3420632,9.31463068 L18.3420632,11.7036577 C18.3420632,12.092509 18.3160958,12.3821457 18.2641602,12.5725763 C18.2122245,12.763007 18.0903774,12.9281332 17.8986151,13.0679599 C17.7068527,13.2077866 17.4791384,13.2776989 17.2154652,13.2776989 C17.0263662,13.2776989 16.8499209,13.2364173 16.6861239,13.153853 C16.522327,13.0712886 16.3725149,12.947444 16.2366832,12.7823153 L16.1328125,13.1818182 L14.6226918,13.1818182 L14.6226918,6.71386719 L16.2366832,6.71386719 Z M11.8301669,7.82049006 L11.8301669,12.0751953 C12.0725332,12.0751953 12.2216794,12.0265896 12.2776101,11.9293768 C12.3335408,11.8321639 12.3615057,11.5678289 12.3615057,11.1363636 L12.3615057,8.62349077 C12.3615057,8.33052055 12.352184,8.14275609 12.3335405,8.06019176 C12.3148969,7.97762743 12.2722837,7.91703677 12.2056996,7.87841797 C12.1391154,7.83979917 12.0139391,7.82049006 11.8301669,7.82049006 Z M16.7280717,9.38654119 C16.7280717,9.11221454 16.7107601,8.93310589 16.6761364,8.84920987 C16.6415126,8.76531386 16.5735978,8.72336648 16.4723899,8.72336648 C16.3738454,8.72336648 16.3099256,8.7599872 16.2806286,8.83322976 C16.2513315,8.90647231 16.2366832,9.09090761 16.2366832,9.38654119 L16.2366832,11.6716974 C16.2366832,11.9566776 16.253329,12.1391154 16.2866211,12.2190163 C16.3199132,12.2989173 16.3858305,12.3388672 16.484375,12.3388672 C16.5855829,12.3388672 16.6515002,12.2975856 16.6821289,12.2150213 C16.7127576,12.132457 16.7280717,11.9340392 16.7280717,11.6197621 L16.7280717,9.38654119 Z'
},
'[instagram]': {
filename: 'instagram_new@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10,0.753 C7.489,0.753 7.174,0.764 6.187,0.808 C5.203,0.854 4.532,1.01 3.943,1.239 C3.335,1.474 2.819,1.791 2.305,2.305 C1.791,2.819 1.474,3.335 1.239,3.943 C1.01,4.532 0.854,5.203 0.808,6.187 C0.764,7.174 0.753,7.489 0.753,10 C0.753,12.511 0.764,12.826 0.808,13.813 C0.854,14.797 1.01,15.468 1.239,16.057 C1.474,16.665 1.791,17.181 2.305,17.695 C2.819,18.209 3.335,18.526 3.943,18.761 C4.532,18.99 5.203,19.146 6.187,19.192 C7.174,19.236 7.489,19.247 10,19.247 C12.511,19.247 12.826,19.236 13.813,19.192 C14.797,19.146 15.468,18.99 16.057,18.761 C16.665,18.526 17.181,18.209 17.695,17.695 C18.209,17.181 18.526,16.665 18.761,16.057 C18.99,15.468 19.146,14.797 19.192,13.813 C19.236,12.826 19.247,12.511 19.247,10 C19.247,7.489 19.236,7.174 19.192,6.187 C19.146,5.203 18.99,4.532 18.761,3.943 C18.526,3.335 18.209,2.819 17.695,2.305 C17.181,1.791 16.665,1.474 16.057,1.239 C15.468,1.01 14.797,0.854 13.813,0.808 C12.826,0.764 12.511,0.753 10,0.753 z M10,2.419 C12.469,2.419 12.761,2.429 13.737,2.473 C14.638,2.514 15.128,2.665 15.454,2.792 C15.885,2.959 16.194,3.16 16.516,3.484 C16.84,3.806 17.041,4.115 17.208,4.546 C17.335,4.872 17.486,5.362 17.527,6.263 C17.571,7.239 17.581,7.531 17.58,10 C17.581,12.469 17.571,12.761 17.527,13.737 C17.486,14.638 17.335,15.128 17.208,15.454 C17.041,15.885 16.84,16.194 16.516,16.516 C16.194,16.84 15.885,17.041 15.454,17.208 C15.128,17.335 14.638,17.486 13.737,17.527 C12.762,17.571 12.469,17.581 10,17.58 C7.531,17.581 7.238,17.571 6.263,17.527 C5.362,17.486 4.872,17.335 4.546,17.208 C4.115,17.041 3.806,16.84 3.484,16.516 C3.16,16.194 2.959,15.885 2.792,15.454 C2.665,15.128 2.514,14.638 2.473,13.737 C2.429,12.761 2.419,12.469 2.419,10 C2.419,7.531 2.429,7.239 2.473,6.263 C2.514,5.362 2.665,4.872 2.792,4.546 C2.959,4.115 3.16,3.806 3.484,3.484 C3.806,3.16 4.115,2.959 4.546,2.792 C4.872,2.665 5.362,2.514 6.263,2.473 C7.239,2.429 7.531,2.419 10,2.419 z M10,5.251 C7.378,5.251 5.251,7.378 5.251,10 C5.251,12.622 7.378,14.749 10,14.749 C12.622,14.749 14.749,12.622 14.749,10 C14.749,7.378 12.622,5.251 10,5.251 z M10,6.918 C11.702,6.918 13.082,8.298 13.082,10 C13.082,11.702 11.702,13.082 10,13.082 C8.298,13.082 6.918,11.702 6.918,10 C6.918,8.298 8.298,6.918 10,6.918 z M14.936,3.954 C14.323,3.954 13.827,4.451 13.827,5.064 C13.827,5.677 14.323,6.173 14.936,6.173 C15.549,6.173 16.046,5.677 16.046,5.064 C16.046,4.451 15.549,3.954 14.936,3.954 z',
svgRectPath: 'M18.009,-0 C19.102,-0 20,0.891 20,1.991 L20,18.009 C20,19.102 19.109,20 18.009,20 L1.991,20 C0.898,20 -0,19.109 -0,18.009 L-0,1.991 C-0,0.898 0.891,-0 1.991,-0 L18.009,-0 z M10,0.753 C7.489,0.753 7.174,0.764 6.187,0.808 C5.203,0.854 4.532,1.01 3.943,1.239 C3.335,1.474 2.819,1.791 2.305,2.305 C1.791,2.819 1.474,3.335 1.239,3.943 C1.01,4.532 0.854,5.203 0.808,6.187 C0.764,7.174 0.753,7.489 0.753,10 C0.753,12.511 0.764,12.826 0.808,13.813 C0.854,14.797 1.01,15.468 1.239,16.057 C1.474,16.665 1.791,17.181 2.305,17.695 C2.819,18.209 3.335,18.526 3.943,18.761 C4.532,18.99 5.203,19.146 6.187,19.192 C7.174,19.236 7.489,19.247 10,19.247 C12.511,19.247 12.826,19.236 13.813,19.192 C14.797,19.146 15.468,18.99 16.057,18.761 C16.665,18.526 17.181,18.209 17.695,17.695 C18.209,17.181 18.526,16.665 18.761,16.057 C18.99,15.468 19.146,14.797 19.192,13.813 C19.236,12.826 19.247,12.511 19.247,10 C19.247,7.489 19.236,7.174 19.192,6.187 C19.146,5.203 18.99,4.532 18.761,3.943 C18.526,3.335 18.209,2.819 17.695,2.305 C17.181,1.791 16.665,1.474 16.057,1.239 C15.468,1.01 14.797,0.854 13.813,0.808 C12.826,0.764 12.511,0.753 10,0.753 z M10,2.419 C12.469,2.419 12.761,2.429 13.737,2.473 C14.638,2.514 15.128,2.665 15.454,2.792 C15.885,2.959 16.194,3.16 16.516,3.484 C16.84,3.806 17.041,4.115 17.208,4.546 C17.335,4.872 17.486,5.362 17.527,6.263 C17.571,7.239 17.581,7.531 17.58,10 C17.581,12.469 17.571,12.761 17.527,13.737 C17.486,14.638 17.335,15.128 17.208,15.454 C17.041,15.885 16.84,16.194 16.516,16.516 C16.194,16.84 15.885,17.041 15.454,17.208 C15.128,17.335 14.638,17.486 13.737,17.527 C12.762,17.571 12.469,17.581 10,17.58 C7.531,17.581 7.238,17.571 6.263,17.527 C5.362,17.486 4.872,17.335 4.546,17.208 C4.115,17.041 3.806,16.84 3.484,16.516 C3.16,16.194 2.959,15.885 2.792,15.454 C2.665,15.128 2.514,14.638 2.473,13.737 C2.429,12.761 2.419,12.469 2.419,10 C2.419,7.531 2.429,7.239 2.473,6.263 C2.514,5.362 2.665,4.872 2.792,4.546 C2.959,4.115 3.16,3.806 3.484,3.484 C3.806,3.16 4.115,2.959 4.546,2.792 C4.872,2.665 5.362,2.514 6.263,2.473 C7.239,2.429 7.531,2.419 10,2.419 z M10,5.251 C7.378,5.251 5.251,7.378 5.251,10 C5.251,12.622 7.378,14.749 10,14.749 C12.622,14.749 14.749,12.622 14.749,10 C14.749,7.378 12.622,5.251 10,5.251 z M10,6.918 C11.702,6.918 13.082,8.298 13.082,10 C13.082,11.702 11.702,13.082 10,13.082 C8.298,13.082 6.918,11.702 6.918,10 C6.918,8.298 8.298,6.918 10,6.918 z M14.936,3.954 C14.323,3.954 13.827,4.451 13.827,5.064 C13.827,5.677 14.323,6.173 14.936,6.173 C15.549,6.173 16.046,5.677 16.046,5.064 C16.046,4.451 15.549,3.954 14.936,3.954 z',
svgCircPath: 'M10,-0 C15.523,-0 20,4.477 20,10 C20,15.523 15.523,20 10,20 C4.477,20 -0,15.523 -0,10 C-0,4.477 4.477,-0 10,-0 z M10,2.332 C7.918,2.332 7.657,2.341 6.838,2.378 C6.022,2.415 5.465,2.545 4.978,2.735 C4.473,2.931 4.045,3.193 3.619,3.619 C3.193,4.045 2.931,4.473 2.735,4.978 C2.545,5.465 2.415,6.022 2.378,6.838 C2.341,7.657 2.332,7.918 2.332,10 C2.332,12.082 2.341,12.343 2.378,13.162 C2.415,13.978 2.545,14.535 2.735,15.022 C2.931,15.527 3.193,15.955 3.619,16.381 C4.045,16.807 4.473,17.069 4.978,17.265 C5.465,17.455 6.022,17.585 6.838,17.622 C7.657,17.659 7.918,17.668 10,17.668 C12.082,17.668 12.343,17.659 13.162,17.622 C13.978,17.585 14.535,17.455 15.022,17.265 C15.527,17.069 15.955,16.807 16.381,16.381 C16.807,15.955 17.069,15.527 17.265,15.022 C17.455,14.535 17.585,13.978 17.622,13.162 C17.659,12.343 17.668,12.082 17.668,10 C17.668,7.918 17.659,7.657 17.622,6.838 C17.585,6.022 17.455,5.465 17.265,4.978 C17.069,4.473 16.807,4.045 16.381,3.619 C15.955,3.193 15.527,2.931 15.022,2.735 C14.535,2.545 13.978,2.415 13.162,2.378 C12.343,2.341 12.082,2.332 10,2.332 z M10,3.714 C12.048,3.714 12.289,3.722 13.099,3.758 C13.846,3.792 14.252,3.917 14.522,4.022 C14.88,4.162 15.136,4.328 15.404,4.596 C15.672,4.864 15.838,5.12 15.978,5.478 C16.083,5.748 16.208,6.154 16.242,6.901 C16.278,7.711 16.286,7.952 16.286,10 C16.286,12.048 16.278,12.29 16.242,13.099 C16.208,13.846 16.083,14.252 15.978,14.522 C15.838,14.88 15.672,15.136 15.404,15.404 C15.136,15.672 14.88,15.838 14.522,15.978 C14.252,16.083 13.846,16.208 13.099,16.242 C12.29,16.279 12.048,16.286 10,16.286 C7.952,16.286 7.71,16.279 6.901,16.242 C6.154,16.208 5.748,16.083 5.478,15.978 C5.12,15.838 4.864,15.672 4.596,15.404 C4.328,15.136 4.162,14.88 4.022,14.522 C3.917,14.252 3.792,13.846 3.758,13.099 C3.722,12.29 3.714,12.048 3.714,10 C3.714,7.952 3.722,7.711 3.758,6.901 C3.792,6.154 3.917,5.748 4.022,5.478 C4.162,5.12 4.328,4.864 4.596,4.596 C4.864,4.328 5.12,4.162 5.478,4.022 C5.748,3.917 6.154,3.792 6.901,3.758 C7.711,3.722 7.952,3.714 10,3.714 z M10,6.062 C7.826,6.063 6.063,7.826 6.063,10 C6.063,12.174 7.826,13.937 10,13.937 C12.174,13.937 13.937,12.174 13.937,10 C13.937,7.826 12.174,6.063 10,6.063 z M10,7.444 C11.412,7.444 12.556,8.588 12.556,10 C12.556,11.412 11.412,12.556 10,12.556 C8.588,12.556 7.444,11.412 7.444,10 C7.444,8.588 8.588,7.444 10,7.444 z M14.093,4.987 L13.735,5.059 C13.159,5.635 13.29,5.323 13.173,5.907 C13.173,6.415 13.585,6.827 14.093,6.827 C14.602,6.827 15.013,6.415 15.013,5.907 C15.013,5.399 14.602,4.987 14.093,4.987 z'
},
'[like]': {
filename: 'like@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M7.056,15.883 L8.219,15.88 C8.643,16.006 8.586,16.047 8.821,16.191 C8.894,16.236 9.107,16.468 9.407,16.468 L9.407,16.468 L15.952,16.468 L16.047,16.461 C16.354,16.441 17.073,16.393 17.23,15.563 C17.296,15.209 17.217,14.912 17.091,14.719 C17.359,14.574 17.621,14.276 17.693,13.848 C17.768,13.404 17.653,13.076 17.484,12.849 C17.791,12.686 18.055,12.368 18.123,11.835 C18.193,11.286 17.997,10.996 17.747,10.773 C18.01,10.571 18.237,10.225 18.237,9.668 C18.236,8.447 17.042,8.249 16.409,8.244 L14.221,8.236 C14.206,8.235 13.857,8.226 13.829,7.999 C13.771,7.521 13.904,7.21 14.186,6.897 C14.51,6.536 14.861,5.541 14.974,4.77 C15.084,4.02 14.793,2.891 14.241,2.503 C14.096,2.402 13.944,2.351 13.789,2.351 C13.356,2.351 13.019,2.748 12.943,3.133 C12.923,3.23 12.907,3.327 12.891,3.421 C12.802,3.953 12.71,4.503 12.033,5.367 C11.611,5.906 11.654,5.941 11.442,6.095 C11.236,6.245 11.023,6.4 10.682,6.823 C10.434,7.131 10.198,7.506 9.948,7.902 C9.639,8.391 9.32,8.944 8.959,9.351 C8.755,9.582 8.64,9.68 8.603,9.7 L7.05,9.7 C7.054,9.731 7.056,9.763 7.056,9.795 L7.056,15.883 L7.056,15.883 z M7.056,15.883 L7.031,15.883 C6.884,15.883 6.764,15.764 6.764,15.618 L6.764,9.965 C6.764,9.819 6.884,9.7 7.031,9.7 L7.05,9.7 C7.004,9.369 6.719,9.114 6.376,9.114 L2.149,9.114 C1.775,9.114 1.47,9.419 1.47,9.795 L2.441,16.084 C2.441,16.459 2.747,16.765 3.121,16.765 L6.376,16.765 C6.751,16.765 7.056,16.459 7.056,16.084 L7.056,15.883 L7.056,15.883 z M5.292,14.119 C5.617,14.119 5.881,14.383 5.881,14.707 C5.881,15.032 5.617,15.295 5.292,15.295 C4.967,15.295 4.703,15.031 4.703,14.707 C4.703,14.382 4.967,14.119 5.292,14.119 L5.292,14.119 z',
svgRectPath: 'M7.05647059,15.8828793 L8.21911765,15.88 C8.64323529,16.0064706 8.58617647,16.0467647 8.82058824,16.1908824 C8.89382353,16.2361765 9.10705882,16.4676471 9.40735294,16.4676471 L9.40735294,16.4676471 L15.9523529,16.4676471 L16.0473529,16.4614706 C16.3541176,16.4405882 17.0729412,16.3926471 17.2297059,15.5626471 C17.2961765,15.2088235 17.2173529,14.9123529 17.0905882,14.7188235 C17.3594118,14.5741176 17.6208824,14.2758824 17.6929412,13.8479412 C17.7679412,13.4035294 17.6532353,13.0755882 17.4835294,12.8488235 C17.7908824,12.6858824 18.055,12.3676471 18.1226471,11.8347059 C18.1926471,11.2855882 17.9973529,10.9961765 17.7467647,10.7732353 C18.0102941,10.5714706 18.2367647,10.2252941 18.2367647,9.66823529 C18.2364706,8.44676471 17.0417647,8.24911765 16.4094118,8.24382353 L14.2214706,8.23558824 C14.2064706,8.235 13.8567647,8.22588235 13.8291176,7.99852941 C13.7708824,7.52088235 13.9038235,7.21029412 14.1855882,6.89676471 C14.51,6.53647059 14.8614706,5.54058824 14.9741176,4.77029412 C15.0835294,4.02029412 14.7932353,2.89117647 14.2405882,2.50323529 C14.0964706,2.40205882 13.9444118,2.35058824 13.7885294,2.35088235 C13.3558824,2.35058824 13.0188235,2.74823529 12.9426471,3.13264706 C12.9232353,3.22970588 12.9070588,3.32705882 12.8911765,3.42117647 C12.8017647,3.95294118 12.7097059,4.50264706 12.0332353,5.36676471 C11.6111765,5.90617647 11.6544118,5.94117647 11.4423529,6.09470588 C11.2361765,6.245 11.0226471,6.4 10.6823529,6.82323529 C10.4335294,7.13147059 10.1979412,7.50588235 9.94823529,7.90176471 C9.63941176,8.39147059 9.32029412,8.94441176 8.95941176,9.35088235 C8.755,9.58176471 8.63970588,9.68 8.60264706,9.7 L7.04985884,9.7 C7.05421692,9.73114361 7.05647059,9.76295808 7.05647059,9.79529412 L7.05647059,15.8828793 L7.05647059,15.8828793 Z M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M7.05647059,15.8828793 L7.03147059,15.8829412 C6.88352941,15.8829412 6.76352941,15.7641176 6.76352941,15.6176471 L6.76352941,9.96529412 C6.76352941,9.81852941 6.88352941,9.7 7.03147059,9.7 L7.04985884,9.7 C7.00351789,9.36883908 6.71923567,9.11352941 6.37647059,9.11352941 L2.14941176,9.11352941 C1.77470588,9.11352941 1.46970588,9.41911765 1.46970588,9.79529412 L2.44147059,16.0835294 C2.44147059,16.4591176 2.74676471,16.765 3.12147059,16.765 L6.37647059,16.765 C6.75117647,16.765 7.05617647,16.4591176 7.05647059,16.0835294 L7.05647059,15.8828793 L7.05647059,15.8828793 Z M5.29205882,14.1194118 C5.61705882,14.1194118 5.88058824,14.3826471 5.88058824,14.7073529 C5.88058824,15.0317647 5.61705882,15.2947059 5.29205882,15.2947059 C4.96705882,15.2947059 4.70323529,15.0314706 4.70323529,14.7073529 C4.70323529,14.3823529 4.96676471,14.1194118 5.29205882,14.1194118 L5.29205882,14.1194118 Z',
svgCircPath: 'M7.34394464,14.957354 L8.36980969,14.9546667 C8.74403114,15.0727059 8.69368512,15.1103137 8.90051903,15.2448235 C8.96513841,15.287098 9.1532872,15.5031373 9.4182526,15.5031373 L9.4182526,15.5031373 L15.1932526,15.5031373 L15.2770761,15.4973725 C15.5477509,15.4778824 16.1820069,15.4331373 16.3203287,14.6584706 C16.3789792,14.3282353 16.3094291,14.0515294 16.1975779,13.870902 C16.4347751,13.7358431 16.6654844,13.4574902 16.7290657,13.0580784 C16.7952422,12.6432941 16.6940311,12.3372157 16.5442907,12.1255686 C16.8154844,11.9734902 17.0485294,11.6764706 17.108218,11.1790588 C17.1699827,10.666549 16.9976644,10.3964314 16.7765571,10.1883529 C17.009083,10.0000392 17.20891,9.67694118 17.20891,9.15701961 C17.2086505,8.01698039 16.1544983,7.8325098 15.5965398,7.82756863 L13.6660035,7.81988235 C13.6527682,7.81933333 13.3442042,7.81082353 13.3198097,7.59862745 C13.2684256,7.15282353 13.3857266,6.86294118 13.6343426,6.57031373 C13.9205882,6.23403922 14.2307093,5.30454902 14.3301038,4.58560784 C14.4266436,3.88560784 14.1705017,2.83176471 13.682872,2.46968627 C13.5557093,2.3752549 13.4215398,2.32721569 13.2839965,2.3274902 C12.9022491,2.32721569 12.6048443,2.69835294 12.5376298,3.05713725 C12.5205017,3.14772549 12.5062284,3.23858824 12.4922145,3.32643137 C12.4133218,3.8227451 12.3320934,4.33580392 11.7352076,5.14231373 C11.3628028,5.64576471 11.4009516,5.67843137 11.2138408,5.82172549 C11.0319204,5.962 10.8435121,6.10666667 10.5432526,6.50168627 C10.3237024,6.78937255 10.1158304,7.13882353 9.89550173,7.50831373 C9.62301038,7.96537255 9.34143599,8.48145098 9.02301038,8.86082353 C8.84264706,9.07631373 8.74091696,9.168 8.70821799,9.18666667 L7.33811074,9.18666667 C7.3419561,9.21573404 7.34394464,9.24542754 7.34394464,9.27560784 L7.34394464,14.957354 L7.34394464,14.957354 Z M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M7.34394464,14.957354 L7.32188581,14.9574118 C7.19134948,14.9574118 7.08546713,14.8465098 7.08546713,14.7098039 L7.08546713,9.43427451 C7.08546713,9.29729412 7.19134948,9.18666667 7.32188581,9.18666667 L7.33811074,9.18666667 C7.29722167,8.87758314 7.04638442,8.63929412 6.74394464,8.63929412 L3.01418685,8.63929412 C2.68356401,8.63929412 2.41444637,8.9245098 2.41444637,9.27560784 L3.27188581,15.1446275 C3.27188581,15.4951765 3.54126298,15.7806667 3.87188581,15.7806667 L6.74394464,15.7806667 C7.07456747,15.7806667 7.34368512,15.4951765 7.34394464,15.1446275 L7.34394464,14.957354 L7.34394464,14.957354 Z M5.78711073,13.311451 C6.07387543,13.311451 6.30640138,13.5571373 6.30640138,13.8601961 C6.30640138,14.1629804 6.07387543,14.4083922 5.78711073,14.4083922 C5.50034602,14.4083922 5.26756055,14.1627059 5.26756055,13.8601961 C5.26756055,13.5568627 5.50008651,13.311451 5.78711073,13.311451 L5.78711073,13.311451 Z'
},
'[linkedin]': {
filename: 'linkedin@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M2.48,5.24 L2.48,16.938 L5.822,16.938 L5.822,5.24 L2.48,5.24 z M13.759,5.24 C11.427,5.24 11.026,6.091 10.836,6.911 L10.836,5.24 L7.493,5.24 L7.493,16.938 L10.836,16.938 L10.836,10.253 C10.836,9.17 11.423,8.582 12.507,8.582 C13.564,8.582 14.178,9.157 14.178,10.253 L14.178,16.938 L17.52,16.938 L17.52,11.089 C17.52,7.747 17.084,5.24 13.759,5.24 z M4.151,4.405 C5.074,4.405 5.822,3.656 5.822,2.734 C5.822,1.811 5.074,1.063 4.151,1.063 C3.228,1.063 2.48,1.811 2.48,2.734 C2.48,3.656 3.228,4.405 4.151,4.405 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M4.375,6.875 L4.375,15.625 L6.875,15.625 L6.875,6.875 L4.375,6.875 Z M12.811875,6.875 C11.0675,6.875 10.7675,7.51125 10.625,8.125 L10.625,6.875 L8.125,6.875 L8.125,15.625 L10.625,15.625 L10.625,10.625 C10.625,9.814375 11.064375,9.375 11.875,9.375 C12.66625,9.375 13.125,9.805 13.125,10.625 L13.125,15.625 L15.625,15.625 L15.625,11.25 C15.625,8.75 15.299375,6.875 12.811875,6.875 Z M5.625,6.25 C6.31535594,6.25 6.875,5.69035594 6.875,5 C6.875,4.30964406 6.31535594,3.75 5.625,3.75 C4.93464406,3.75 4.375,4.30964406 4.375,5 C4.375,5.69035594 4.93464406,6.25 5.625,6.25 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M4.375,6.875 L4.375,15.625 L6.875,15.625 L6.875,6.875 L4.375,6.875 Z M12.811875,6.875 C11.0675,6.875 10.7675,7.51125 10.625,8.125 L10.625,6.875 L8.125,6.875 L8.125,15.625 L10.625,15.625 L10.625,10.625 C10.625,9.814375 11.064375,9.375 11.875,9.375 C12.66625,9.375 13.125,9.805 13.125,10.625 L13.125,15.625 L15.625,15.625 L15.625,11.25 C15.625,8.75 15.299375,6.875 12.811875,6.875 Z M5.625,6.25 C6.31535594,6.25 6.875,5.69035594 6.875,5 C6.875,4.30964406 6.31535594,3.75 5.625,3.75 C4.93464406,3.75 4.375,4.30964406 4.375,5 C4.375,5.69035594 4.93464406,6.25 5.625,6.25 Z'
},
'[mail]': emailIcon,
'[mailto]': emailIcon,
'[one]': plus1Icon,
'[pinterest]': {
filename: 'pinterest@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10.116,2.053 C5.583,2.053 1.908,5.727 1.908,10.261 C1.908,13.622 3.929,16.509 6.821,17.779 C6.798,17.205 6.817,16.518 6.964,15.894 C7.121,15.227 8.02,11.421 8.02,11.421 C8.02,11.421 7.757,10.897 7.757,10.123 C7.757,8.907 8.462,7.998 9.34,7.998 C10.087,7.998 10.448,8.559 10.448,9.23 C10.448,9.981 9.969,11.103 9.723,12.143 C9.517,13.014 10.159,13.724 11.018,13.724 C12.573,13.724 13.621,11.727 13.621,9.36 C13.621,7.561 12.409,6.214 10.206,6.214 C7.716,6.214 6.165,8.071 6.165,10.145 C6.165,10.86 6.376,11.364 6.706,11.755 C6.858,11.934 6.879,12.006 6.824,12.212 C6.785,12.363 6.694,12.727 6.657,12.871 C6.602,13.079 6.434,13.154 6.246,13.077 C5.099,12.609 4.565,11.353 4.565,9.941 C4.565,7.609 6.531,4.813 10.431,4.813 C13.565,4.813 15.627,7.081 15.627,9.516 C15.627,12.735 13.838,15.141 11.199,15.141 C10.313,15.141 9.479,14.661 9.194,14.118 C9.194,14.118 8.717,16.009 8.616,16.374 C8.442,17.007 8.101,17.64 7.79,18.132 C8.528,18.35 9.308,18.469 10.116,18.469 C14.649,18.469 18.324,14.795 18.324,10.261 C18.324,5.727 14.648,2.053 10.116,2.053 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M10.116,2.05266667 C5.583,2.05266667 1.90766667,5.727 1.90766667,10.261 C1.90766667,13.6216667 3.92866667,16.509 6.82066667,17.7786667 C6.79766667,17.205 6.81666667,16.5176667 6.96366667,15.894 C7.12133333,15.2273333 8.01966667,11.4213333 8.01966667,11.4213333 C8.01966667,11.4213333 7.75733333,10.8973333 7.75733333,10.1226667 C7.75733333,8.90666667 8.46233333,7.99833333 9.34033333,7.99833333 C10.087,7.99833333 10.4476667,8.559 10.4476667,9.23 C10.4476667,9.98066667 9.96866667,11.103 9.72266667,12.1426667 C9.51733333,13.0136667 10.1593333,13.724 11.0183333,13.724 C12.5733333,13.724 13.621,11.7266667 13.621,9.36 C13.621,7.561 12.4093333,6.21433333 10.2056667,6.21433333 C7.71566667,6.21433333 6.16466667,8.071 6.16466667,10.145 C6.16466667,10.8603333 6.37566667,11.3643333 6.706,11.755 C6.85766667,11.934 6.879,12.0063333 6.824,12.212 C6.78466667,12.363 6.69433333,12.727 6.657,12.871 C6.60233333,13.0793333 6.434,13.1536667 6.246,13.0766667 C5.09933333,12.6086667 4.565,11.3526667 4.565,9.94066667 C4.565,7.60933333 6.53133333,4.81333333 10.4313333,4.81333333 C13.5646667,4.81333333 15.6273333,7.08133333 15.6273333,9.51566667 C15.6273333,12.735 13.8376667,15.1406667 11.199,15.1406667 C10.3126667,15.1406667 9.479,14.6613333 9.19366667,14.118 C9.19366667,14.118 8.717,16.0093333 8.61633333,16.374 C8.44233333,17.0073333 8.10133333,17.6396667 7.79,18.1323333 C8.52833333,18.3503333 9.308,18.469 10.1163333,18.469 C14.649,18.469 18.324,14.7946667 18.324,10.2613333 C18.3236667,5.727 14.6483333,2.05266667 10.116,2.05266667 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M10.116,2.05266667 C5.583,2.05266667 1.90766667,5.727 1.90766667,10.261 C1.90766667,13.6216667 3.92866667,16.509 6.82066667,17.7786667 C6.79766667,17.205 6.81666667,16.5176667 6.96366667,15.894 C7.12133333,15.2273333 8.01966667,11.4213333 8.01966667,11.4213333 C8.01966667,11.4213333 7.75733333,10.8973333 7.75733333,10.1226667 C7.75733333,8.90666667 8.46233333,7.99833333 9.34033333,7.99833333 C10.087,7.99833333 10.4476667,8.559 10.4476667,9.23 C10.4476667,9.98066667 9.96866667,11.103 9.72266667,12.1426667 C9.51733333,13.0136667 10.1593333,13.724 11.0183333,13.724 C12.5733333,13.724 13.621,11.7266667 13.621,9.36 C13.621,7.561 12.4093333,6.21433333 10.2056667,6.21433333 C7.71566667,6.21433333 6.16466667,8.071 6.16466667,10.145 C6.16466667,10.8603333 6.37566667,11.3643333 6.706,11.755 C6.85766667,11.934 6.879,12.0063333 6.824,12.212 C6.78466667,12.363 6.69433333,12.727 6.657,12.871 C6.60233333,13.0793333 6.434,13.1536667 6.246,13.0766667 C5.09933333,12.6086667 4.565,11.3526667 4.565,9.94066667 C4.565,7.60933333 6.53133333,4.81333333 10.4313333,4.81333333 C13.5646667,4.81333333 15.6273333,7.08133333 15.6273333,9.51566667 C15.6273333,12.735 13.8376667,15.1406667 11.199,15.1406667 C10.3126667,15.1406667 9.479,14.6613333 9.19366667,14.118 C9.19366667,14.118 8.717,16.0093333 8.61633333,16.374 C8.44233333,17.0073333 8.10133333,17.6396667 7.79,18.1323333 C8.52833333,18.3503333 9.308,18.469 10.1163333,18.469 C14.649,18.469 18.324,14.7946667 18.324,10.2613333 C18.3236667,5.727 14.6483333,2.05266667 10.116,2.05266667 Z'
},
'[plus one]': plus1Icon,
'[reddit]': {
filename: 'reddit@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M18.702,9.806 C18.702,8.733 17.841,7.86 16.783,7.86 C16.279,7.86 15.826,8.054 15.481,8.376 C14.194,7.469 12.442,6.884 10.492,6.798 L11.395,3.787 L14.093,4.326 C14.101,5.283 14.872,6.058 15.818,6.058 C16.771,6.058 17.543,5.275 17.543,4.31 C17.543,3.345 16.771,2.558 15.818,2.558 C15.097,2.558 14.481,3.008 14.221,3.643 L10.919,2.984 L9.779,6.791 L9.504,6.798 C7.554,6.884 5.802,7.473 4.516,8.376 C4.174,8.054 3.717,7.86 3.213,7.86 C2.155,7.86 1.295,8.733 1.295,9.806 C1.295,10.566 1.721,11.221 2.345,11.543 C2.314,11.733 2.298,11.922 2.298,12.116 C2.306,15.054 5.752,17.442 10,17.442 C14.248,17.442 17.694,15.054 17.694,12.112 C17.694,11.919 17.678,11.729 17.651,11.539 C18.275,11.217 18.702,10.562 18.702,9.806 z M1.984,9.806 C1.984,9.116 2.539,8.558 3.217,8.558 C3.496,8.558 3.756,8.655 3.961,8.814 C3.291,9.403 2.795,10.093 2.527,10.845 C2.202,10.616 1.984,10.236 1.984,9.806 z M15.054,15.306 C13.713,16.233 11.919,16.744 10,16.744 C8.081,16.744 6.287,16.233 4.946,15.306 C3.686,14.434 2.992,13.298 2.992,12.112 C2.992,11.988 3,11.86 3.016,11.736 C3.043,11.504 3.101,11.275 3.182,11.05 C3.399,10.446 3.802,9.876 4.372,9.368 C4.543,9.217 4.729,9.07 4.93,8.93 C4.934,8.926 4.942,8.922 4.946,8.919 C6.287,7.992 8.081,7.481 10,7.481 C11.919,7.481 13.713,7.992 15.054,8.919 C15.058,8.922 15.066,8.926 15.07,8.93 C15.271,9.07 15.457,9.217 15.628,9.368 C16.198,9.876 16.601,10.446 16.818,11.05 C16.899,11.275 16.953,11.504 16.984,11.736 C17,11.86 17.008,11.984 17.008,12.112 C17.008,13.298 16.314,14.434 15.054,15.306 z M15.818,3.252 C16.391,3.252 16.857,3.725 16.857,4.306 C16.857,4.888 16.391,5.36 15.818,5.36 C15.244,5.36 14.779,4.888 14.779,4.306 C14.779,3.725 15.244,3.252 15.818,3.252 z M17.473,10.841 C17.205,10.089 16.709,9.399 16.039,8.81 C16.244,8.651 16.504,8.554 16.783,8.554 C17.461,8.554 18.016,9.116 18.016,9.802 C18.016,10.236 17.798,10.616 17.473,10.841 z M12.589,12.504 C13.27,12.504 13.822,11.952 13.822,11.271 C13.822,10.591 13.27,10.039 12.589,10.039 C11.908,10.039 11.357,10.591 11.357,11.271 C11.357,11.952 11.908,12.504 12.589,12.504 z M7.473,12.504 C8.154,12.504 8.705,11.952 8.705,11.271 C8.705,10.591 8.154,10.039 7.473,10.039 C6.792,10.039 6.24,10.591 6.24,11.271 C6.24,11.952 6.792,12.504 7.473,12.504 z M12.5,13.95 C12.492,13.957 11.562,14.888 10,14.895 C8.415,14.888 7.504,13.957 7.496,13.95 L7.008,14.43 C7.054,14.477 8.155,15.574 10,15.581 C11.845,15.574 12.942,14.477 12.988,14.43 L12.5,13.95 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M18.7015504,9.80620155 C18.7015504,8.73255814 17.8410853,7.86046512 16.7829457,7.86046512 C16.2790698,7.86046512 15.8255814,8.05426357 15.4806202,8.37596899 C14.1937984,7.46899225 12.4418605,6.88372093 10.4922481,6.79844961 L11.3953488,3.78682171 L14.0930233,4.3255814 C14.1007752,5.28294574 14.872093,6.05813953 15.8178295,6.05813953 C16.7713178,6.05813953 17.5426357,5.2751938 17.5426357,4.31007752 C17.5426357,3.34496124 16.7713178,2.55813953 15.8178295,2.55813953 C15.0968992,2.55813953 14.4806202,3.00775194 14.2209302,3.64341085 L10.9186047,2.98449612 L9.77906977,6.79069767 L9.50387597,6.79844961 C7.55426357,6.88372093 5.80232558,7.47286822 4.51550388,8.37596899 C4.1744186,8.05426357 3.71705426,7.86046512 3.21317829,7.86046512 C2.15503876,7.86046512 1.29457364,8.73255814 1.29457364,9.80620155 C1.29457364,10.5658915 1.72093023,11.2209302 2.34496124,11.5426357 C2.31395349,11.7325581 2.29844961,11.9224806 2.29844961,12.1162791 C2.30620155,15.0542636 5.75193798,17.4418605 10,17.4418605 C14.248062,17.4418605 17.6937984,15.0542636 17.6937984,12.1124031 C17.6937984,11.9186047 17.6782946,11.7286822 17.6511628,11.5387597 C18.2751938,11.2170543 18.7015504,10.5620155 18.7015504,9.80620155 Z M1.98449612,9.80620155 C1.98449612,9.11627907 2.53875969,8.55813953 3.21705426,8.55813953 C3.49612403,8.55813953 3.75581395,8.65503876 3.96124031,8.81395349 C3.29069767,9.40310078 2.79457364,10.0930233 2.52713178,10.8449612 C2.20155039,10.6162791 1.98449612,10.2364341 1.98449612,9.80620155 Z M15.0542636,15.3062016 C13.7131783,16.2325581 11.9186047,16.744186 10,16.744186 C8.08139535,16.744186 6.28682171,16.2325581 4.94573643,15.3062016 C3.68604651,14.4341085 2.99224806,13.2984496 2.99224806,12.1124031 C2.99224806,11.9883721 3,11.8604651 3.01550388,11.7364341 C3.04263566,11.503876 3.10077519,11.2751938 3.18217054,11.0503876 C3.39922481,10.4457364 3.80232558,9.87596899 4.37209302,9.36821705 C4.54263566,9.21705426 4.72868217,9.06976744 4.93023256,8.93023256 C4.93410853,8.92635659 4.94186047,8.92248062 4.94573643,8.91860465 C6.28682171,7.99224806 8.08139535,7.48062016 10,7.48062016 C11.9186047,7.48062016 13.7131783,7.99224806 15.0542636,8.91860465 C15.0581395,8.92248062 15.0658915,8.92635659 15.0697674,8.93023256 C15.2713178,9.06976744 15.4573643,9.21705426 15.627907,9.36821705 C16.1976744,9.87596899 16.6007752,10.4457364 16.8178295,11.0503876 C16.8992248,11.2751938 16.9534884,11.503876 16.9844961,11.7364341 C17,11.8604651 17.0077519,11.9844961 17.0077519,12.1124031 C17.0077519,13.2984496 16.3139535,14.4341085 15.0542636,15.3062016 Z M15.8178295,3.25193798 C16.3914729,3.25193798 16.8565891,3.7248062 16.8565891,4.30620155 C16.8565891,4.8875969 16.3914729,5.36046512 15.8178295,5.36046512 C15.244186,5.36046512 14.7790698,4.8875969 14.7790698,4.30620155 C14.7790698,3.7248062 15.244186,3.25193798 15.8178295,3.25193798 Z M17.4728682,10.8410853 C17.2054264,10.0891473 16.7093023,9.39922481 16.0387597,8.81007752 C16.244186,8.65116279 16.503876,8.55426357 16.7829457,8.55426357 C17.4612403,8.55426357 18.0155039,9.11627907 18.0155039,9.80232558 C18.0155039,10.2364341 17.7984496,10.6162791 17.4728682,10.8410853 Z M12.5891473,12.503876 C13.2698704,12.503876 13.8217054,11.9520409 13.8217054,11.2713178 C13.8217054,10.5905948 13.2698704,10.0387597 12.5891473,10.0387597 C11.9084242,10.0387597 11.3565891,10.5905948 11.3565891,11.2713178 C11.3565891,11.9520409 11.9084242,12.503876 12.5891473,12.503876 Z M7.47286822,12.503876 C8.15359128,12.503876 8.70542636,11.9520409 8.70542636,11.2713178 C8.70542636,10.5905948 8.15359128,10.0387597 7.47286822,10.0387597 C6.79214515,10.0387597 6.24031008,10.5905948 6.24031008,11.2713178 C6.24031008,11.9520409 6.79214515,12.503876 7.47286822,12.503876 Z M12.5,13.9496124 C12.4922481,13.9573643 11.5620155,14.8875969 10,14.8953488 C8.41472868,14.8875969 7.50387597,13.9573643 7.49612403,13.9496124 L7.00775194,14.4302326 C7.05426357,14.4767442 8.15503876,15.5736434 10,15.5813953 C11.8449612,15.5736434 12.9418605,14.4767442 12.9883721,14.4302326 L12.5,13.9496124 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M17.7347115,10.3200443 C17.7347115,9.3230897 16.9698536,8.51328904 16.0292851,8.51328904 C15.5813953,8.51328904 15.1782946,8.69324474 14.8716624,8.99197121 C13.7278208,8.14977852 12.1705426,7.60631229 10.4375538,7.52713178 L11.2403101,4.73062016 L13.6382429,5.23089701 C13.6451335,6.11987818 14.3307494,6.839701 15.171404,6.839701 C16.0189492,6.839701 16.704565,6.11267996 16.704565,5.21650055 C16.704565,4.32032115 16.0189492,3.589701 15.171404,3.589701 C14.5305771,3.589701 13.9827735,4.00719823 13.751938,4.59745293 L10.8165375,3.98560354 L9.80361757,7.51993355 L9.55900086,7.52713178 C7.82601206,7.60631229 6.26873385,8.15337763 5.12489233,8.99197121 C4.82170543,8.69324474 4.41515935,8.51328904 3.9672696,8.51328904 C3.02670112,8.51328904 2.26184324,9.3230897 2.26184324,10.3200443 C2.26184324,11.0254707 2.64082687,11.6337209 3.1955211,11.9324474 C3.16795866,12.108804 3.15417743,12.2851606 3.15417743,12.4651163 C3.16106804,15.1932447 6.22394488,17.410299 10,17.410299 C13.7760551,17.410299 16.838932,15.1932447 16.838932,12.4615172 C16.838932,12.2815615 16.8251507,12.1052049 16.8010336,11.9288483 C17.3557278,11.6301218 17.7347115,11.0218715 17.7347115,10.3200443 Z M2.87510767,10.3200443 C2.87510767,9.67940199 3.36778639,9.16112957 3.9707149,9.16112957 C4.21877692,9.16112957 4.4496124,9.25110742 4.63221361,9.3986711 C4.03617571,9.94573643 3.59517657,10.5863787 3.35745047,11.2846069 C3.06804479,11.0722591 2.87510767,10.719546 2.87510767,10.3200443 Z M14.4926787,15.4271872 C13.3006029,16.2873754 11.7054264,16.7624585 10,16.7624585 C8.29457364,16.7624585 6.69939707,16.2873754 5.50732127,15.4271872 C4.3875969,14.6173865 3.77088717,13.5628461 3.77088717,12.4615172 C3.77088717,12.3463455 3.77777778,12.2275748 3.791559,12.1124031 C3.81567614,11.8964563 3.86735573,11.6841085 3.93970715,11.4753599 C4.13264427,10.9138981 4.49095607,10.3848283 4.99741602,9.91334441 C5.14900947,9.77297896 5.31438415,9.63621262 5.49354005,9.50664452 C5.49698536,9.5030454 5.50387597,9.49944629 5.50732127,9.49584718 C6.69939707,8.63565891 8.29457364,8.16057586 10,8.16057586 C11.7054264,8.16057586 13.3006029,8.63565891 14.4926787,9.49584718 C14.496124,9.49944629 14.5030146,9.5030454 14.5064599,9.50664452 C14.6856158,9.63621262 14.8509905,9.77297896 15.002584,9.91334441 C15.5090439,10.3848283 15.8673557,10.9138981 16.0602929,11.4753599 C16.1326443,11.6841085 16.1808786,11.8964563 16.208441,12.1124031 C16.2222222,12.2275748 16.2291128,12.3427464 16.2291128,12.4615172 C16.2291128,13.5628461 15.6124031,14.6173865 14.4926787,15.4271872 Z M12.3014643,12.8250277 C12.9065514,12.8250277 13.3970715,12.3126094 13.3970715,11.6805094 C13.3970715,11.0484094 12.9065514,10.5359911 12.3014643,10.5359911 C11.6963771,10.5359911 11.205857,11.0484094 11.205857,11.6805094 C11.205857,12.3126094 11.6963771,12.8250277 12.3014643,12.8250277 Z M7.75366064,12.8250277 C8.35874781,12.8250277 8.84926787,12.3126094 8.84926787,11.6805094 C8.84926787,11.0484094 8.35874781,10.5359911 7.75366064,10.5359911 C7.14857347,10.5359911 6.6580534,11.0484094 6.6580534,11.6805094 C6.6580534,12.3126094 7.14857347,12.8250277 7.75366064,12.8250277 Z M12.2222222,14.1674972 C12.2153316,14.1746955 11.3884582,15.0384828 10,15.0456811 C8.59086994,15.0384828 7.78122308,14.1746955 7.77433247,14.1674972 L7.34022394,14.6137874 C7.38156761,14.6569767 8.36003445,15.675526 10,15.6827243 C11.6399655,15.675526 12.6149871,14.6569767 12.6563307,14.6137874 L12.2222222,14.1674972 Z M15.171404,4.23394241 C15.6813092,4.23394241 16.0947459,4.67303433 16.0947459,5.21290144 C16.0947459,5.75276855 15.6813092,6.19186047 15.171404,6.19186047 C14.6614987,6.19186047 14.248062,5.75276855 14.248062,5.21290144 C14.248062,4.67303433 14.6614987,4.23394241 15.171404,4.23394241 Z M16.6425495,11.2810078 C16.4048234,10.5827796 15.9638243,9.94213732 15.3677864,9.39507198 C15.5503876,9.24750831 15.7812231,9.15753045 16.0292851,9.15753045 C16.6322136,9.15753045 17.1248923,9.67940199 17.1248923,10.3164452 C17.1248923,10.719546 16.9319552,11.0722591 16.6425495,11.2810078 Z'
},
'[rss]': {
filename: 'rss@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M2.251,10.329 C4.127,10.329 5.89,11.062 7.215,12.394 C8.543,13.727 9.274,15.502 9.274,17.392 L12.164,17.392 C12.164,11.903 7.717,7.438 2.251,7.438 L2.251,10.329 L2.251,10.329 z M2.255,5.204 C8.941,5.204 14.38,10.673 14.38,17.395 L17.27,17.395 C17.27,9.079 10.534,2.314 2.255,2.314 L2.255,5.204 L2.255,5.204 z M6.253,15.376 C6.253,16.482 5.356,17.378 4.251,17.378 C3.145,17.378 2.248,16.482 2.248,15.376 C2.248,14.27 3.145,13.374 4.25,13.374 C5.356,13.374 6.253,14.27 6.253,15.376 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M2.25090909,10.3287879 C4.12666667,10.3287879 5.89,11.0615152 7.21515152,12.3942424 C8.54272727,13.7269697 9.27363636,15.5021212 9.27363636,17.3918182 L12.1642424,17.3918182 C12.1642424,11.9030303 7.7169697,7.43787879 2.25090909,7.43787879 L2.25090909,10.3287879 L2.25090909,10.3287879 Z M2.25545455,5.20424242 C8.94060606,5.20424242 14.379697,10.6730303 14.379697,17.3954545 L17.270303,17.3954545 C17.270303,9.07878788 10.5342424,2.31363636 2.25545455,2.31363636 L2.25545455,5.20424242 L2.25545455,5.20424242 Z M6.25272727,15.3760606 C6.25272727,16.4815152 5.35606061,17.3781818 4.25060606,17.3781818 C3.14515152,17.3781818 2.24848485,16.4818182 2.24848485,15.3760606 C2.24848485,14.27 3.14484848,13.3739394 4.25030303,13.3739394 C5.35575758,13.3739394 6.25272727,14.27 6.25272727,15.3760606 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M5.20072727,9.6630303 C6.70133333,9.6630303 8.112,10.2492121 9.17212121,11.3153939 C10.2341818,12.3815758 10.8189091,13.801697 10.8189091,15.3134545 L13.1313939,15.3134545 C13.1313939,10.9224242 9.57357576,7.35030303 5.20072727,7.35030303 L5.20072727,9.6630303 L5.20072727,9.6630303 Z M5.20436364,5.56339394 C10.5524848,5.56339394 14.9037576,9.93842424 14.9037576,15.3163636 L17.2162424,15.3163636 C17.2162424,8.6630303 11.8273939,3.25090909 5.20436364,3.25090909 L5.20436364,5.56339394 L5.20436364,5.56339394 Z M8.40218182,13.7008485 C8.40218182,14.5852121 7.68484848,15.3025455 6.80048485,15.3025455 C5.91612121,15.3025455 5.19878788,14.5854545 5.19878788,13.7008485 C5.19878788,12.816 5.91587879,12.0991515 6.80024242,12.0991515 C7.68460606,12.0991515 8.40218182,12.816 8.40218182,13.7008485 Z'
},
'[tiktok]': {
filename: 'tiktok@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M15.892,4.466 C14.638,3.65 13.88,2.256 13.878,0.76 L10.699,0.76 L10.694,13.497 C10.638,14.958 9.418,16.102 7.957,16.064 C6.496,16.027 5.337,14.821 5.356,13.36 C5.375,11.899 6.566,10.724 8.027,10.725 C8.295,10.726 8.561,10.768 8.816,10.849 L8.816,7.604 C8.554,7.567 8.291,7.548 8.027,7.547 C4.801,7.547 2.177,10.171 2.177,13.397 C2.182,16.626 4.799,19.243 8.029,19.247 C11.254,19.247 13.878,16.623 13.878,13.397 L13.878,6.938 C15.166,7.865 16.713,8.363 18.3,8.361 L18.3,5.182 C17.445,5.182 16.608,4.934 15.892,4.466 z',
svgRectPath: 'M18,0 C19.102,0 20,0.895 20,2 L20,18 C20,19.102 19.105,20 18,20 L2,20 C0.898,20 0,19.105 0,18 L0,2 C0,0.898 0.895,0 2,0 L18,0 z M12.898,2.641 L10.367,2.641 L10.362,12.781 C10.318,13.944 9.347,14.855 8.184,14.825 C7.02,14.795 6.098,13.835 6.113,12.672 C6.128,11.509 7.076,10.574 8.24,10.575 C8.453,10.575 8.664,10.608 8.867,10.673 L8.867,8.09 C8.659,8.061 8.45,8.045 8.24,8.044 C5.672,8.044 3.582,10.133 3.582,12.701 C3.586,15.272 5.67,17.355 8.241,17.359 C10.808,17.359 12.898,15.27 12.898,12.701 L12.898,7.56 C13.923,8.297 15.154,8.694 16.418,8.692 L16.417,6.161 C15.737,6.162 15.071,5.964 14.501,5.592 C13.502,4.942 12.899,3.833 12.898,2.641 z',
svgCircPath: 'M10,-0 C15.523,0 20,4.477 20,10 C20,15.523 15.523,20 10,20 C4.477,20 0,15.523 0,10 C0,4.477 4.477,0 10,0 z M12.898,2.641 L10.367,2.641 L10.362,12.781 C10.318,13.944 9.347,14.855 8.184,14.825 C7.02,14.795 6.098,13.835 6.113,12.672 C6.128,11.509 7.076,10.574 8.24,10.575 C8.453,10.575 8.664,10.608 8.867,10.673 L8.867,8.09 C8.659,8.061 8.45,8.045 8.24,8.044 C5.672,8.044 3.582,10.133 3.582,12.701 C3.586,15.272 5.67,17.355 8.241,17.359 C10.808,17.359 12.898,15.27 12.898,12.701 L12.898,7.56 C13.923,8.297 15.154,8.694 16.418,8.692 L16.417,6.161 C15.737,6.162 15.071,5.964 14.501,5.592 C13.502,4.942 12.899,3.833 12.898,2.641 z'
},
'[tumblr]': {
filename: 'tumblr@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M8.525,2.112 L10.775,2.112 L10.775,5.772 L14.435,5.772 L14.435,8.598 L10.775,8.598 L10.775,12.656 C10.775,13.574 10.764,14.104 10.861,14.364 C10.958,14.623 11.2,14.892 11.464,15.047 C11.815,15.257 12.214,15.362 12.665,15.362 C13.466,15.362 14.264,15.101 15.056,14.581 L15.056,17.077 C14.381,17.395 13.768,17.619 13.22,17.747 C12.671,17.874 12.079,17.939 11.441,17.939 C10.718,17.939 10.29,17.847 9.735,17.666 C9.179,17.482 8.705,17.22 8.312,16.884 C7.919,16.546 7.647,16.186 7.495,15.806 C7.343,15.424 7.267,14.872 7.267,14.148 L7.267,8.598 L5.117,8.598 L5.117,6.356 C5.739,6.154 6.459,5.865 6.901,5.488 C7.346,5.11 7.702,4.657 7.97,4.128 C8.239,3.6 8.424,2.928 8.525,2.112 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M8.525,2.1117628 L10.775,2.1117628 L10.775,5.7717628 L14.435,5.7717628 L14.435,8.5980128 L10.775,8.5980128 L10.775,12.6555128 C10.775,13.573652 10.7644516,14.1040964 10.86125,14.3642628 C10.9580484,14.6231424 11.2000464,14.8917564 11.46375,15.0467628 C11.8149264,15.2570828 12.2141308,15.3617628 12.665,15.3617628 C13.4664024,15.3617628 14.2635308,15.1011668 15.05625,14.5805128 L15.05625,17.0767628 C14.3809108,17.3951364 13.7683104,17.6194132 13.22,17.7467628 C12.671046,17.8741124 12.0786408,17.9392628 11.44125,17.9392628 C10.7176728,17.9392628 10.290386,17.8472112 9.735,17.6655128 C9.1786492,17.4815636 8.7045184,17.220324 8.3125,16.8842628 C7.9185528,16.5456284 7.64679,16.1859536 7.495,15.8055128 C7.3428876,15.4241072 7.2675,14.87159 7.2675,14.1480128 L7.2675,8.5980128 L5.1175,8.5980128 L5.1175,6.3555128 C5.7391332,6.153876 6.4587424,5.8649164 6.90125,5.4880128 C7.3456872,5.1098232 7.7024376,4.6570284 7.97,4.1280128 C8.2394924,3.6002836 8.4236992,2.9276364 8.525,2.1117628 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M8.525,2.1117628 L10.775,2.1117628 L10.775,5.7717628 L14.435,5.7717628 L14.435,8.5980128 L10.775,8.5980128 L10.775,12.6555128 C10.775,13.573652 10.7644516,14.1040964 10.86125,14.3642628 C10.9580484,14.6231424 11.2000464,14.8917564 11.46375,15.0467628 C11.8149264,15.2570828 12.2141308,15.3617628 12.665,15.3617628 C13.4664024,15.3617628 14.2635308,15.1011668 15.05625,14.5805128 L15.05625,17.0767628 C14.3809108,17.3951364 13.7683104,17.6194132 13.22,17.7467628 C12.671046,17.8741124 12.0786408,17.9392628 11.44125,17.9392628 C10.7176728,17.9392628 10.290386,17.8472112 9.735,17.6655128 C9.1786492,17.4815636 8.7045184,17.220324 8.3125,16.8842628 C7.9185528,16.5456284 7.64679,16.1859536 7.495,15.8055128 C7.3428876,15.4241072 7.2675,14.87159 7.2675,14.1480128 L7.2675,8.5980128 L5.1175,8.5980128 L5.1175,6.3555128 C5.7391332,6.153876 6.4587424,5.8649164 6.90125,5.4880128 C7.3456872,5.1098232 7.7024376,4.6570284 7.97,4.1280128 C8.2394924,3.6002836 8.4236992,2.9276364 8.525,2.1117628 Z'
},
'[twitter]': {
filename: 'twitter@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M16.444,5.385 C17.161,4.964 17.709,4.297 17.968,3.502 C17.3,3.891 16.559,4.174 15.769,4.327 C15.138,3.665 14.239,3.251 13.244,3.251 C11.333,3.251 9.784,4.775 9.784,6.659 C9.784,6.923 9.815,7.185 9.872,7.436 C6.997,7.29 4.447,5.935 2.741,3.875 C2.444,4.378 2.271,4.963 2.271,5.589 C2.271,6.769 2.884,7.813 3.81,8.424 C3.244,8.406 2.71,8.253 2.244,7.998 C2.244,8.011 2.244,8.026 2.244,8.041 C2.244,9.691 3.436,11.069 5.02,11.382 C4.731,11.458 4.424,11.503 4.107,11.503 C3.884,11.503 3.668,11.482 3.458,11.442 C3.896,12.795 5.173,13.78 6.688,13.809 C5.508,14.721 4.015,15.267 2.394,15.267 C2.116,15.267 1.839,15.252 1.567,15.219 C3.098,16.186 4.918,16.749 6.872,16.749 C13.236,16.749 16.717,11.557 16.717,7.053 C16.717,6.907 16.713,6.757 16.706,6.614 C17.381,6.132 17.969,5.531 18.433,4.849 C17.812,5.121 17.146,5.302 16.444,5.385 L16.444,5.385 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M14.76875,6.580625 C15.3,6.269375 15.70625,5.775 15.8975,5.18625 C15.4025,5.474375 14.85375,5.684375 14.269375,5.7975 C13.801875,5.306875 13.135625,5 12.39875,5 C10.9825,5 9.83625,6.129375 9.83625,7.52375 C9.83625,7.72 9.85875,7.914375 9.90125,8.1 C7.771875,7.9925 5.883125,6.988125 4.61875,5.461875 C4.39875,5.835 4.27125,6.268125 4.27125,6.731875 C4.27125,7.60625 4.725,8.37875 5.41125,8.831875 C4.991875,8.818125 4.59625,8.705 4.25125,8.515625 C4.250625,8.52625 4.250625,8.536875 4.250625,8.548125 C4.250625,9.77 5.134375,10.79125 6.306875,11.023125 C6.0925,11.079375 5.86625,11.111875 5.63125,11.111875 C5.46625,11.111875 5.30625,11.096875 5.15,11.066875 C5.475,12.069375 6.42125,12.79875 7.5425,12.82 C6.66875,13.49625 5.5625,13.9 4.361875,13.9 C4.155625,13.9 3.950625,13.88875 3.75,13.865 C4.88375,14.580625 6.231875,14.998125 7.679375,14.998125 C12.3925,14.998125 14.970625,11.151875 14.970625,7.81625 C14.970625,7.708125 14.9675,7.5975 14.963125,7.490625 C15.463125,7.13375 15.89875,6.689375 16.241875,6.18375 C15.781875,6.385 15.28875,6.519375 14.76875,6.580625 Z',
svgCircPath: 'M10,0 C4.4771525,0 8.8817842e-16,4.47593818 8.8817842e-16,10 C8.8817842e-16,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M15.76875,6.580625 C16.3,6.269375 16.70625,5.775 16.8975,5.18625 C16.4025,5.474375 15.85375,5.684375 15.269375,5.7975 C14.801875,5.306875 14.135625,5 13.39875,5 C11.9825,5 10.83625,6.129375 10.83625,7.52375 C10.83625,7.72 10.85875,7.914375 10.90125,8.1 C8.771875,7.9925 6.883125,6.988125 5.61875,5.461875 C5.39875,5.835 5.27125,6.268125 5.27125,6.731875 C5.27125,7.60625 5.725,8.37875 6.41125,8.831875 C5.991875,8.818125 5.59625,8.705 5.25125,8.515625 C5.250625,8.52625 5.250625,8.536875 5.250625,8.548125 C5.250625,9.77 6.134375,10.79125 7.306875,11.023125 C7.0925,11.079375 6.86625,11.111875 6.63125,11.111875 C6.46625,11.111875 6.30625,11.096875 6.15,11.066875 C6.475,12.069375 7.42125,12.79875 8.5425,12.82 C7.66875,13.49625 6.5625,13.9 5.361875,13.9 C5.155625,13.9 4.950625,13.88875 4.75,13.865 C5.88375,14.580625 7.231875,14.998125 8.679375,14.998125 C13.3925,14.998125 15.970625,11.151875 15.970625,7.81625 C15.970625,7.708125 15.9675,7.5975 15.963125,7.490625 C16.463125,7.13375 16.89875,6.689375 17.241875,6.18375 C16.781875,6.385 16.28875,6.519375 15.76875,6.580625 Z'
},
'[vimeo]': {
filename: 'vimeo@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M15.449,3.064 C17.015,3.032 18.307,4.052 17.889,6.407 C16.997,11.433 12.01,15.689 10.511,16.661 C9.011,17.634 7.643,16.272 7.148,15.243 C6.579,14.068 4.878,7.705 4.432,7.177 C3.987,6.651 2.649,7.705 2.649,7.705 L2,6.854 C2,6.854 4.716,3.611 6.782,3.205 C8.974,2.775 8.97,6.569 9.498,8.676 C10.007,10.714 10.35,11.88 10.795,11.88 C11.241,11.88 12.092,10.743 13.024,9.001 C13.957,7.258 12.984,5.717 11.16,6.812 C11.547,4.487 13.674,3.1 15.449,3.064 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M15.44875,3.06375 C17.0146248,3.03195936 18.3067688,4.0521372 17.88875,6.4075 C16.9966544,11.4329184 12.0102292,15.6888172 10.51125,16.66125 C9.0113028,17.634332 7.6433952,16.2723624 7.1475,15.2425 C6.5793332,14.0680956 4.8783864,7.7046908 4.4325,7.1775 C3.9866132,6.6506304 2.64875,7.705 2.64875,7.705 L2,6.85375 C2,6.85375 4.7156772,3.6105564 6.7825,3.205 C8.9738612,2.774922 8.9699856,6.5694196 9.4975,8.67625 C10.0072684,10.7140348 10.3500808,11.88 10.795,11.88 C11.2405632,11.88 12.0916468,10.743176 13.02375,9.00125 C13.9571436,7.2577112 12.9835536,5.717142 11.16,6.8125 C11.547368,4.4867496 13.674092,3.0997794 15.44875,3.06375 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M14.7676563,4.05919643 C16.1377967,4.02967655 17.2684227,4.97698454 16.9026563,7.16410714 C16.1220726,11.8305671 11.7589506,15.7824731 10.4473438,16.6854464 C9.13488995,17.5890226 7.9379708,16.3243365 7.5040625,15.3680357 C7.00691655,14.2775173 5.5185881,8.36864146 5.1284375,7.87910714 C4.73828655,7.38987109 3.56765625,8.36892857 3.56765625,8.36892857 L3,7.57848214 C3,7.57848214 5.37621755,4.56694523 7.1846875,4.19035714 C9.10212855,3.790999 9.0987374,7.31446106 9.5603125,9.27080357 C10.0063599,11.1630323 10.3063207,12.2457143 10.695625,12.2457143 C11.0854928,12.2457143 11.830191,11.190092 12.6457813,9.57258929 C13.4625007,7.95358897 12.6106094,6.52306043 11.015,7.54017857 C11.353947,5.3805532 13.2148305,4.0926523 14.7676563,4.05919643 Z'
},
'[vsco]': {
filename: 'vsco@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10,0 C4.48,0 0,4.48 0,10 C0,15.52 4.48,20 10,20 C15.52,20 20,15.52 20,10 C20,4.48 15.52,0 10,0 z M19.6,10 C19.6,10.34 19.581,10.66 19.54,10.98 L17.84,10.78 C17.86,10.52 17.882,10.26 17.882,10 C17.882,9.76 17.861,9.5 17.84,9.26 L19.54,9.06 C19.6,9.38 19.6,9.68 19.6,10 z M0.399,10 C0.399,9.68 0.419,9.359 0.44,9.04 L2.14,9.24 C2.12,9.5 2.101,9.74 2.101,10 C2.101,10.26 2.12,10.5 2.14,10.76 L0.44,10.96 C0.399,10.641 0.399,10.32 0.399,10 z M17.459,7.42 L19.06,6.82 C19.28,7.42 19.421,8.04 19.52,8.68 L17.82,8.88 C17.739,8.38 17.62,7.88 17.459,7.42 z M17.5,10 C17.5,10.5 17.44,10.98 17.361,11.46 L15.68,11.081 C15.739,10.74 15.779,10.38 15.779,10 C15.779,9.62 15.739,9.24 15.68,8.88 L17.361,8.499 C17.459,8.98 17.5,9.48 17.5,10 z M10,15.38 C7.029,15.379 4.621,12.971 4.62,10 C4.621,7.029 7.029,4.621 10,4.62 C12.971,4.621 15.379,7.029 15.38,10 C15.387,12.966 12.988,15.373 10.023,15.38 L10,15.38 z M10.18,17.5 L10.18,15.78 C10.917,15.756 11.643,15.593 12.32,15.301 L13.06,16.861 C12.152,17.263 11.173,17.479 10.18,17.5 z M6.9,16.841 L7.66,15.28 C8.32,15.579 9.04,15.759 9.8,15.78 L9.8,17.5 C8.798,17.481 7.812,17.256 6.9,16.841 z M2.5,10 C2.5,9.48 2.56,8.98 2.66,8.48 L4.34,8.86 C4.258,9.235 4.218,9.617 4.22,10 C4.22,10.36 4.26,10.72 4.32,11.06 L2.64,11.439 C2.543,10.966 2.495,10.483 2.5,10 z M9.8,2.5 L9.8,4.22 C9.069,4.244 8.35,4.407 7.68,4.7 L6.94,3.141 C7.843,2.743 8.814,2.525 9.8,2.5 z M13.079,3.16 L12.32,4.72 C11.646,4.418 10.918,4.254 10.18,4.24 L10.18,2.52 C11.22,2.52 12.2,2.76 13.079,3.16 z M17.319,7.04 C17.127,6.573 16.892,6.125 16.619,5.7 L18.02,4.74 C18.359,5.28 18.66,5.84 18.9,6.44 L17.319,7.04 z M17.261,8.12 L15.579,8.5 C15.387,7.792 15.062,7.127 14.62,6.54 L15.98,5.461 C16.58,6.26 17.02,7.14 17.261,8.12 z M14.38,6.24 C13.903,5.684 13.327,5.223 12.68,4.879 L13.44,3.32 C14.32,3.778 15.101,4.403 15.74,5.16 L14.38,6.24 z M13.88,3.12 L14.68,1.6 C15.24,1.92 15.759,2.28 16.26,2.7 L15.121,4 C14.737,3.666 14.322,3.372 13.88,3.12 z M13.54,2.94 C13.09,2.718 12.622,2.538 12.14,2.4 L12.56,0.74 C13.18,0.92 13.78,1.14 14.359,1.44 L13.54,2.94 z M11.74,2.3 C11.24,2.18 10.74,2.12 10.22,2.101 L10.22,0.399 C10.881,0.419 11.54,0.499 12.16,0.64 L11.74,2.3 z M9.84,2.101 C9.336,2.118 8.834,2.179 8.34,2.281 L7.94,0.62 C8.54,0.48 9.179,0.399 9.84,0.399 L9.84,2.101 z M7.94,2.379 C7.452,2.518 6.977,2.699 6.52,2.92 L5.72,1.4 C6.296,1.114 6.899,0.887 7.52,0.72 L7.94,2.379 z M6.18,3.1 C5.739,3.345 5.324,3.633 4.94,3.96 L3.8,2.68 C4.3,2.26 4.82,1.9 5.38,1.581 L6.18,3.1 z M6.58,3.32 L7.32,4.879 C6.66,5.219 6.1,5.679 5.62,6.219 L4.28,5.14 C4.926,4.394 5.706,3.777 6.58,3.32 z M4.04,5.46 L5.38,6.539 C4.938,7.127 4.613,7.792 4.42,8.5 L2.74,8.12 C3,7.12 3.44,6.22 4.04,5.46 z M2.7,7 L1.1,6.4 C1.339,5.8 1.64,5.22 2,4.7 L3.4,5.68 C3.116,6.092 2.881,6.534 2.7,7 z M2.56,7.379 C2.4,7.86 2.26,8.339 2.2,8.859 L0.5,8.661 C0.6,8.02 0.74,7.38 0.961,6.78 L2.56,7.379 z M2.18,11.14 C2.26,11.64 2.379,12.14 2.54,12.62 L0.94,13.22 C0.714,12.613 0.56,11.983 0.48,11.339 L2.18,11.14 z M2.7,12.98 C2.899,13.46 3.14,13.9 3.4,14.319 L2,15.28 C1.638,14.756 1.336,14.192 1.1,13.6 L2.7,12.98 z M2.72,11.82 L4.401,11.44 C4.581,12.16 4.921,12.841 5.341,13.42 L4,14.5 C3.396,13.703 2.961,12.791 2.72,11.82 z M5.58,13.72 C6.061,14.28 6.64,14.76 7.3,15.1 L6.54,16.66 C5.654,16.196 4.866,15.564 4.22,14.8 L5.58,13.72 z M6.18,16.899 L5.38,18.42 C4.818,18.107 4.288,17.737 3.8,17.319 L4.94,16.04 C5.32,16.379 5.72,16.66 6.18,16.899 z M6.52,17.08 C6.96,17.3 7.44,17.48 7.941,17.619 L7.521,19.279 C6.898,19.116 6.295,18.888 5.721,18.6 L6.52,17.08 z M8.32,17.72 C8.8,17.82 9.3,17.881 9.82,17.901 L9.82,19.6 C9.175,19.578 8.533,19.505 7.899,19.38 L8.32,17.72 z M10.22,17.9 C10.724,17.882 11.226,17.822 11.721,17.719 L12.12,19.379 C11.496,19.519 10.859,19.599 10.22,19.618 L10.22,17.9 z M12.101,17.62 C12.589,17.483 13.063,17.302 13.52,17.081 L14.32,18.601 C13.747,18.892 13.143,19.12 12.521,19.28 L12.101,17.62 z M13.839,16.899 C14.279,16.66 14.699,16.36 15.079,16.04 L16.22,17.319 C15.73,17.737 15.201,18.107 14.64,18.42 L13.839,16.899 z M13.44,16.68 L12.7,15.121 C13.357,14.776 13.941,14.307 14.42,13.741 L15.758,14.821 C15.11,15.579 14.323,16.211 13.44,16.68 z M15.999,14.52 L14.66,13.44 C15.103,12.85 15.423,12.176 15.6,11.46 L17.281,11.84 C17.022,12.804 16.588,13.713 15.999,14.52 z M17.3,13 L18.9,13.601 C18.66,14.201 18.36,14.761 18.001,15.301 L16.599,14.32 C16.88,13.9 17.119,13.46 17.3,13 z M17.44,12.621 C17.6,12.16 17.72,11.661 17.801,11.161 L19.5,11.36 C19.408,11.994 19.255,12.617 19.041,13.22 L17.44,12.621 z M17.82,4.42 L16.419,5.38 C16.121,4.972 15.786,4.591 15.42,4.24 L16.56,2.96 C17.02,3.42 17.44,3.9 17.82,4.42 z M3.5,2.94 L4.64,4.22 C4.26,4.56 3.94,4.94 3.64,5.36 L2.24,4.38 C2.599,3.85 3.023,3.367 3.5,2.94 z M2.22,15.62 L3.62,14.66 C3.92,15.06 4.261,15.441 4.62,15.801 L3.48,17.08 C3.023,16.626 2.602,16.138 2.22,15.62 z M16.52,17.061 L15.38,15.78 C15.74,15.441 16.081,15.061 16.379,14.66 L17.781,15.64 C17.4,16.14 16.98,16.619 16.52,17.061 z',
svgRectPath: 'M18,0 C19.102,0 20,0.895 20,2 L20,18 C20,19.102 19.105,20 18,20 L2,20 C0.898,20 0,19.105 0,18 L0,2 C0,0.898 0.895,0 2,0 L18,0 z M10,0.55 C4.784,0.55 0.55,4.784 0.55,10 C0.55,15.216 4.784,19.45 10,19.45 C15.216,19.45 19.45,15.216 19.45,10 C19.45,4.784 15.216,0.55 10,0.55 z M11.626,17.295 L12.003,18.863 C11.414,18.996 10.812,19.071 10.208,19.089 L10.208,17.465 C10.684,17.449 11.158,17.391 11.626,17.295 z M8.412,17.295 C8.866,17.39 9.339,17.447 9.83,17.466 L9.83,19.072 C9.22,19.052 8.614,18.982 8.015,18.864 L8.412,17.295 z M13.326,16.691 L14.082,18.128 C13.541,18.403 12.97,18.618 12.382,18.77 L11.985,17.201 C12.447,17.071 12.895,16.9 13.326,16.691 z M6.711,16.691 C7.127,16.899 7.581,17.069 8.054,17.2 L7.657,18.769 C7.069,18.614 6.499,18.399 5.956,18.127 L6.711,16.691 z M14.8,15.708 L15.878,16.917 C15.415,17.312 14.915,17.661 14.385,17.957 L13.628,16.52 C14.044,16.294 14.441,16.01 14.8,15.708 z M5.218,15.708 C5.577,16.028 5.955,16.294 6.39,16.52 L5.634,17.957 C5.103,17.661 4.602,17.312 4.141,16.917 L5.218,15.708 z M7.789,14.99 C8.412,15.272 9.093,15.442 9.811,15.462 L9.811,17.087 C8.864,17.069 7.932,16.857 7.07,16.465 L7.789,14.99 z M12.192,15.009 L12.892,16.483 C12.033,16.863 11.109,17.068 10.17,17.087 L10.17,15.462 C10.867,15.439 11.553,15.286 12.192,15.009 z M3.971,14.404 C4.254,14.782 4.576,15.142 4.916,15.482 L3.839,16.691 C3.407,16.261 3.009,15.8 2.648,15.311 L3.971,14.404 z M16.028,14.404 L17.353,15.33 C16.993,15.802 16.596,16.255 16.161,16.672 L15.084,15.462 C15.424,15.142 15.746,14.782 16.028,14.404 z M14.177,13.535 L15.442,14.556 C14.829,15.272 14.086,15.869 13.251,16.313 L12.551,14.839 C13.172,14.513 13.724,14.07 14.177,13.535 z M5.823,13.515 C6.277,14.045 6.825,14.498 7.449,14.819 L6.73,16.294 C5.893,15.855 5.148,15.258 4.538,14.536 L5.823,13.515 z M10,4.916 C12.807,4.917 15.083,7.193 15.084,10 C15.09,12.803 12.823,15.078 10.021,15.084 L10,15.084 C7.193,15.083 4.917,12.807 4.916,10 C4.917,7.193 7.193,4.917 10,4.916 z M16.898,12.835 L18.41,13.403 C18.184,13.97 17.9,14.499 17.561,15.009 L16.236,14.082 C16.502,13.686 16.728,13.27 16.899,12.835 z M3.102,12.816 C3.29,13.27 3.517,13.686 3.763,14.082 L2.44,14.99 C2.097,14.494 1.812,13.961 1.59,13.402 L3.102,12.816 z M15.292,11.38 L16.88,11.739 C16.635,12.65 16.226,13.509 15.669,14.271 L14.404,13.251 C14.823,12.693 15.125,12.056 15.292,11.38 z M4.709,11.361 C4.879,12.041 5.2,12.685 5.597,13.232 L4.33,14.252 C3.759,13.499 3.348,12.637 3.12,11.72 L4.709,11.361 z M17.372,11.097 L18.977,11.285 C18.891,11.884 18.746,12.473 18.544,13.043 L17.031,12.477 C17.182,12.041 17.295,11.569 17.372,11.097 z M2.61,11.077 C2.686,11.55 2.798,12.022 2.95,12.476 L1.438,13.043 C1.225,12.47 1.079,11.873 1.004,11.266 L2.61,11.077 z M16.956,8.582 C17.049,9.036 17.087,9.509 17.087,10 C17.087,10.472 17.031,10.926 16.956,11.38 L15.368,11.021 C15.424,10.699 15.461,10.359 15.461,10 C15.461,9.641 15.424,9.282 15.368,8.942 L16.956,8.582 z M3.064,8.564 L4.651,8.923 C4.574,9.277 4.536,9.638 4.538,10 C4.538,10.34 4.576,10.68 4.632,11.002 L3.045,11.36 C2.953,10.913 2.908,10.457 2.913,10 C2.913,9.509 2.969,9.036 3.064,8.564 z M19.015,9.112 C19.072,9.414 19.072,9.698 19.072,10 C19.072,10.321 19.054,10.624 19.015,10.926 L17.409,10.737 C17.428,10.491 17.448,10.246 17.448,10 C17.448,9.773 17.428,9.528 17.409,9.301 L19.015,9.112 z M0.966,9.093 L2.572,9.282 C2.553,9.528 2.535,9.754 2.535,10 C2.535,10.246 2.553,10.472 2.572,10.718 L0.966,10.907 C0.927,10.606 0.927,10.302 0.927,10 C0.927,9.698 0.946,9.394 0.966,9.093 z M18.562,6.995 C18.77,7.562 18.903,8.148 18.996,8.753 L17.39,8.942 C17.314,8.469 17.201,7.997 17.049,7.562 L18.562,6.995 z M1.458,6.957 L2.969,7.523 C2.818,7.978 2.686,8.431 2.629,8.922 L1.023,8.734 C1.117,8.129 1.249,7.524 1.458,6.957 z M4.368,5.71 L5.634,6.729 C5.217,7.285 4.909,7.913 4.727,8.583 L3.139,8.223 C3.385,7.278 3.801,6.428 4.368,5.71 z M15.651,5.71 C16.218,6.466 16.634,7.297 16.861,8.223 L15.272,8.583 C15.091,7.913 14.783,7.285 14.366,6.73 L15.651,5.71 z M17.579,5.029 C17.899,5.54 18.184,6.069 18.41,6.636 L16.917,7.203 C16.735,6.762 16.513,6.338 16.255,5.937 L17.579,5.029 z M2.44,4.991 L3.763,5.918 C3.494,6.307 3.272,6.725 3.102,7.165 L1.589,6.598 C1.816,6.031 2.1,5.483 2.44,4.991 z M13.251,3.687 C14.082,4.12 14.82,4.71 15.424,5.426 L14.139,6.447 C13.689,5.922 13.144,5.486 12.533,5.161 L13.251,3.687 z M6.768,3.687 L7.467,5.161 C6.844,5.482 6.315,5.917 5.861,6.427 L4.595,5.407 C5.205,4.702 5.942,4.119 6.768,3.687 z M16.199,3.347 C16.634,3.782 17.031,4.236 17.39,4.727 L16.066,5.634 C15.784,5.248 15.468,4.888 15.122,4.557 L16.199,3.347 z M3.858,3.328 L4.935,4.538 C4.576,4.859 4.273,5.218 3.99,5.615 L2.667,4.689 C3.006,4.188 3.407,3.732 3.858,3.328 z M10.17,2.931 C11.153,2.931 12.079,3.158 12.91,3.536 L12.192,5.01 C11.555,4.725 10.868,4.57 10.17,4.557 L10.17,2.931 z M9.811,2.912 L9.811,4.538 C9.12,4.561 8.441,4.714 7.808,4.991 L7.108,3.518 C7.961,3.142 8.879,2.936 9.811,2.913 z M14.423,2.062 C14.952,2.364 15.442,2.705 15.916,3.102 L14.839,4.33 C14.476,4.014 14.084,3.736 13.667,3.498 L14.423,2.062 z M5.634,2.044 L6.39,3.48 C5.974,3.711 5.581,3.984 5.218,4.292 L4.141,3.083 C4.614,2.686 5.105,2.346 5.634,2.044 z M12.419,1.249 C13.005,1.419 13.572,1.627 14.119,1.911 L13.345,3.328 C12.92,3.119 12.477,2.948 12.022,2.818 L12.419,1.249 z M7.656,1.23 L8.053,2.798 C7.592,2.93 7.143,3.101 6.711,3.309 L5.955,1.873 C6.5,1.603 7.07,1.388 7.656,1.23 z M10.208,0.927 C10.832,0.946 11.455,1.022 12.041,1.155 L11.644,2.724 C11.172,2.61 10.699,2.553 10.208,2.535 L10.208,0.927 z M9.849,0.927 L9.849,2.535 C9.372,2.552 8.898,2.609 8.431,2.705 L8.053,1.136 C8.62,1.004 9.224,0.927 9.849,0.927 z',
svgCircPath: 'M10,-0 C15.524,0 20,4.477 20,10 C20,15.524 15.523,20 10,20 C4.476,20 0,15.523 0,10 C0,4.476 4.477,0 10,-0 z M10,0.5 C4.756,0.5 0.5,4.756 0.5,10 C0.5,15.244 4.756,19.5 10,19.5 C15.244,19.5 19.5,15.244 19.5,10 C19.5,4.756 15.244,0.5 10,0.5 z M11.635,17.333 L12.014,18.91 C11.421,19.043 10.816,19.119 10.209,19.137 L10.209,17.505 C10.688,17.488 11.165,17.431 11.635,17.333 z M8.404,17.334 C8.86,17.429 9.335,17.487 9.829,17.506 L9.829,19.12 C9.216,19.099 8.607,19.03 8.004,18.911 L8.404,17.334 z M13.344,16.727 L14.104,18.171 C13.559,18.448 12.986,18.664 12.395,18.816 L11.996,17.239 C12.46,17.108 12.91,16.937 13.344,16.727 z M6.694,16.726 C7.112,16.935 7.568,17.106 8.044,17.238 L7.645,18.815 C7.053,18.66 6.48,18.444 5.935,18.17 L6.694,16.726 z M14.825,15.738 L15.909,16.953 C15.444,17.351 14.941,17.701 14.408,17.999 L13.647,16.554 C14.065,16.327 14.464,16.042 14.825,15.738 z M5.193,15.738 C5.554,16.06 5.934,16.327 6.371,16.554 L5.611,17.999 C5.077,17.701 4.574,17.351 4.11,16.953 L5.193,15.738 z M7.777,15.016 C8.404,15.3 9.088,15.471 9.81,15.491 L9.81,17.125 C8.858,17.107 7.921,16.893 7.055,16.499 L7.777,15.016 z M12.204,15.036 L12.907,16.518 C12.044,16.899 11.115,17.105 10.171,17.125 L10.171,15.491 C10.872,15.468 11.561,15.314 12.204,15.036 z M3.939,14.427 C4.224,14.807 4.548,15.169 4.889,15.511 L3.806,16.726 C3.372,16.295 2.972,15.831 2.609,15.339 L3.939,14.427 z M16.06,14.427 L17.392,15.358 C17.03,15.833 16.631,16.288 16.194,16.708 L15.111,15.491 C15.453,15.169 15.777,14.808 16.06,14.427 z M14.199,13.554 L15.47,14.58 C14.854,15.3 14.107,15.9 13.268,16.346 L12.565,14.865 C13.189,14.537 13.744,14.091 14.199,13.554 z M5.801,13.534 C6.258,14.066 6.808,14.522 7.435,14.845 L6.713,16.327 C5.871,15.886 5.123,15.286 4.509,14.56 L5.801,13.534 z M10,4.889 C12.822,4.89 15.11,7.178 15.111,10 C15.117,12.818 12.838,15.105 10.021,15.111 L10,15.111 C7.178,15.11 4.89,12.822 4.889,10 C4.89,7.178 7.178,4.89 10,4.889 z M16.935,12.85 L18.455,13.421 C18.227,13.991 17.942,14.523 17.601,15.036 L16.269,14.104 C16.536,13.705 16.763,13.287 16.935,12.85 z M3.065,12.831 C3.254,13.287 3.483,13.705 3.73,14.103 L2.4,15.016 C2.056,14.518 1.769,13.982 1.545,13.42 L3.065,12.831 z M15.32,11.387 L16.917,11.748 C16.671,12.664 16.259,13.528 15.699,14.294 L14.427,13.268 C14.848,12.708 15.152,12.067 15.32,11.387 z M4.681,11.368 C4.852,12.052 5.175,12.699 5.574,13.249 L4.3,14.275 C3.726,13.517 3.313,12.651 3.084,11.729 L4.681,11.368 z M17.411,11.103 L19.025,11.292 C18.938,11.894 18.792,12.486 18.589,13.059 L17.068,12.49 C17.22,12.052 17.334,11.578 17.411,11.103 z M2.571,11.083 C2.647,11.558 2.76,12.033 2.913,12.489 L1.393,13.059 C1.178,12.483 1.032,11.883 0.956,11.272 L2.571,11.083 z M16.993,8.574 C17.086,9.031 17.125,9.506 17.125,10 C17.125,10.475 17.068,10.931 16.993,11.387 L15.396,11.027 C15.452,10.703 15.49,10.361 15.49,10 C15.49,9.639 15.452,9.278 15.396,8.936 L16.993,8.574 z M3.027,8.556 L4.623,8.917 C4.545,9.273 4.507,9.636 4.509,10 C4.509,10.342 4.547,10.684 4.604,11.007 L3.008,11.367 C2.915,10.918 2.87,10.459 2.875,10 C2.875,9.506 2.932,9.031 3.027,8.556 z M19.063,9.107 C19.12,9.411 19.12,9.696 19.12,10 C19.12,10.323 19.102,10.627 19.063,10.931 L17.448,10.741 C17.467,10.494 17.488,10.247 17.488,10 C17.488,9.772 17.468,9.525 17.448,9.297 L19.063,9.107 z M0.918,9.088 L2.533,9.278 C2.514,9.525 2.496,9.753 2.496,10 C2.496,10.247 2.514,10.475 2.533,10.722 L0.918,10.912 C0.879,10.609 0.879,10.304 0.879,10 C0.879,9.696 0.898,9.391 0.918,9.088 z M18.607,6.979 C18.816,7.549 18.95,8.138 19.044,8.746 L17.429,8.936 C17.352,8.461 17.239,7.986 17.086,7.549 L18.607,6.979 z M1.413,6.941 L2.932,7.51 C2.78,7.967 2.647,8.422 2.59,8.916 L0.975,8.728 C1.07,8.119 1.203,7.511 1.413,6.941 z M4.338,5.687 L5.611,6.712 C5.191,7.27 4.882,7.902 4.699,8.575 L3.103,8.214 C3.35,7.264 3.768,6.409 4.338,5.687 z M15.681,5.688 C16.251,6.447 16.669,7.283 16.898,8.214 L15.3,8.575 C15.118,7.902 14.809,7.27 14.389,6.713 L15.681,5.688 z M17.619,5.003 C17.941,5.516 18.227,6.048 18.455,6.618 L16.953,7.188 C16.77,6.745 16.547,6.319 16.288,5.915 L17.619,5.003 z M2.4,4.965 L3.73,5.896 C3.46,6.287 3.237,6.707 3.065,7.15 L1.545,6.58 C1.772,6.01 2.058,5.459 2.4,4.965 z M13.268,3.654 C14.104,4.089 14.846,4.682 15.453,5.402 L14.161,6.428 C13.708,5.9 13.16,5.462 12.546,5.135 L13.268,3.654 z M6.751,3.654 L7.454,5.135 C6.827,5.458 6.295,5.895 5.839,6.408 L4.566,5.383 C5.18,4.674 5.921,4.088 6.751,3.654 z M16.232,3.312 C16.669,3.749 17.068,4.205 17.429,4.699 L16.098,5.611 C15.815,5.223 15.497,4.861 15.149,4.528 L16.232,3.312 z M3.825,3.293 L4.908,4.509 C4.547,4.832 4.243,5.193 3.958,5.592 L2.628,4.661 C2.969,4.157 3.372,3.698 3.825,3.293 z M10.171,2.894 C11.159,2.894 12.09,3.122 12.925,3.502 L12.204,4.984 C11.564,4.697 10.872,4.541 10.171,4.528 L10.171,2.894 z M9.81,2.875 L9.81,4.509 C9.116,4.532 8.432,4.686 7.796,4.965 L7.093,3.484 C7.95,3.105 8.873,2.899 9.81,2.875 z M14.446,2.02 C14.978,2.324 15.471,2.666 15.947,3.065 L14.865,4.3 C14.5,3.983 14.106,3.703 13.686,3.464 L14.446,2.02 z M5.611,2.002 L6.371,3.445 C5.952,3.678 5.558,3.952 5.193,4.262 L4.11,3.046 C4.585,2.647 5.079,2.305 5.611,2.002 z M12.432,1.203 C13.021,1.374 13.591,1.583 14.141,1.868 L13.363,3.293 C12.936,3.082 12.491,2.911 12.033,2.78 L12.432,1.203 z M7.644,1.184 L8.043,2.76 C7.579,2.892 7.128,3.064 6.694,3.274 L5.934,1.83 C6.481,1.558 7.054,1.342 7.644,1.184 z M10.209,0.879 C10.837,0.898 11.463,0.974 12.052,1.108 L11.653,2.685 C11.178,2.571 10.703,2.514 10.209,2.496 L10.209,0.879 z M9.848,0.879 L9.848,2.496 C9.369,2.512 8.892,2.57 8.423,2.667 L8.043,1.089 C8.613,0.956 9.22,0.879 9.848,0.879 z'
},
'[wordpress]': {
filename: 'wordpress@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M10,2 C5.589,2 2,5.589 2,10 C2,14.411 5.589,18 10,18 C14.411,18 18,14.411 18,10 C18,5.589 14.411,2 10,2 z M2.807,10 C2.807,8.957 3.031,7.968 3.431,7.073 L6.861,16.473 C4.462,15.307 2.807,12.847 2.807,10 z M10,17.193 C9.294,17.193 8.613,17.09 7.969,16.9 L10.127,10.63 L12.337,16.687 C12.352,16.722 12.37,16.754 12.389,16.785 C11.641,17.049 10.838,17.193 10,17.193 z M10.991,6.628 C11.424,6.605 11.814,6.56 11.814,6.56 C12.201,6.514 12.156,5.944 11.768,5.966 C11.768,5.966 10.604,6.058 9.851,6.058 C9.144,6.058 7.957,5.966 7.957,5.966 C7.569,5.944 7.523,6.536 7.911,6.56 C7.911,6.56 8.278,6.605 8.665,6.628 L9.786,9.698 L8.212,14.419 L5.594,6.628 C6.027,6.605 6.417,6.56 6.417,6.56 C6.803,6.514 6.759,5.944 6.371,5.966 C6.371,5.966 5.206,6.058 4.453,6.058 C4.318,6.058 4.159,6.055 3.99,6.049 C5.277,4.096 7.488,2.808 10,2.808 C11.873,2.808 13.578,3.523 14.858,4.696 C14.826,4.694 14.796,4.689 14.764,4.689 C14.057,4.689 13.556,5.305 13.556,5.966 C13.556,6.56 13.898,7.061 14.262,7.654 C14.536,8.132 14.856,8.748 14.856,9.637 C14.856,10.252 14.619,10.967 14.309,11.962 L13.59,14.359 L10.991,6.628 z M16.312,6.549 C16.873,7.575 17.192,8.75 17.192,10 C17.192,12.654 15.755,14.97 13.616,16.218 L15.814,9.866 C16.223,8.84 16.361,8.019 16.361,7.29 C16.36,7.024 16.343,6.779 16.312,6.549 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M10,2 C5.589,2 2,5.589 2,10 C2,14.411 5.589,18.0005 10,18.0005 C14.411,18.0005 18,14.411 18,10 C18,5.589 14.411,2 10,2 Z M2.8075,10 C2.8075,8.957 3.031,7.9675 3.4305,7.073 L6.861,16.473 C4.462,15.3075 2.8075,12.847 2.8075,10 Z M10,17.193 C9.294,17.193 8.6125,17.09 7.9685,16.9005 L10.1265,10.6295 L12.3375,16.6865 C12.352,16.7215 12.3695,16.7545 12.389,16.785 C11.641,17.049 10.838,17.193 10,17.193 Z M10.991,6.6275 C11.424,6.605 11.814,6.5595 11.814,6.5595 C12.2015,6.5135 12.156,5.944 11.768,5.9665 C11.768,5.9665 10.6035,6.058 9.851,6.058 C9.144,6.058 7.9565,5.9665 7.9565,5.9665 C7.569,5.9435 7.5235,6.536 7.911,6.5595 C7.911,6.5595 8.278,6.605 8.6655,6.6275 L9.786,9.6985 L8.212,14.419 L5.5935,6.6275 C6.027,6.605 6.4165,6.5595 6.4165,6.5595 C6.803,6.5135 6.7585,5.944 6.3705,5.9665 C6.3705,5.9665 5.2055,6.058 4.453,6.058 C4.318,6.058 4.159,6.055 3.99,6.049 C5.277,4.0965 7.4875,2.8075 10,2.8075 C11.8725,2.8075 13.5775,3.523 14.8575,4.696 C14.8265,4.6935 14.796,4.6895 14.764,4.6895 C14.0575,4.6895 13.556,5.305 13.556,5.9665 C13.556,6.5595 13.898,7.0605 14.2625,7.6535 C14.536,8.132 14.856,8.7475 14.856,9.6375 C14.856,10.2525 14.619,10.967 14.3085,11.9625 L13.5905,14.359 L10.991,6.6275 Z M16.3115,6.5495 C16.873,7.5745 17.1925,8.7495 17.1925,10 C17.1925,12.654 15.7545,14.97 13.6165,16.2175 L15.8135,9.8655 C16.2235,8.8395 16.3605,8.019 16.3605,7.29 C16.36,7.0245 16.343,6.779 16.3115,6.5495 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M10,2 C5.589,2 2,5.589 2,10 C2,14.411 5.589,18.0005 10,18.0005 C14.411,18.0005 18,14.411 18,10 C18,5.589 14.411,2 10,2 Z M2.8075,10 C2.8075,8.957 3.031,7.9675 3.4305,7.073 L6.861,16.473 C4.462,15.3075 2.8075,12.847 2.8075,10 Z M10,17.193 C9.294,17.193 8.6125,17.09 7.9685,16.9005 L10.1265,10.6295 L12.3375,16.6865 C12.352,16.7215 12.3695,16.7545 12.389,16.785 C11.641,17.049 10.838,17.193 10,17.193 Z M10.991,6.6275 C11.424,6.605 11.814,6.5595 11.814,6.5595 C12.2015,6.5135 12.156,5.944 11.768,5.9665 C11.768,5.9665 10.6035,6.058 9.851,6.058 C9.144,6.058 7.9565,5.9665 7.9565,5.9665 C7.569,5.9435 7.5235,6.536 7.911,6.5595 C7.911,6.5595 8.278,6.605 8.6655,6.6275 L9.786,9.6985 L8.212,14.419 L5.5935,6.6275 C6.027,6.605 6.4165,6.5595 6.4165,6.5595 C6.803,6.5135 6.7585,5.944 6.3705,5.9665 C6.3705,5.9665 5.2055,6.058 4.453,6.058 C4.318,6.058 4.159,6.055 3.99,6.049 C5.277,4.0965 7.4875,2.8075 10,2.8075 C11.8725,2.8075 13.5775,3.523 14.8575,4.696 C14.8265,4.6935 14.796,4.6895 14.764,4.6895 C14.0575,4.6895 13.556,5.305 13.556,5.9665 C13.556,6.5595 13.898,7.0605 14.2625,7.6535 C14.536,8.132 14.856,8.7475 14.856,9.6375 C14.856,10.2525 14.619,10.967 14.3085,11.9625 L13.5905,14.359 L10.991,6.6275 Z M16.3115,6.5495 C16.873,7.5745 17.1925,8.7495 17.1925,10 C17.1925,12.654 15.7545,14.97 13.6165,16.2175 L15.8135,9.8655 C16.2235,8.8395 16.3605,8.019 16.3605,7.29 C16.36,7.0245 16.343,6.779 16.3115,6.5495 Z'
},
'[yelp]': {
filename: 'yelp@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M11.496,12.419 C11.225,12.692 11.454,13.189 11.454,13.189 L13.493,16.594 C13.493,16.594 13.828,17.043 14.118,17.043 C14.41,17.043 14.698,16.804 14.698,16.804 L16.31,14.499 C16.31,14.499 16.473,14.208 16.476,13.953 C16.482,13.591 15.936,13.492 15.936,13.492 L12.119,12.266 C12.119,12.266 11.745,12.167 11.496,12.419 z M11.302,10.702 C11.498,11.033 12.036,10.937 12.036,10.937 L15.845,9.824 C15.845,9.824 16.364,9.612 16.439,9.332 C16.511,9.05 16.353,8.71 16.353,8.71 L14.533,6.567 C14.533,6.567 14.375,6.295 14.048,6.268 C13.687,6.237 13.465,6.674 13.465,6.674 L11.312,10.061 C11.312,10.06 11.122,10.398 11.302,10.702 z M9.503,9.382 C9.951,9.271 10.023,8.62 10.023,8.62 L9.992,3.197 C9.992,3.197 9.924,2.528 9.624,2.347 C9.153,2.061 9.013,2.211 8.878,2.23 L5.716,3.406 C5.716,3.406 5.406,3.508 5.245,3.766 C5.014,4.133 5.478,4.669 5.478,4.669 L8.765,9.149 C8.765,9.148 9.09,9.484 9.503,9.382 z M8.722,11.576 C8.733,11.158 8.22,10.907 8.22,10.907 L4.821,9.19 C4.821,9.19 4.318,8.982 4.073,9.127 C3.886,9.238 3.72,9.437 3.704,9.615 L3.482,12.34 C3.482,12.34 3.449,12.812 3.572,13.027 C3.745,13.331 4.315,13.12 4.315,13.12 L8.283,12.243 C8.437,12.138 8.707,12.129 8.722,11.576 z M9.709,13.047 C9.368,12.872 8.96,13.235 8.96,13.235 L6.303,16.159 C6.303,16.159 5.972,16.606 6.056,16.881 C6.135,17.138 6.267,17.266 6.453,17.356 L9.121,18.199 C9.121,18.199 9.445,18.266 9.69,18.195 C10.037,18.094 9.973,17.549 9.973,17.549 L10.033,13.589 C10.034,13.59 10.021,13.208 9.709,13.047 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M11.4955523,12.4188154 C11.2246493,12.6917251 11.4539135,13.1888823 11.4539135,13.1888823 L13.4932111,16.5942335 C13.4932111,16.5942335 13.8278265,17.0432302 14.1182948,17.0432302 C14.4097663,17.0432302 14.6977262,16.8039325 14.6977262,16.8039325 L16.3101008,14.4987486 C16.3101008,14.4987486 16.4726426,14.2082803 16.4761543,13.9534308 C16.4821744,13.5912235 15.9358533,13.4918924 15.9358533,13.4918924 L12.1186292,12.2663071 C12.1186292,12.2663071 11.7448834,12.1674776 11.4955523,12.4188154 Z M11.3024085,10.702093 C11.4980607,11.0331967 12.036355,10.9368756 12.036355,10.9368756 L15.8450506,9.82366495 C15.8450506,9.82366495 16.3642814,9.61246091 16.4385289,9.33152447 C16.5112714,9.04958469 16.3527429,8.71045426 16.3527429,8.71045426 L14.532676,6.56680873 C14.532676,6.56680873 14.3751509,6.29540408 14.047559,6.26831378 C13.6868566,6.23721008 13.4646158,6.6741666 13.4646158,6.6741666 L11.3124419,10.0609559 C11.3124419,10.0604543 11.1223081,10.397578 11.3024085,10.702093 Z M9.50291014,9.38169169 C9.95140514,9.27132382 10.0226426,8.61965156 10.0226426,8.61965156 L9.99204058,3.1970763 C9.99204058,3.1970763 9.92431484,2.52834721 9.62381314,2.34724352 C9.15274293,2.06129034 9.01277636,2.21078869 8.87782654,2.23035391 L5.71578641,3.40577195 C5.71578641,3.40577195 5.40575297,3.50811308 5.24471614,3.7664743 C5.01444862,4.13269504 5.47849545,4.66898265 5.47849545,4.66898265 L8.76545197,9.14891578 C8.76545197,9.14841413 9.09003388,9.48353117 9.50291014,9.38169169 Z M8.72230814,11.5760061 C8.73334493,11.1581131 8.22013423,10.9067753 8.22013423,10.9067753 L4.8213048,9.18955121 C4.8213048,9.18955121 4.31762588,8.98185891 4.0728098,9.12684221 C3.88568606,9.23771178 3.71963254,9.4373773 3.70357906,9.6149693 L3.48234158,12.3400529 C3.48234158,12.3400529 3.44923123,12.8121265 3.57163923,13.0268422 C3.74521784,13.3313573 4.31511749,13.1196516 4.31511749,13.1196516 L8.28284327,12.2427285 C8.43685662,12.1383806 8.70725797,12.1293506 8.72230814,11.5760061 Z M9.70859575,13.0469091 C9.36796032,12.8718255 8.9601008,13.2345345 8.9601008,13.2345345 L6.30324458,16.1592837 C6.30324458,16.1592837 5.97163923,16.6062736 6.05592019,16.8806883 C6.13518441,17.1380462 6.26662254,17.2664743 6.45274293,17.3562736 L9.12113758,18.1985813 C9.12113758,18.1985813 9.44471614,18.2658054 9.68953223,18.194568 C10.0371911,18.0942335 9.97297701,17.5494174 9.97297701,17.5494174 L10.0331777,13.5892168 C10.0336794,13.5897185 10.0206359,13.2079459 9.70859575,13.0469091 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M11.4955523,12.4188154 C11.2246493,12.6917251 11.4539135,13.1888823 11.4539135,13.1888823 L13.4932111,16.5942335 C13.4932111,16.5942335 13.8278265,17.0432302 14.1182948,17.0432302 C14.4097663,17.0432302 14.6977262,16.8039325 14.6977262,16.8039325 L16.3101008,14.4987486 C16.3101008,14.4987486 16.4726426,14.2082803 16.4761543,13.9534308 C16.4821744,13.5912235 15.9358533,13.4918924 15.9358533,13.4918924 L12.1186292,12.2663071 C12.1186292,12.2663071 11.7448834,12.1674776 11.4955523,12.4188154 Z M11.3024085,10.702093 C11.4980607,11.0331967 12.036355,10.9368756 12.036355,10.9368756 L15.8450506,9.82366495 C15.8450506,9.82366495 16.3642814,9.61246091 16.4385289,9.33152447 C16.5112714,9.04958469 16.3527429,8.71045426 16.3527429,8.71045426 L14.532676,6.56680873 C14.532676,6.56680873 14.3751509,6.29540408 14.047559,6.26831378 C13.6868566,6.23721008 13.4646158,6.6741666 13.4646158,6.6741666 L11.3124419,10.0609559 C11.3124419,10.0604543 11.1223081,10.397578 11.3024085,10.702093 Z M9.50291014,9.38169169 C9.95140514,9.27132382 10.0226426,8.61965156 10.0226426,8.61965156 L9.99204058,3.1970763 C9.99204058,3.1970763 9.92431484,2.52834721 9.62381314,2.34724352 C9.15274293,2.06129034 9.01277636,2.21078869 8.87782654,2.23035391 L5.71578641,3.40577195 C5.71578641,3.40577195 5.40575297,3.50811308 5.24471614,3.7664743 C5.01444862,4.13269504 5.47849545,4.66898265 5.47849545,4.66898265 L8.76545197,9.14891578 C8.76545197,9.14841413 9.09003388,9.48353117 9.50291014,9.38169169 Z M8.72230814,11.5760061 C8.73334493,11.1581131 8.22013423,10.9067753 8.22013423,10.9067753 L4.8213048,9.18955121 C4.8213048,9.18955121 4.31762588,8.98185891 4.0728098,9.12684221 C3.88568606,9.23771178 3.71963254,9.4373773 3.70357906,9.6149693 L3.48234158,12.3400529 C3.48234158,12.3400529 3.44923123,12.8121265 3.57163923,13.0268422 C3.74521784,13.3313573 4.31511749,13.1196516 4.31511749,13.1196516 L8.28284327,12.2427285 C8.43685662,12.1383806 8.70725797,12.1293506 8.72230814,11.5760061 Z M9.70859575,13.0469091 C9.36796032,12.8718255 8.9601008,13.2345345 8.9601008,13.2345345 L6.30324458,16.1592837 C6.30324458,16.1592837 5.97163923,16.6062736 6.05592019,16.8806883 C6.13518441,17.1380462 6.26662254,17.2664743 6.45274293,17.3562736 L9.12113758,18.1985813 C9.12113758,18.1985813 9.44471614,18.2658054 9.68953223,18.194568 C10.0371911,18.0942335 9.97297701,17.5494174 9.97297701,17.5494174 L10.0331777,13.5892168 C10.0336794,13.5897185 10.0206359,13.2079459 9.70859575,13.0469091 Z'
},
'[youtube]': {
filename: 'youtube@2x.png',
width: 20,
height: 20,
bgRectRadius: 3,
bgCircRadius: 10,
svgStdPath: 'M5.781,2.072 L6.722,2.072 L7.359,4.419 L7.969,2.072 L8.874,2.072 L7.798,5.628 L7.798,8.049 L6.903,8.049 L6.903,5.628 C6.821,5.199 6.642,4.571 6.355,3.737 C6.166,3.183 5.97,2.627 5.781,2.072 z M10.073,3.541 C10.477,3.541 10.792,3.693 11.015,3.997 C11.184,4.223 11.265,4.572 11.265,5.048 L11.265,6.606 C11.265,7.08 11.184,7.431 11.015,7.654 C10.792,7.957 10.477,8.11 10.073,8.11 C9.671,8.11 9.357,7.957 9.134,7.654 C8.962,7.431 8.881,7.08 8.881,6.606 L8.881,5.048 C8.881,4.571 8.962,4.223 9.134,3.997 C9.357,3.693 9.671,3.541 10.073,3.541 z M11.929,3.595 L12.734,3.595 L12.734,6.874 C12.734,7.063 12.734,7.161 12.744,7.188 C12.762,7.312 12.824,7.376 12.932,7.376 C13.094,7.376 13.264,7.251 13.443,6.999 L13.443,3.595 L14.249,3.595 L14.249,8.049 L13.443,8.049 L13.443,7.562 C13.121,7.931 12.814,8.11 12.52,8.11 C12.26,8.11 12.082,8.004 12.001,7.779 C11.957,7.644 11.929,7.431 11.929,7.116 L11.929,3.595 z M9.749,8.778 L10.054,8.778 L10.359,8.778 C11.909,8.778 13.465,8.789 15.002,8.961 C15.694,9.039 16.268,9.557 16.43,10.26 C16.66,11.261 16.659,12.352 16.659,13.382 L16.659,13.426 C16.659,14.444 16.654,15.52 16.427,16.506 C16.266,17.209 15.691,17.728 14.999,17.805 C13.46,17.977 11.903,17.987 10.351,17.987 C10.251,17.987 10.151,17.988 10.051,17.987 C9.951,17.988 9.851,17.987 9.751,17.987 C8.199,17.987 6.643,17.977 5.104,17.805 C4.412,17.728 3.837,17.209 3.675,16.506 C3.45,15.529 3.445,14.466 3.445,13.458 L3.445,13.382 C3.445,12.352 3.448,11.261 3.678,10.26 C3.839,9.557 4.414,9.039 5.106,8.961 C6.644,8.789 8.198,8.778 9.749,8.778 z M10.073,4.267 C9.812,4.267 9.688,4.473 9.688,4.885 L9.688,6.759 C9.688,7.171 9.812,7.376 10.073,7.376 C10.333,7.376 10.457,7.171 10.457,6.759 L10.457,4.885 C10.457,4.473 10.333,4.267 10.073,4.267 z M4.43,10.421 L4.43,11.254 L5.37,11.254 L5.37,16.336 L6.259,16.336 L6.259,11.254 L7.215,11.254 L7.215,10.421 L4.43,10.421 z M10.319,10.421 L10.319,16.336 L11.118,16.336 L11.118,15.909 C11.384,16.239 11.659,16.396 11.943,16.396 C12.26,16.396 12.473,16.229 12.58,15.901 C12.633,15.714 12.661,15.42 12.661,15.012 L12.661,13.259 C12.661,12.842 12.633,12.55 12.58,12.373 C12.473,12.042 12.26,11.875 11.943,11.875 C11.649,11.875 11.375,12.035 11.118,12.352 L11.118,10.421 L10.319,10.421 z M11.515,12.594 C11.745,12.594 11.863,12.797 11.863,13.195 L11.863,15.076 C11.863,15.474 11.745,15.67 11.515,15.67 C11.384,15.67 11.251,15.607 11.118,15.474 L11.118,12.788 C11.251,12.656 11.384,12.594 11.515,12.594 z M14.485,11.875 C14.077,11.875 13.76,12.026 13.529,12.328 C13.359,12.55 13.283,12.894 13.283,13.365 L13.283,14.909 C13.283,15.377 13.369,15.724 13.539,15.945 C13.77,16.246 14.087,16.396 14.505,16.396 C14.922,16.396 15.251,16.239 15.471,15.919 C15.569,15.778 15.631,15.617 15.658,15.44 C15.665,15.36 15.674,15.183 15.674,14.926 L15.674,14.809 L14.86,14.809 C14.86,15.129 14.85,15.306 14.842,15.35 C14.797,15.564 14.682,15.671 14.485,15.671 C14.211,15.671 14.078,15.467 14.078,15.059 L14.078,14.278 L15.674,14.278 L15.674,13.365 C15.674,12.894 15.595,12.55 15.427,12.328 C15.204,12.026 14.886,11.875 14.485,11.875 z M14.479,12.594 C14.743,12.594 14.876,12.797 14.876,13.205 L14.876,13.613 L14.078,13.613 L14.078,13.205 C14.078,12.797 14.212,12.594 14.479,12.594 z M7.331,11.929 L7.331,15.414 C7.331,15.725 7.358,15.935 7.401,16.069 C7.481,16.292 7.659,16.396 7.916,16.396 C8.21,16.396 8.511,16.219 8.829,15.855 L8.829,16.336 L9.627,16.336 L9.627,11.929 L8.829,11.929 L8.829,15.297 C8.651,15.548 8.484,15.67 8.324,15.67 C8.217,15.67 8.156,15.607 8.136,15.484 C8.129,15.457 8.129,15.361 8.129,15.174 L8.129,11.929 L7.331,11.929 z',
svgRectPath: 'M1.99079514,0 C0.891309342,0 0,0.898212381 0,1.99079514 L0,18.0092049 C0,19.1086907 0.898212381,20 1.99079514,20 L18.0092049,20 C19.1086907,20 20,19.1017876 20,18.0092049 L20,1.99079514 C20,0.891309342 19.1017876,0 18.0092049,0 L1.99079514,0 Z M5.78125,2.0725 L6.7225,2.0725 L7.35875,4.41875 L7.96875,2.0725 L8.87375,2.0725 L7.7975,5.6275 L7.7975,8.04875 L6.9025,8.04875 L6.9025,5.6275 C6.8213916,5.1989312 6.6419944,4.5710256 6.355,3.7375 C6.1662504,3.18303336 5.9698048,2.62682056 5.78125,2.0725 Z M10.0725,3.54125 C10.4768728,3.54125 10.791782,3.6929304 11.015,3.9975 C11.1841784,4.2225192 11.265,4.5715128 11.265,5.0475 L11.265,6.60625 C11.265,7.0795596 11.1841784,7.4309216 11.015,7.65375 C10.791782,7.9574432 10.4768728,8.11 10.0725,8.11 C9.6705616,8.11 9.356822,7.9574432 9.13375,7.65375 C8.9620888,7.4309216 8.88125,7.0795596 8.88125,6.60625 L8.88125,5.0475 C8.88125,4.571464 8.9620888,4.2225192 9.13375,3.9975 C9.3567732,3.6929304 9.6705128,3.54125 10.0725,3.54125 Z M11.92875,3.595 L12.73375,3.595 L12.73375,6.87375 C12.73375,7.0628404 12.7340132,7.1611132 12.74375,7.1875 C12.7615684,7.312424 12.8241772,7.37625 12.9325,7.37625 C13.09384,7.37625 13.2637308,7.2514708 13.4425,6.99875 L13.4425,3.595 L14.24875,3.595 L14.24875,8.04875 L13.4425,8.04875 L13.4425,7.5625 C13.1213292,7.9307 12.814346,8.11 12.52,8.11 C12.2602688,8.11 12.0817252,8.0043048 12.00125,7.77875 C11.9567036,7.643748 11.92875,7.4306052 11.92875,7.11625 L11.92875,3.595 Z M9.74875,8.7775 L10.05375,8.7775 L10.35875,8.7775 C11.909056,8.7775 13.4649004,8.7894916 15.0025,8.96125 C15.6942568,9.0385608 16.2684164,9.5572408 16.43,10.26 C16.6599852,11.260854 16.65875,12.3520948 16.65875,13.3825 L16.65875,13.42625 C16.6586528,14.4438512 16.6542232,15.5195144 16.4275,16.50625 C16.2658676,17.2089608 15.6905552,17.727738 14.99875,17.805 C13.459544,17.9770508 11.90326,17.9875 10.35125,17.9875 C10.2512524,17.9875 10.1512476,17.9875972 10.05125,17.9875 C9.9513984,17.9875972 9.8511992,17.9875 9.75125,17.9875 C8.1991912,17.9875 6.6430532,17.9770508 5.10375,17.805 C4.4119448,17.727738 3.8366322,17.2089608 3.675,16.50625 C3.45046756,15.5292028 3.44509736,14.466192 3.445,13.4575 L3.445,13.3825 C3.445,12.3520948 3.44751488,11.260854 3.6775,10.26 C3.8391322,9.5572408 4.4144448,9.0385608 5.10625,8.96125 C6.643752,8.7894428 8.1984928,8.7775 9.74875,8.7775 Z M10.0725,4.2675 C9.8123304,4.2675 9.6875,4.472984 9.6875,4.885 L9.6875,6.75875 C9.6875,7.1708636 9.8123304,7.37625 10.0725,7.37625 C10.3326696,7.37625 10.4575,7.1708636 10.4575,6.75875 L10.4575,4.885 C10.4575,4.472984 10.332718,4.2675 10.0725,4.2675 Z M4.43,10.42125 L4.43,11.25375 L5.37,11.25375 L5.37,16.33625 L6.25875,16.33625 L6.25875,11.25375 L7.215,11.25375 L7.215,10.42125 L4.43,10.42125 Z M10.31875,10.42125 L10.31875,16.33625 L11.1175,16.33625 L11.1175,15.90875 C11.3842904,16.2388788 11.6586212,16.39625 11.9425,16.39625 C12.2603604,16.39625 12.4728944,16.2288472 12.58,15.90125 C12.6328712,15.7143992 12.66125,15.420378 12.66125,15.0125 L12.66125,13.25875 C12.66125,12.8417196 12.63292,12.5498572 12.58,12.3725 C12.4728944,12.0424684 12.2603604,11.875 11.9425,11.875 C11.6488356,11.875 11.3753324,12.0351752 11.1175,12.3525 L11.1175,10.42125 L10.31875,10.42125 Z M11.515,12.59375 C11.745326,12.59375 11.8625,12.7968588 11.8625,13.195 L11.8625,15.07625 C11.8625,15.4743912 11.745326,15.67 11.515,15.67 C11.383698,15.67 11.2511388,15.6072428 11.1175,15.47375 L11.1175,12.7875 C11.2511388,12.65576 11.3837468,12.59375 11.515,12.59375 Z M14.485,11.875 C14.0774628,11.875 13.7597088,12.0258516 13.52875,12.3275 C13.3591824,12.5503772 13.2825,12.8940272 13.2825,13.365 L13.2825,14.90875 C13.2825,15.3770452 13.369036,15.7244596 13.53875,15.945 C13.76966,16.2460644 14.087288,16.39625 14.505,16.39625 C14.9220304,16.39625 15.2505148,16.238704 15.47125,15.91875 C15.5685216,15.7775164 15.6308696,15.6173572 15.6575,15.44 C15.6649972,15.3603524 15.67375,15.1831088 15.67375,14.92625 L15.67375,14.80875 L14.86,14.80875 C14.86,15.1290448 14.849754,15.306476 14.8425,15.35 C14.7968828,15.563676 14.6818796,15.67125 14.485,15.67125 C14.2106636,15.67125 14.0775,15.466628 14.0775,15.05875 L14.0775,14.2775 L15.67375,14.2775 L15.67375,13.365 C15.67375,12.8940272 15.5947308,12.5503772 15.4275,12.3275 C15.203844,12.0258516 14.885624,11.875 14.485,11.875 Z M14.47875,12.59375 C14.7431064,12.59375 14.8762988,12.7973656 14.87625,13.205 L14.87625,13.6125 L14.0775,13.6125 L14.0775,13.205 C14.0775,12.7974144 14.2116672,12.59375 14.47875,12.59375 Z M7.33125,11.92875 L7.33125,15.41375 C7.33125,15.7247948 7.3577748,15.9352572 7.40125,16.06875 C7.4811412,16.2918708 7.6590016,16.39625 7.91625,16.39625 C8.2098168,16.39625 8.5113276,16.2191108 8.82875,15.855 L8.82875,16.33625 L9.6275,16.33625 L9.6275,11.92875 L8.82875,11.92875 L8.82875,15.2975 C8.65149,15.5476404 8.4840192,15.67 8.32375,15.67 C8.2170336,15.67 8.1556752,15.6074572 8.13625,15.48375 C8.12885,15.4573632 8.12875,15.3608928 8.12875,15.17375 L8.12875,11.92875 L7.33125,11.92875 Z',
svgCircPath: 'M10,0 C4.4771525,0 0,4.47593818 0,10 C0,15.5228475 4.47593818,20 10,20 C15.5228475,20 20,15.5240618 20,10 C20,4.4771525 15.5240618,0 10,0 Z M6.38392857,3.0634375 L7.19071429,3.0634375 L7.73607143,5.11640625 L8.25892857,3.0634375 L9.03464286,3.0634375 L8.11214286,6.1740625 L8.11214286,8.29265625 L7.345,8.29265625 L7.345,6.1740625 C7.27547851,5.7990648 7.12170949,5.2496474 6.87571429,4.5203125 C6.71392891,4.03515419 6.54554697,3.54846799 6.38392857,3.0634375 Z M10.0621429,4.34859375 C10.4087481,4.34859375 10.6786703,4.4813141 10.87,4.7478125 C11.0150101,4.9447043 11.0842857,5.2500737 11.0842857,5.6665625 L11.0842857,7.03046875 C11.0842857,7.44461465 11.0150101,7.7520564 10.87,7.94703125 C10.6786703,8.2127628 10.4087481,8.34625 10.0621429,8.34625 C9.71762423,8.34625 9.44870457,8.2127628 9.2575,7.94703125 C9.11036183,7.7520564 9.04107143,7.44461465 9.04107143,7.03046875 L9.04107143,5.6665625 C9.04107143,5.250031 9.11036183,4.9447043 9.2575,4.7478125 C9.44866274,4.4813141 9.7175824,4.34859375 10.0621429,4.34859375 Z M11.6532143,4.395625 L12.3432143,4.395625 L12.3432143,7.26453125 C12.3432143,7.42998535 12.3434399,7.51597405 12.3517857,7.5390625 C12.3670586,7.648371 12.4207233,7.70421875 12.5135714,7.70421875 C12.6518629,7.70421875 12.7974835,7.59503695 12.9507143,7.37390625 L12.9507143,4.395625 L13.6417857,4.395625 L13.6417857,8.29265625 L12.9507143,8.29265625 L12.9507143,7.8671875 C12.675425,8.1893625 12.4122966,8.34625 12.16,8.34625 C11.9373733,8.34625 11.7843359,8.2537667 11.7153571,8.05640625 C11.6771745,7.9382795 11.6532143,7.75177955 11.6532143,7.47671875 L11.6532143,4.395625 Z M9.78464286,8.9303125 L10.0460714,8.9303125 L10.3075,8.9303125 C11.6363337,8.9303125 12.9699146,8.94080515 14.2878571,9.09109375 C14.8807915,9.1587407 15.3729283,9.6125857 15.5114286,10.2275 C15.7085587,11.1032473 15.7075,12.058083 15.7075,12.9596875 L15.7075,12.9979688 C15.7074167,13.8883698 15.7036199,14.8295751 15.5092857,15.6929688 C15.3707437,16.3078407 14.8776187,16.7617708 14.2846429,16.829375 C12.9653234,16.9799195 11.6313657,16.9890625 10.3010714,16.9890625 C10.2153592,16.9890625 10.1296408,16.9891476 10.0439286,16.9890625 C9.95834149,16.9891476 9.87245646,16.9890625 9.78678571,16.9890625 C8.4564496,16.9890625 7.12261703,16.9799195 5.80321429,16.829375 C5.2102384,16.7617708 4.71711331,16.3078407 4.57857143,15.6929688 C4.38611505,14.8380525 4.38151202,13.907918 4.38142857,13.0253125 L4.38142857,12.9596875 C4.38142857,12.058083 4.38358418,11.1032473 4.58071429,10.2275 C4.71925617,9.6125857 5.21238126,9.1587407 5.80535714,9.09109375 C7.123216,8.94076245 8.45585097,8.9303125 9.78464286,8.9303125 Z M10.0725,4.9840625 C9.8123304,4.9840625 9.6875,5.163861 9.6875,5.524375 L9.6875,7.16390625 C9.6875,7.52450565 9.8123304,7.70421875 10.0725,7.70421875 C10.3326696,7.70421875 10.4575,7.52450565 10.4575,7.16390625 L10.4575,5.524375 C10.4575,5.163861 10.332718,4.9840625 10.0725,4.9840625 Z M5.22571429,10.3685938 L5.22571429,11.0970313 L6.03142857,11.0970313 L6.03142857,15.5442188 L6.79321429,15.5442188 L6.79321429,11.0970313 L7.61285714,11.0970313 L7.61285714,10.3685938 L5.22571429,10.3685938 Z M10.2732143,10.3685938 L10.2732143,15.5442188 L10.9578571,15.5442188 L10.9578571,15.1701563 C11.1865346,15.459019 11.4216753,15.5967188 11.665,15.5967188 C11.9374518,15.5967188 12.1196238,15.4502413 12.2114286,15.1635938 C12.2567467,15.0000993 12.2810714,14.7428308 12.2810714,14.3859375 L12.2810714,12.8514063 C12.2810714,12.4865047 12.2567886,12.2311251 12.2114286,12.0759375 C12.1196238,11.7871599 11.9374518,11.640625 11.665,11.640625 C11.4132877,11.640625 11.1788563,11.7807783 10.9578571,12.0584375 L10.9578571,10.3685938 L10.2732143,10.3685938 Z M11.2985714,12.2695313 C11.4959937,12.2695313 11.5964286,12.4472515 11.5964286,12.795625 L11.5964286,14.4417188 C11.5964286,14.7900923 11.4959937,14.96125 11.2985714,14.96125 C11.1860269,14.96125 11.0724047,14.9063375 10.9578571,14.7895313 L10.9578571,12.4390625 C11.0724047,12.32379 11.1860687,12.2695313 11.2985714,12.2695313 Z M13.8442857,11.640625 C13.4949681,11.640625 13.2226075,11.7726202 13.0246429,12.0365625 C12.8792992,12.2315801 12.8135714,12.5322738 12.8135714,12.944375 L12.8135714,14.2951563 C12.8135714,14.7049146 12.8877451,15.0089022 13.0332143,15.201875 C13.2311371,15.4653064 13.5033897,15.5967188 13.8614286,15.5967188 C14.2188832,15.5967188 14.5004413,15.458866 14.6896429,15.1789063 C14.7730185,15.0553269 14.8264597,14.9151876 14.8492857,14.76 C14.8557119,14.6903084 14.8632143,14.5352202 14.8632143,14.3104688 L14.8632143,14.2076563 L14.1657143,14.2076563 C14.1657143,14.4879142 14.156932,14.6431665 14.1507143,14.68125 C14.1116138,14.8682165 14.0130397,14.9623438 13.8442857,14.9623438 C13.6091402,14.9623438 13.495,14.7832995 13.495,14.4264063 L13.495,13.7428125 L14.8632143,13.7428125 L14.8632143,12.944375 C14.8632143,12.5322738 14.7954835,12.2315801 14.6521429,12.0365625 C14.4604377,11.7726202 14.1876777,11.640625 13.8442857,11.640625 Z M13.8389286,12.2695313 C14.0655198,12.2695313 14.1796847,12.4476949 14.1796429,12.804375 L14.1796429,13.1609375 L13.495,13.1609375 L13.495,12.804375 C13.495,12.4477376 13.6100005,12.2695313 13.8389286,12.2695313 Z M7.7125,11.6876563 L7.7125,14.7370313 C7.7125,15.0091955 7.73523554,15.1933501 7.7725,15.3101563 C7.84097817,15.505387 7.99342994,15.5967188 8.21392857,15.5967188 C8.46555726,15.5967188 8.72399509,15.441722 8.99607143,15.123125 L8.99607143,15.5442188 L9.68071429,15.5442188 L9.68071429,11.6876563 L8.99607143,11.6876563 L8.99607143,14.6353125 C8.84413429,14.8541854 8.70058789,14.96125 8.56321429,14.96125 C8.47174309,14.96125 8.41915017,14.9065251 8.4025,14.7982813 C8.39615714,14.7751928 8.39607143,14.6907812 8.39607143,14.5270313 L8.39607143,11.6876563 L7.7125,11.6876563 Z'
}
};
function Accordion(vars) {
vars = vars || {};
var self = new Sprite(vars),
children = [],
tile;
self.identity = 'menu'
self.element.setAttribute('data-identity', 'menu')
self.gap = vars.gap || 1;
self.axis = vars.axis || 'y';
self.align = vars.align || 'left';
self.wrap = vars.wrap || false;
self.perpLength = vars.perpLength || self.width;
self.expand = 'auto'; /*auto, single, all*/
self.toggle = vars.toggle || true;
self.updateSpeed = vars.updateSpeed || 0.35;
self.animate = vars.animate || true;
self.addEventListener(SELECT_ACCORDION_ITEM, self.select);
self.addItem = function(container, title, content, isOpen) {
if(self.expand === 'all') {
isOpen = true;
}
var item = {container:container, title:title, content:content, isOpen:isOpen||false, hasSubs:container.hasSubs||false};
if(self.axis === 'x' && LAYOUT_MODEL.dropdownSubMenu) {
// dropdown SubMenu behavior
if(isPod() || isPad()){
title.addEventListener('click', function() {
self.animate = true
self.updateSpeed = 0.25
self.openItem(item)
});
if(content) {
content.addEventListener('click', function() {
self.closeItem(item)
});
}
} else {
title.addEventListener('mouseover', function() {
self.animate = true
self.updateSpeed = 0.25
self.openItem(item)
});
title.addEventListener('mouseout', function() {
self.animate = true
self.updateSpeed = 0.25
self.closeItem(item)
});
if(content) {
content.addEventListener('mouseover', function() {
self.openItem(item)
});
content.addEventListener('mouseout', function() {
self.closeItem(item)
});
}
}
} else {
title.addEventListener(CLICK, self.select);
}
children.push(item);
title.accordionItem = item;
self.addChild(container);
};
self.select = function(e) {
var i = children.length;
while(i--) {
if(children[i] === this.accordionItem) {
if(self.axis === 'y' || !(self.axis === 'x' && LAYOUT_MODEL.dropdownSubMenu)) {
if(self.toggle) {
toggleItem(this.accordionItem);
} else if(!this.accordionItem.isOpen) {
self.openItem(this.accordionItem);
}
self.dispatchEvent(ACCORDION_SELECT, this.accordionItem);
}
} else if(self.expand === 'single') {
self.closeItem(children[i]);
}
}
self.layout(UPDATE_SPEED);
};
function toggleItem(item) {
if(item.isOpen) {
self.closeItem(item);
} else {
self.openItem(item);
}
}
self.closeItem = function(item) {
if(self.expand !== 'all') {
item.isOpen = false;
if(item.content) {
item.content.overflow = 'hidden';
Tween(item.content, self.animate ? self.updateSpeed : 0, {height:0});
item.container.height = item.title.element.offsetHeight;
}
}
};
self.openItem = function(item) {
item.isOpen = true;
if(item.content) {
Tween(item.content, self.animate ? self.updateSpeed : 0, {height:item.contentHeight,onComplete:function(){
if(!(LAYOUT_MODEL.dropdownSubMenu && /top|bottom/.test(STATE.menuView.placement()))) item.content.overflow = 'visible';
}});
item.container.height = item.title.element.offsetHeight + item.contentHeight;
}
};
function updateTile() {
tile = new Tile();
tile.gap = self.gap;
tile.axis = self.axis;
tile.align = self.align;
tile.wrap = self.wrap;
tile.perpLength = 0;
}
self.layout = function(speed) {
self.updateSpeed = speed || 0
updateTile();
var i
var openSub
var length = children.length
var gapComp = -self.gap // remove gap from first item (hack)
var maxBounds = {width:0, height:0}
tile.perpLength = 0;
for(i = 0; i < length; i++) {
var child = children[i]
if(!child.contentHeight) {
child.contentHeight = child.content ? child.content.height : 0;
child.contentWidth = child.content ? child.content.width : 0;
}
if(child.content && !child.isOpen) {
child.content.height = 0;
child.content.overflow = 'hidden';
}
var width = child.title.element.offsetWidth || child.title.width;
var height = child.title.element.offsetHeight || child.title.height;
if(child.isOpen && !(self.axis === 'x' && LAYOUT_MODEL.dropdownSubMenu)) {
height += child.contentHeight;
}
if(child.content && child.isOpen) openSub = child;
child.container.width = width;
child.container.height = height;
if(self.axis === 'x') {
tile.perpLength = height > tile.perpLength ? height : tile.perpLength;
} else {
tile.perpLength = width > tile.perpLength ? width : tile.perpLength;
}
tile.addItem(width, height);
}
tile.layoutItems();
var gapX = self.axis === 'x' ? self.gap + gapComp : 0,
gapY = self.axis === 'x' ? 0 : self.gap + gapComp;
var bounds = tile.getBounds();
var boundsWidth = self.axis === 'x' ? bounds.width - self.gap : tile.perpLength;
var boundsHeight = bounds.height + (self.axis === 'x' ? 0 : self.gap + gapComp)
for(i = 0; i < length; i++) {
var position = tile.getPosition(i);
children[i].container.x = position.x + gapX;
Tween(children[i].container, self.updateSpeed, {y:position.y + gapY});
/*
* to calculate the new boundsWidth for horizontal submenus
*/
if(self.axis === 'x' && children[i].isOpen && children[i].hasSubs && USER_AGENT !== MOBILE && USER_AGENT !== TABLET) {
function boundsWithSubs(mw, sx, sw) {
return mw + (sx < 0 ? -sx : 0) + (sw + sx - mw < 0 ? 0 : sw + sx - mw)
}
var menuX = LAYOUT_MODEL.menuTextAlignHorizontal === 'right' ? 0 : layoutCalcs.menuText.x(boundsWidth)
var boundsAndSubs = /*menuX +*/ boundsWithSubs(boundsWidth, children[i].container.x + children[i].content.x, children[i].content.width)
if(boundsAndSubs > layoutCalcs.menuView.width()) {
boundsWidth = boundsAndSubs
}
}
}
self.width = boundsWidth;
self.height = boundsHeight;
self.dispatchEvent(ACCORDION_SIZE_CHANGE, {width:boundsWidth, height:boundsHeight});
};
return self;
}
function Align(obj, duration, vars) {
var align = new AlignEngine({hRange:vars.hRange, vRange:vars.vRange, hAlign:vars.hAlign, vAlign:vars.vAlign, width:vars.width || obj.width, height:vars.height || obj.height, hOffset:vars.hOffset, vOffset:vars.vOffset});
var hOrigin = vars.hOrigin || 0;
var vOrigin = vars.vOrigin || 0;
var tweenVars = {
x:Math.round(align.x + hOrigin),
y:Math.round(align.y + vOrigin),
onComplete:vars.onComplete,
onCompleteParams:vars.onCompleteParams,
onCompleteScope:vars.onCompleteScope,
onUpdate:vars.onUpdate,
onUpdateParams:vars.onUpdateParams,
onUpdateScope:vars.onUpdateScope,
onInit:vars.onInit,
onInitScope:vars.onInitScope,
onInitParams:vars.onInitParams
}
Tween(obj, duration, tweenVars);
return tweenVars
}
function AlignEngine(vars) {
vars = vars || {};
var _x,
_y,
_hRange = vars.hRange || 0,
_vRange = vars.vRange || 0,
_width = vars.width || 0,
_height = vars.height || 0,
_hAlign = vars.hAlign || 'left',
_vAlign = vars.vAlign || 'top',
_hOffset = vars.hOffset || 0,
_vOffset = vars.vOffset || 0;
return {
set hRange(value) {
_hRange = value;
},
set vRange(value) {
_vRange = value;
},
set width(value) {
_width = value;
},
set height(value) {
_height = value;
},
set hAlign(value) {
_hAlign = value;
},
set vAlign(value) {
_vAlign = value;
},
set hOffset(value) {
_hOffset = value;
},
set vOffset(value) {
_vOffset = value;
},
get x() {
if(_hAlign === 'center') {
return ((_hRange - _width) * 0.5) + _hOffset;
} else if(_hAlign === 'right') {
return _hRange - _width - _hOffset;
}
return _hOffset;
},
get y() {
if(_vAlign === 'center' || _vAlign === 'middle') {
return ((_vRange - _height) * 0.5) + _vOffset;
} else if(_vAlign === 'bottom') {
return (_vRange - _height) - _vOffset;
}
return _vOffset;
}
};
}
function Cursor(vars) { // eslint-disable-line
var self = new Sprite({events:new EventSandbox()})
self.setClass('no-invert')
self.position = 'fixed'
var svg
var iconLeft
var iconCenter
var iconRight
var visible
var cursorIcon = buildSvgData()
var axis = 'x'
var thumbs = false
var cursorUpdateTimer
var hasListeners = false
function buildSvgData() {
return {
left: {
'arrow1':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.arrow1Left,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'arrow2':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.arrow2Left,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'arrow3':{
fill:'none',
d:svgPaths.arrow3Left,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:1.5
},
'plus1':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.plus1Left,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'plus2':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.plus2Left,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'none':{
fill:'none',
d:'',
stroke:'none',
strokeWidth:0
},
'disabled':{
fill:'none',
d:'',
stroke:'none',
strokeWidth:0
}
},
right: {
'arrow1':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.arrow1Right,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'arrow2':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.arrow2Right,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'arrow3':{
fill:'none',
d:svgPaths.arrow3Right,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:1.5
},
'plus1':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.plus1Right,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'plus2':{
fill:LAYOUT_MODEL.cursorColor,
d:svgPaths.plus2Right,
stroke:LAYOUT_MODEL.cursorColor,
strokeWidth:0
},
'none':{
fill:'none',
d:'',
stroke:'none',
strokeWidth:0
},
'disabled':{
fill:'none',
d:'',
stroke:'none',
strokeWidth:0
}
}
}
}
self.enabled = true
self.zIndex = 999
self.alpha = 0
self.display = 'none'
self.addEventListener('cursorAxisUpdate', cursorAxisUpdate)
self.addEventListener('cursorThumbsUpdate', cursorThumbsUpdate)
self.addEventListener('cursorBlendMode', updateBlendMode)
function updateBlendMode() {
var blendMode = (USER_AGENT === MOBILE || USER_AGENT === TABLET || !LAYOUT_MODEL.cursorIconBlendMode) ? 'normal' : LAYOUT_MODEL.cursorIconBlendMode
self.element.style['mix-blend-mode'] = blendMode
}
function cursorAxisUpdate(e) {
axis = e || 'x'
}
function cursorThumbsUpdate(e) {
if(/none|disabled/.test(LAYOUT_MODEL.navCursorType)) {
thumbs = false
} else {
thumbs = e
}
}
function getPageX(e) {
if(TOUCH_DEVICE && e.touches) {
return e.touches[0].pageX
} else {
return e.clientX
}
}
function getPageY(e) {
if(TOUCH_DEVICE && e.touches) {
return e.touches[0].pageY
} else {
return e.clientY
}
}
function init() {
svg = new Svg()
svg.left = -20
svg.top = -20
svg.width = 40
svg.height = 40
self.addChild(svg)
svg.element.style['pointer-events'] = 'none'
self.svg = svg
iconLeft = new Path()
iconLeft.id = 'icon'
svg.addChild(iconLeft)
iconLeft.element.style['pointer-events'] = 'none'
self.iconLeft = iconLeft
iconCenter = new Path()
iconCenter.id = 'icon'
svg.addChild(iconCenter)
iconCenter.element.style['pointer-events'] = 'none'
self.iconCenter = iconCenter
self.iconCenter.d = svgPaths.cursorThumbs
iconRight = new Path()
iconRight.id = 'icon'
svg.addChild(iconRight)
iconRight.element.style['pointer-events'] = 'none'
self.iconRight = iconRight
setSvgPaths()
stage.addEventListener(MOUSE_MOVE, cursorMouseMove)
self.listenerAdded = true
}
self.destroy = function() {
stage.removeEventListener(MOUSE_MOVE, cursorMouseMove)
self.removeEventListener('cursorAxisUpdate', cursorAxisUpdate)
self.removeEventListener('cursorThumbsUpdate', cursorThumbsUpdate)
self.removeEventListener('cursorBlendMode', updateBlendMode)
self.iconLeft.cursor = 'default'
self.iconCenter.cursor = 'default'
self.iconRight.cursor = 'default'
self.svg.cursor = 'default'
self.cursor = 'default'
if(hasListeners) {
stage.element.removeEventListener(CLICK, click)
stage.element.removeEventListener('contextmenu', disable)
stage.element.removeEventListener('dragstart', disable)
hasListeners = false
}
self.text = ""
}
function setSvgPaths() {
var blendMode = (USER_AGENT === MOBILE || USER_AGENT === TABLET || !LAYOUT_MODEL.cursorIconBlendMode) ? 'normal' : LAYOUT_MODEL.cursorIconBlendMode
self.cursorIconStyle = LAYOUT_MODEL.cursorIconStyle || 'arrow2'
var leftStyle = cursorIcon.left[self.cursorIconStyle]
var rightStyle = cursorIcon.right[self.cursorIconStyle]
self.element.style['mix-blend-mode'] = blendMode
self.navCursorType = LAYOUT_MODEL.navCursorType
self.iconLeft.d = leftStyle.d
self.iconLeft.fill = leftStyle.fill
self.iconLeft.stroke = leftStyle.stroke
self.iconLeft.strokeWidth = leftStyle.strokeWidth
self.iconCenter.fill = LAYOUT_MODEL.cursorColor
self.iconRight.d = rightStyle.d
self.iconRight.fill = rightStyle.fill
self.iconRight.stroke = rightStyle.stroke
self.iconRight.strokeWidth = rightStyle.strokeWidth
}
function cursorMouseMove(e) {
// if(LAYOUT_MODEL.cursorIconStyle === 'none') {
// if(visible || visible === undefined) noShow(e)
// } else {
if(!self.enabled) {
noShow(e)
} else if(e.target !== svg.element && e.target !== iconLeft.element && e.target !== iconCenter.element && e.target !== iconRight.element) {
var x = getPageX(e)
var y = getPageY(e)
var maskX = STATE.mediaView.x()
var maskY = STATE.mediaView.y()
var maskWidth = STATE.mediaView.width()
var maskHeight = STATE.mediaView.height()
// maskY += stage.scrollY
// maskX += stage.scrollX
self.transition = 0
self.translateX = x - 2
self.translateY = y - 2
if(e.target.navigationCursor && self.enabled) {
if(!visible) show(e)
} else if(visible) {
hide(e)
}
var zoneWidth = thumbs ? maskWidth * 0.333 : maskWidth * 0.5
var zoneHeight = thumbs ? maskHeight * 0.333 : maskHeight * 0.5
var zone = axis === 'x' ? zoneWidth : zoneHeight
var local = axis === 'x' ? x - maskX : y - maskY
var zone1 = zone
var zone2 = zone * 2
if((LAYOUT_MODEL.cursorColor !== cursorIcon.left.arrow1.fill) || (LAYOUT_MODEL.cursorIconStyle !== self.cursorIconStyle) && (LAYOUT_MODEL.navCursorType !== self.navCursorType)) {
cursorIcon = buildSvgData()
setSvgPaths()
}
if(local < zone1) {
self.iconLeft.alpha = 1
self.iconCenter.alpha = 0
self.iconRight.alpha = 0
self.svg.rotate = axis === 'y' && /arrow/.test(self.cursorIconStyle) ? 90 : 0
self.type = 'prev'
} else if(thumbs && local > zone1 && local < zone2) {
self.iconLeft.alpha = 0
self.iconCenter.alpha = 1
self.iconRight.alpha = 0
self.svg.rotate = 0
self.type = 'thumbs'
} else if(!thumbs || local > zone2) {
self.iconLeft.alpha = 0
self.iconCenter.alpha = 0
self.iconRight.alpha = 1
self.svg.rotate = axis === 'y' && /arrow/.test(self.cursorIconStyle) ? 90 : 0
self.type = 'next'
}
}
clearTimeout(cursorUpdateTimer)
cursorUpdateTimer = setTimeout(function() {
noShow(e)
}, 5000)
// }
}
function click(e) {
if(e.target.navigationCursor && self.enabled) {
self.alpha = 0
visible = false
if(self.type === 'thumbs') {
vars.events.dispatchEvent(NAVBAR_OVERLAY_BTN_CLICK, self.type)
} else {
vars.events.dispatchEvent(NAVBAR_NAV_CLICK, {navDir:self.type})
}
}
}
function show(e) {
if(LAYOUT_MODEL.navCursorType === 'cursor') {
visible = true
self.display = 'block'
self.alpha = 0.85
if(!/none/.test(LAYOUT_MODEL.cursorIconStyle)) {
e.target.style.cursor = 'none'
self.iconLeft.cursor = 'none'
self.iconCenter.cursor = 'none'
self.iconRight.cursor = 'none'
self.svg.cursor = 'none'
self.cursor = 'none'
}
if(!hasListeners) {
stage.element.addEventListener(CLICK, click)
stage.element.addEventListener('contextmenu', disable)
stage.element.addEventListener('dragstart', disable)
hasListeners = true
}
} else {
self.display = 'none'
}
}
function hide() {
if(visible) {
visible = false
self.alpha = 0
self.display = 'none'
}
if(hasListeners) {
stage.element.removeEventListener(CLICK, click)
stage.element.removeEventListener('contextmenu', disable)
stage.element.removeEventListener('dragstart', disable)
hasListeners = false
}
}
function noShow(e) {
visible = false
self.alpha = 0
self.display = 'none'
if(e && e.target && e.target.style) e.target.style.cursor = 'default'
self.iconLeft.cursor = 'default'
self.iconCenter.cursor = 'default'
self.iconRight.cursor = 'default'
self.svg.cursor = 'default'
self.cursor = 'default'
if(LAYOUT_MODEL.navCursorType === 'disabled') {
self.display = 'none'
} else if(!hasListeners) {
stage.element.addEventListener(CLICK, click)
stage.element.addEventListener('contextmenu', disable)
stage.element.addEventListener('dragstart', disable)
hasListeners = true
}
}
function disable(e) {
var disableRightClick = SETTINGS_MODEL.disableRightClick === undefined || SETTINGS_MODEL.disableRightClick
if(disableRightClick) {
e.preventDefault()
}
}
init.call(self)
return self
}
function StaticNav(vars) {
var self = new Sprite()
var inst = self
self.element.className = 'staticnav'
self.axis = vars.axis || 'x'
self.zone = vars.zone
self.zIndex = vars.zIndex
var prev = new Sprite()
var prevSvg = new Svg()
var prevG = new Svg({type: 'g'})
var prevPath = new Path()
var next = new Sprite()
var nextSvg = new Svg()
var nextG = new Svg({type: 'g'})
var nextPath = new Path()
prev.zIndex = vars.zIndex
prev.position = 'absolute'
prev.cursor = 'pointer'
prev.width = 100 * vars.scale
prev.height = 100 * vars.scale
prevSvg.width = 100 * vars.scale
prevSvg.height = 100 * vars.scale
prev.addEventListener('click', function() {
vars.prevClick(inst)
})
prevPath.d = vars.paths.prev.d
prevPath.fill = vars.paths.prev.fill
prevPath.stroke = vars.paths.prev.stroke
prevPath.strokeWidth = vars.paths.prev.strokeWidth
prevSvg.addChild(prevG)
prevG.addChild(prevPath)
prev.addChild(prevSvg)
next.zIndex = vars.zIndex
next.position = 'absolute'
next.cursor = 'pointer'
next.width = 100 * vars.scale
next.height = 100 * vars.scale
nextSvg.width = 100 * vars.scale
nextSvg.height = 100 * vars.scale
next.addEventListener('click', function() {
vars.nextClick(inst)
})
nextPath.d = vars.paths.next.d
nextPath.fill = vars.paths.next.fill
nextPath.stroke = vars.paths.next.stroke
nextPath.strokeWidth = vars.paths.next.strokeWidth
nextSvg.addChild(nextG)
nextG.addChild(nextPath)
next.addChild(nextSvg)
self.addChild(prev)
self.addChild(next)
var blendMode = (USER_AGENT === MOBILE || USER_AGENT === TABLET || !LAYOUT_MODEL.cursorIconBlendMode) ? 'normal' : LAYOUT_MODEL.cursorIconBlendMode
prev.element.style['mix-blend-mode'] = blendMode
next.element.style['mix-blend-mode'] = blendMode
self.nextClick = function() {
if(typeof vars.nextClick === 'function') {
vars.nextClick(inst)
}
}
self.prevClick = function() {
if(typeof vars.prevClick === 'function') {
vars.prevClick(inst)
}
}
self.updateAxis = function(axis) {
self.axis = axis
prev.element.style.transformOrigin = 'center'
next.element.style.transformOrigin = 'center'
if(self.axis === 'y') {
// rotate cursors 90
prev.position = 'fixed'
next.position = 'fixed'
prev.element.style.transform = 'rotate(90deg)'
next.element.style.transform = 'rotate(90deg)'
} else {
// rotate cursors 0
prev.position = 'absolute'
next.position = 'absolute'
prev.element.style.transform = 'rotate(0deg)'
next.element.style.transform = 'rotate(0deg)'
}
self.resize(self.zone)
}
self.resize = function(zone) {
self.zone = zone
var prevPos
var nextPos
if(self.axis === 'y') {
// for all vertically transitioning galleries
// this value aligns both button's x axis anchor point
switch(vars.align) {
case 'start':
prevPos = {x:zone.x, y:zone.y}
nextPos = {x:zone.x, y:zone.y + zone.height - next.height}
break
case 'end':
prevPos = {x:zone.x + zone.width - prev.width, y:zone.y}
nextPos = {x:zone.x + zone.width - next.width, y:zone.y + zone.height - next.height}
break
default:
// center
prevPos = {x:zone.x + ((zone.width - prev.width) / 2), y:zone.y}
nextPos = {x:zone.x + ((zone.width - next.width) / 2), y:zone.y + zone.height - next.height}
break
}
} else {
// for all horizontally transitioning galleries + fade & grid
// this value aligns both button's y axis anchor point
switch(vars.align) {
case 'start':
prevPos = {x:zone.x, y:zone.y}
nextPos = {x:zone.x + zone.width - next.width, y:zone.y}
break
case 'end':
prevPos = {x:zone.x , y:zone.y + zone.height - prev.height}
nextPos = {x:zone.x + zone.width - next.width , y:zone.y + zone.height - next.height}
break
default:
// center
prevPos = {x:zone.x, y:zone.y + (zone.height - prev.height) / 2}
nextPos = {x:zone.x + zone.width - next.width, y: zone.y + ((zone.height - next.height) / 2)}
break
}
}
prev.x = prevPos.x + vars.offset.prevX
prev.y = prevPos.y + vars.offset.prevY
next.x = nextPos.x + vars.offset.nextX
next.y = nextPos.y + vars.offset.nextY
prevG.scale = vars.scale
nextG.scale = vars.scale
}
self.hide = function(button) {
switch(button) {
case 'prev':
prev.display = 'none'
break
case 'next':
next.display = 'none'
break
default:
prev.display = 'none'
next.display = 'none'
break
}
}
self.show = function(button) {
switch(button) {
case 'prev':
prev.display = 'block'
break
case 'next':
next.display = 'block'
break
default:
prev.display = 'block'
next.display = 'block'
}
}
self.resize(vars.zone)
self.updateAxis(vars.axis)
return self
}
function Tooltip(vars) {
var v = vars || {},
self = this,
container = new Sprite(),
box = new Sprite(),
arw = new Sprite(),
txt = new Sprite(),
alpha = 0,
color = v.backgroundColor || 'rgba(0,0,0,0.7)',
arwColor = color,
fontColor = v.fontColor || '#FFFFFF',
fontFamily = v.fontFamily || 'Helvetica Neue, Arial, sans-serif',
fontSize = v.fontSize|| 11,
corRadius = v.cornerRadius || 4,
border = v.border || 'none',
gap = v.gap || 12,
padding = v.padding || 4,
shadow = v.shadow || true,
xPerc = 0,
yAxis = 80,
tipOffset = 0,
containerAboveOffset = 0,
containerBelowOffset = 0,
delay = vars.delay || 350,
delayTimer,
debug = false;
self.isShowing = false;
if(debug) {
arwColor = '#000000';
arw.backgroundColor = '#FFFFFF';
txt.fontColor = '#000000';
txt.backgroundColor = '#000000';
container.backgroundColor = '#000000';
}
txt.x = padding;
txt.y = padding;
txt.width = vars.width || 100;
txt.textAlign = 'center';
txt.fontColor = fontColor;
txt.fontFamily = 'Helvetica Neue';
txt.fontSize = fontSize;
/*txt.wordWrap = 'break-word';*/
box.x = gap;
box.y = gap;
box.borderRadius = corRadius;
box.border = border;
box.backgroundColor = color;
if(shadow) {
box.element.style.boxShadow = '0px 1px 3px rgba(0,0,0, 0.5)';
}
container.alpha = alpha;
container.overflow = 'hidden';
arw.w = 8;
arw.point = arw.w * 0.5;
arw.h = 6;
arw.borderRight = arw.point + 'px solid transparent';
arw.borderLeft = arw.point + 'px solid transparent';
box.addChild(txt);
container.addChild(box);
container.addChild(arw);
function update(e) {
txt.text = e.target.tooltip;
txt.alpha = 1;
box.width = txt.element.offsetWidth + (padding * 2);
box.height = txt.element.offsetHeight + (padding * 2);
container.width = box.width + (gap * 2);
container.height = box.height + (gap * 2);
containerAboveOffset = tipOffset + container.height + (gap * 0.5);
containerBelowOffset = tipOffset + gap;
}
function setXPos(e) {
xPerc = e.pageX / window.innerWidth;
var tipX = Math.round(container.width * xPerc);
if((tipX - arw.point - corRadius) < gap) {
arw.x = corRadius + gap;
container.x = e.pageX - (gap + arw.point + corRadius);
} else if((tipX + gap + arw.point + corRadius) > container.width) {
arw.x = (container.width - (gap + arw.width + corRadius));
container.x = (e.pageX - container.width) + gap + arw.point + corRadius;
} else {
arw.x = tipX - (gap - arw.width);
container.x = e.pageX - tipX;
}
}
function setYPos(e) {
if(e.pageY < yAxis) {
arw.borderTop = arw.h + 'px solid transparent';
arw.borderBottom = arw.h + 'px solid ' + arwColor;
container.y = e.pageY + containerBelowOffset;
arw.y = box.y - arw.height;
} else {
arw.borderBottom = arw.h + 'px solid transparent';
arw.borderTop = arw.h + 'px solid ' + arwColor;
container.y = e.pageY - containerAboveOffset;
arw.y = box.height + gap;
}
}
function move(e) {
container.transition = 0;
setXPos(e);
setYPos(e);
}
self.show = function(e) {
if(e.target.tooltip) {
container.transition = 0;
e.target.addEventListener(MOUSE_MOVE, move);
e.target.addEventListener(MOUSE_OUT, hide);
container.zIndex = 1000;
delayTimer = setTimeout(function() {
Tween(container, 0.35, {alpha: 1});
}, delay);
update(e);
self.isShowing = true;
}
};
function hide(e) {
if(delayTimer) clearTimeout(delayTimer);
e.target.removeEventListener(MOUSE_MOVE, move);
e.target.removeEventListener(MOUSE_OUT, hide);
container.transition = 0;
container.alpha = 0;
container.width = 0;
container.height = 0;
container.zIndex = 0;
self.isShowing = false;
}
self.hide = hide
stage.addChild(container);
}
var Docks = {
arr: [],
register: function(dock) {
this.arr.push(dock);
},
unRegister: function(dock) {
var i = this.arr.length;
while(i--) {
if(dock === this.arr[i]) {
this.arr.splice(i, 1);
}
}
},
resize: function() {
if(this.arr.length > 0) {
var i = this.arr.length;
while(i--) {
this.arr[i].resize();
}
}
}
};
function Dock(obj, mask, vars) {
var self = this;
self.side = vars.side || 'left';
self.align = vars.align || 'center';
self.margin = vars.margin || 0;
self.pOffset = vars.pOffset || 0;
self.reveal = vars.reveal || 0;
self.updateSpeed = vars.updateSpeed || 0;
self.disableResize = vars.disableResize
var axis = self.side === 'top' || self.side === 'bottom' ? 'y' : 'x',
pAxis = axis === 'x' ? 'y' : 'x',
dim = axis === 'x' ? 'width' : 'height',
pDim = axis === 'x' ? 'height' : 'width';
self.show = function(updateSpeed, animation) {
updateSpeed = !isNaN(updateSpeed) ? updateSpeed : UPDATE_SPEED;
var tweenVars = {};
tweenVars['translate' + axis.toUpperCase()] = showAxis();
if(typeof animation === 'function') {
setTimeout(function() {
animation(obj)
}, updateSpeed * 1000)
} else {
if(updateSpeed === 0) {
obj.transition = 0
obj['translate' + axis.toUpperCase()] = showAxis();
} else {
Tween(obj, updateSpeed, tweenVars);
}
}
toggle.state = true;
};
self.hide = function(updateSpeed, animation) {
updateSpeed = !isNaN(updateSpeed) ? updateSpeed : UPDATE_SPEED;
var tweenVars = {};
tweenVars['translate' + axis.toUpperCase()] = hideAxis();
if(typeof animation === 'function') {
setTimeout(function() {
animation(obj)
}, updateSpeed * 1000)
} else {
if(updateSpeed === 0) {
obj.transition = 0
obj['translate' + axis.toUpperCase()] = hideAxis();
} else {
Tween(obj, updateSpeed, tweenVars);
}
}
toggle.state = false;
};
self.toggle = function() {
toggle.flip();
};
self.toggleState = function() {
return toggle.state;
};
self.resize = function(updateSpeed) {
if(self.disableResize) {
// this is for the menu 'overlay' mode to prevent resize issues
// set everything to 0
obj.transition = 0
obj.translateX = 0
obj.translateY = 0
} else {
axis = self.side === 'top' || self.side === 'bottom' ? 'y' : 'x',
pAxis = axis === 'x' ? 'y' : 'x',
dim = axis === 'x' ? 'width' : 'height',
pDim = axis === 'x' ? 'height' : 'width';
updateSpeed = !isNaN(updateSpeed) ? updateSpeed : UPDATE_SPEED;
var tweenVars = {};
tweenVars['translate' + axis.toUpperCase()] = toggle.state ? Math.round(showAxis()) : Math.round(hideAxis());
tweenVars['translate' + pAxis.toUpperCase()] = Math.round(perpAxis());
if(updateSpeed === 0) {
obj.transition = 0
obj['translate' + axis.toUpperCase()] = toggle.state ? Math.round(showAxis()) : Math.round(hideAxis());
obj['translate' + pAxis.toUpperCase()] = Math.round(perpAxis());
} else {
Tween(obj, updateSpeed, tweenVars);
}
}
};
function showAxis() {
if(self.side === 'left' || self.side === 'top') {
return self.margin;
}
return mask[dim] - obj._private[dim] - self.margin;
}
function hideAxis() {
if(self.disableResize) return showAxis()
if(self.side === 'left' || self.side === 'top') {
return - obj._private[dim] + self.reveal;
}
return mask[dim] - self.reveal;
}
function perpAxis() {
switch(self.align) {
case 'top':
case 'left':
return self.pOffset;
case 'right':
case 'bottom':
return mask[pDim] - obj._private[pDim] - self.pOffset;
}
return ((mask[pDim] - obj._private[pDim]) * 0.5) + self.pOffset;
}
var toggle = new Toggle({
target: this,
on: this.show,
off: this.hide
});
toggle.state = true;
Docks.register(this);
self.resize(0);
}
function Drag(vars) {
var _dragZone = vars.dragZone || false,
_dragElements = vars.dragElements || false,
_events = new EventSandbox(),
_threshold = vars.threshold || 20,
_thresholdMet = false;
var self = {
listeners: _events.listeners,
dispatchEvent: _events.dispatchEvent,
addEventListener: _events.addEventListener,
removeEventListener: _events.removeEventListener,
set dragZone(value) {
_dragZone = value;
if(_dragElements) {
self.item = vars.item;
_dragZone.addEventListener(MOUSE_DOWN, dragStart);
_dragZone.addEventListener(TOUCH_START, dragStart);
} else {
throw 'you must define the dragElement before the dragZone';
}
},
get dragZone() {
return _dragZone;
},
set dragElements(value) {
_dragElements = value;
},
get dragElements() {
return _dragElements;
},
set threshold(value) {
_threshold = value;
},
get threshold() {
return _thresholdMet;
}
};
if(_dragElements) {
_dragZone.addEventListener(MOUSE_DOWN, dragStart);
_dragZone.addEventListener(TOUCH_START, dragStart);
} else {
throw 'you must define a dragElement';
}
function dragStart(e) {
e.preventDefault()
stage.dragElements = _dragElements;
var i = stage.dragElements.length;
while(i--) {
stage.dragElements[i].transition = 0;
stage.dragElements[i].cancel = false;
stage.dragElements[i].startX = stage.dragElements[i].x;
stage.dragElements[i].startY = stage.dragElements[i].y;
stage.dragElements[i].mouseOffsetX = stage.dragElements[i].parent.globalToLocal({x:getX(e), y:getY(e)}).x - stage.dragElements[i].x;
stage.dragElements[i].mouseOffsetY = stage.dragElements[i].parent.globalToLocal({x:getX(e), y:getY(e)}).y - stage.dragElements[i].y;
}
stage.addEventListener(MOUSE_UP, dragStop);
stage.addEventListener(TOUCH_END, dragStop);
stage.addEventListener(MOUSE_MOVE, dragMove);
stage.addEventListener(TOUCH_MOVE, dragMove);
stage.addEventListener(TOUCH_CANCEL, dragCancel);
stage.addEventListener(KEY_DOWN, escapeCheck);
self.dispatchEvent(DRAG_START, e);
}
function dragMove(e) {
var i = stage.dragElements.length;
while(i--) {
stage.dragElements[i].dragging = true;
if(!stage.dragElements[i].cancel) {
stage.dragElements[i].alpha = 0.98;
stage.dragElements[i].x = stage.dragElements[i].parent.globalToLocal({x:getX(e), y:getY(e)}).x - stage.dragElements[i].mouseOffsetX;
stage.dragElements[i].y = stage.dragElements[i].parent.globalToLocal({x:getX(e), y:getY(e)}).y - stage.dragElements[i].mouseOffsetY;
stage.dragElements[i].deltaX = stage.dragElements[i].x - stage.dragElements[i].startX;
stage.dragElements[i].deltaY = stage.dragElements[i].y - stage.dragElements[i].startY;
_thresholdMet = (Mth.abs(stage.dragElements[i].deltaX) > _threshold || Mth.abs(stage.dragElements[i].deltaY) > _threshold);
}
}
self.dispatchEvent(DRAG_MOVE, e);
}
function dragStop(e) {
stage.removeEventListener(MOUSE_MOVE, dragMove);
stage.removeEventListener(TOUCH_MOVE, dragMove);
stage.removeEventListener(MOUSE_UP, dragStop);
stage.removeEventListener(TOUCH_END, dragStop);
stage.removeEventListener(TOUCH_CANCEL, dragCancel);
stage.removeEventListener(KEY_DOWN, escapeCheck);
var i = stage.dragElements.length;
while(i--) {
stage.dragElements[i].dragging = false;
stage.dragElements[i].alpha = 1;
}
self.dispatchEvent(DRAG_STOP, e);
}
function escapeCheck(e) {
if(keyCode[e.keyCode] === ESCAPE) {
dragCancel(e);
}
}
function dragCancel(e) {
stage.removeEventListener(MOUSE_MOVE, dragMove);
stage.removeEventListener(TOUCH_MOVE, dragMove);
stage.removeEventListener(MOUSE_UP, dragStop);
stage.removeEventListener(TOUCH_END, dragStop);
stage.removeEventListener(TOUCH_CANCEL, dragCancel);
stage.removeEventListener(KEY_DOWN, escapeCheck);
var i = stage.dragElements.length;
while(i--) {
stage.dragElements[i].dragging = false;
stage.dragElements[i].alpha = 1;
}
self.dispatchEvent(DRAG_CANCEL, e);
}
return self;
}
function LazyLoader(obj, mask, vars) {
// tweening 'translateX' causes strange behavior in Safari
vars = vars || {};
var self = this
var index = 0
var isWithinBounds = {
fade: function(child, i) {
return i >= index - 1 && i <= index + 1;
},
default: function(child) {
return child.isInViewport
}
};
function loadProcessor() {
var i = 0
var children = vars.targetChildren || obj.children
var l = children.length
for(; i < l; i++) {
var child = children[i]
var inBounds = isWithinBounds[vars.type || 'default'](child, i)
if(inBounds && !child.loaded) {
child.load()
} else if(!inBounds && child.loaded) {
child.unload()
}
}
}
this.update = function update(value) {
// push to the bottom of the stack because the getBoundingClientRect of Sprite
// is happening too instantaneously for gallery transitions
setTimeout(function() {
if(value) index = value;
loadProcessor();
}, 0)
};
}
var Overlay = (function() {
function Overlay(content, vars) {
var self = this;
var background = new Sprite()
var parentView = vars.parentView || stage
background.position = 'fixed'
background.top = 0
background.left = 0
background.alpha = 0;
background.zIndex = vars.zIndex || 500;
background.display = 'none';
background.backgroundColor = toRgba(vars.backgroundColor || parentView.backgroundColor, vars.alpha || 0.85);
this.parentView = parentView;
this.background = background;
this.content = content;
this.onClose = vars.onClose;
this.onOpen = vars.onOpen;
this.openDuration = vars.openDuration || UPDATE_SPEED;
this.closeDuration = vars.closeDuration || UPDATE_SPEED;
this.userOverride = vars.userOverride;
this.blurLayers = vars.blurLayers;
this.updateSpeed = 0;
parentView.addEventListener(RESIZE, this.overlayResize.bind(this));
this.background.width = this.parentView.width;
this.background.height = this.parentView.height;
parentView.addChild(background);
background.addChild(content);
if(this.userOverride) {
background.element.addEventListener(CLICK, function(e) {
if(self.background.element === e.target) self.close.apply(self, [e]);
});
stage.addEventListener(KEY_DOWN, this.keyDown.bind(this));
}
}
Overlay.prototype = {
open:function() {
this.background.display = 'block';
if(this.onOpen) this.onOpen();
Tween(this.background, this.openDuration, {alpha:1});
},
overlayResize:function() {
this.background.width = this.parentView.width;
this.background.height = this.parentView.height;
Align(this.content, this.updateSpeed, {
hRange:this.parentView.width,
vRange:this.parentView.height,
hAlign:'center',
vAlign:'center'
});
this.updateSpeed = UPDATE_SPEED;
},
keyDown:function(e) {
if(e.keyCode === keyName.ESCAPE) this.close();
},
close:function(e) {
var self = this
Tween(self.background, self.closeDuration, {alpha:0, onComplete:function() {
self.background.display = 'none';
if(self.onClose) self.onClose();
}})
},
// onComplete:function() {
// this.background.display = 'none';
// if(this.onClose) this.onClose();
// },
destroy:function(){
this.background.removeChild(this.content);
this.parentView.removeChild(this.background);
this.parentView.removeEventListener(RESIZE, this.overlayResize.bind(this));
if(this.userOverride) {
this.background.removeEventListener(CLICK, this.close.bind(this));
stage.removeEventListener(KEY_DOWN, this.keyDown.bind(this));
}
}
};
return Overlay;
})();
function alert(message, vars) {
vars = vars || {};
var container = new Sprite();
container.backgroundColor = vars.backgroundColor || theme.bgColorLight;
container.width = 250;
container.height = 150;
container.borderRadius = 4;
container.overflow = 'hidden';
container.boxShadow = theme.shadowDark;
container.addEventListener(CLICK, function(e){
e.stopPropagation();
});
var textField = new Sprite();
textField.x = 25;
textField.y = 20;
textField.fontColor = vars.fontColor || theme.fontColor;
textField.fontFamily = 'Helvetica Neue, Arial, sans-serif';
textField.fontSize = 15.5;
textField.selectable = true;
textField.text = message;
textField.textAlign = 'center';
var okay = new Sprite({type:'button'});
okay.width = 65;
okay.height = 40;
okay.text = 'OK';
okay.outline = 'none';
okay.border = 'none';
okay.fontWeight = 'bold';
okay.fontSize = theme.fontSize;
okay.fontColor = theme.fontColor;
okay.fontFamily = 'Helvetica Neue, Arial, sans-serif';
okay.backgroundColor = theme.bgColor;
container.addChild(okay);
container.addChild(textField);
var blurLayers = [];
if(dx && exists(dx, 'site.siteView')) {
blurLayers = [exists(dx, 'site.siteView')];
}
if(dx && exists(dx, 'admin.adminView')) {
blurLayers = [dx.site.siteView, dx.admin.adminView];
}
var overlay = new Overlay(container, {userOverride:vars.userOverride||true, backgroundColor:vars.backgroundColor||'#000000', alpha:vars.alpha||0.5, blurLayers:vars.blurLayers||blurLayers});
overlay.open();
okay.addEventListener(MOUSE_OVER, over);
okay.addEventListener(MOUSE_OUT, out);
okay.addEventListener(FOCUS, over);
okay.addEventListener(BLUR, out);
function over(e) {
Tween(this, 0.2, {backgroundColor:theme.bgColorLighter, fontColor:theme.fontColorSelected});
}
function out(e) {
Tween(this, 0.2, {backgroundColor:theme.bgColor, fontColor:theme.fontColor});
}
okay.addEventListener(CLICK, function(e){
if(vars.onClose) vars.onClose();
overlay.close();
});
var okayHeight = okay.element.offsetHeight
var textFieldWidth = textField.element.offsetWidth
container.width = textFieldWidth + 50;
textField.width = container.width - 50;
container.height = textField.element.offsetHeight + okayHeight + 50;
okay.width = container.width;
okay.y = container.height - okayHeight - 0;
overlay.overlayResize();
okay.focus();
return overlay;
}
function confirm(message, vars) {
vars = vars || {};
var okClicked
var container = new Sprite();
container.backgroundColor = vars.backgroundColor || theme.bgColorLight;
container.width = vars.width || 250;
container.height = 150;
container.borderRadius = 5;
container.overflow = 'hidden';
container.boxShadow = theme.shadowDark;
container.addEventListener(CLICK, function(e){
e.stopPropagation();
});
var textField = new Sprite();
textField.x = 25;
textField.y = 23;
textField.fontColor = vars.fontColor || theme.fontColor;
textField.fontFamily = 'Helvetica Neue, Arial, sans-serif';
textField.fontSize = 15.5;
textField.selectable = true;
textField.text = message;
textField.textAlign = 'center';
var cancel = new Sprite({type:'button'});
cancel.width = 65;
cancel.height = 40;
cancel.text = vars.cancelLabel || 'CANCEL';
cancel.outline = 'none';
cancel.border = 'none';
cancel.fontWeight = 'bold';
cancel.fontSize = theme.fontSize;
cancel.fontColor = theme.fontColor;
cancel.fontFamily = 'Helvetica Neue, Arial, sans-serif';
cancel.backgroundColor = theme.bgColor;
container.addChild(cancel);
var okay = new Sprite({type:'button'});
okay.width = 65;
okay.height = 40;
okay.text = vars.okLabel || 'OK';
okay.outline = 'none';
okay.border = 'none';
okay.fontWeight = 'bold';
okay.fontSize = theme.fontSize;
okay.fontColor = theme.fontColor;
okay.fontFamily = 'Helvetica Neue, Arial, sans-serif';
okay.backgroundColor = theme.bgColor;
container.addChild(okay);
container.addChild(textField);
var blurLayers = [dx.site.siteView];
if(dx && exists(dx, 'admin.adminView')) {
blurLayers = [dx.site.siteView, dx.admin.adminView];
}
var overlay = new Overlay(container, {
userOverride:true,
backgroundColor:'#000000',
alpha:0.5,
blurLayers:blurLayers,
onClose:function() {
if(vars.onCancel && !okClicked) vars.onCancel();
}
});
overlay.open();
cancel.addEventListener(MOUSE_OVER, over);
cancel.addEventListener(MOUSE_OUT, out);
okay.addEventListener(MOUSE_OVER, over);
okay.addEventListener(MOUSE_OUT, out);
cancel.addEventListener(FOCUS, focus);
cancel.addEventListener(BLUR, blur);
okay.addEventListener(FOCUS, focus);
okay.addEventListener(BLUR, blur);
function focus(e) {
Tween(this, 0.2, {backgroundColor:theme.bgColorLighter, fontColor:theme.fontColorSelected});
}
function blur(e) {
out.call(this);
}
function over(e) {
if(stage.activeFocus) {
out.call(stage.activeFocus);
stage.activeFocus.blur();
}
Tween(this, 0.2, {backgroundColor:theme.bgColorLighter, fontColor:theme.fontColorSelected});
}
function out(e) {
Tween(this, 0.2, {backgroundColor:theme.bgColor, fontColor:theme.fontColor});
}
cancel.addEventListener(CLICK, function(e){
if(vars.onCancel) vars.onCancel();
overlay.close();
});
okay.addEventListener(CLICK, function(e){
okClicked = true
if(vars.onConfirm) vars.onConfirm();
overlay.close();
});
var okayHeight = okay.element.offsetHeight
var textFieldWidth = textField.element.offsetWidth
container.width = textFieldWidth + 50;
textField.width = container.width - 50;
container.height = textField.element.offsetHeight + cancel.element.offsetHeight + okayHeight + 50;
cancel.width = container.width;
cancel.y = container.height - cancel.height - okayHeight;
okay.width = container.width;
okay.y = container.height - okayHeight - 0;
overlay.overlayResize();
okay.focus();
return overlay;
}
function lightboxDownloadOverlay(vars) {
var self = new Sprite({events:vars.events})
self.display = 'flex'
self.element.style.alignItems = 'center'
self.element.style.padding = "0px 10px"
var width = (stage.width * 0.9) > 530 ? 530 : (stage.width * 0.9)
var height = 78
var background
var pdfBtn
var zipBtn
var copyLinkBtn
var overlay
var overlayColorSet = !!(LAYOUT_MODEL.inputOverlayFontColor && LAYOUT_MODEL.inputOverlayBarColor)
var menuColorSet = !!(LAYOUT_MODEL.menuOverlayFontColor && LAYOUT_MODEL.menuOverlayBgColor)
var textColor
var inputBarColor
if(overlayColorSet) {
textColor = LAYOUT_MODEL.inputOverlayFontColor
inputBarColor = LAYOUT_MODEL.inputOverlayBarColor
} else if(menuColorSet) {
textColor = LAYOUT_MODEL.menuOverlayFontColor
inputBarColor = LAYOUT_MODEL.menuOverlayBgColor
} else {
textColor = '#000000'
inputBarColor = '#FFFFFF'
}
var inputOverlayBgColor = LAYOUT_MODEL.inputOverlayBgColor || LAYOUT_MODEL.menuOverlayBgColor || '#000000'
var inputOverlayBgAlpha = LAYOUT_MODEL.inputOverlayBgAlpha || LAYOUT_MODEL.menuOverlayBgAlpha || 0.5
var isOpen
self.updateSpeed = 0
self.addEventListener(CHILD_ADDED, function(child) {
})
function build() {
self.width = width
self.height = height
// background = new Sprite()
self.backgroundColor = inputBarColor
self.boxShadow = "0px 2px 10px rgba(0,0,0,0.05)"
self.borderRadius = 2
self.display = 'flex'
// background.width = width
// background.height = height
// self.addChild(background)
copyLinkBtn = new Button()
copyLinkBtn.textTransform = 'uppercase'
copyLinkBtn.text = 'share ↑'
copyLinkBtn.position = 'relative'
copyLinkBtn.element.style.padding = '0 20px'
copyLinkBtn.element.style.margin = '0 10px'
copyLinkBtn.height = 38
copyLinkBtn.fontFamily = LAYOUT_MODEL.menuFont
copyLinkBtn.fontSize = 16
copyLinkBtn.fontColor = textColor
copyLinkBtn.element.style.flexGrow = 1
copyLinkBtn.backgroundColor = 'transparent'
// copyLinkBtn.width = 100
copyLinkBtn.addEventListener(CLICK, function() {
// copyLinkBtn.text = 'link copied'
alert('The lightbox link was copied to your clipboard.')
copyToClipboard(window.location.href)
})
copyLinkBtn.addEventListener(MOUSE_OVER, function() {
this.style.textDecoration = 'underline'
// Tween(this, UPDATE_SPEED, {alpha:1})
})
copyLinkBtn.addEventListener(MOUSE_OUT, function() {
this.style.textDecoration = 'none'
// Tween(this, UPDATE_SPEED, {alpha:0.5})
})
copyLinkBtn.style.cursor = 'pointer'
self.addChild(copyLinkBtn)
if(/pdf/.test(LAYOUT_MODEL.lightboxDownloadOptions)) {
pdfBtn = new Button()
pdfBtn.textTransform = 'uppercase'
pdfBtn.text = 'pdf ↓'
pdfBtn.position = 'relative'
// pdfBtn.x = inputField.x + inputField.width + 10
// pdfBtn.y = inputField.y
pdfBtn.element.style.padding = '0 20px'
pdfBtn.element.style.margin = '0 10px'
pdfBtn.height = 38
pdfBtn.fontFamily = LAYOUT_MODEL.menuFont
pdfBtn.fontSize = 16
pdfBtn.fontColor = textColor
pdfBtn.element.style.flexGrow = 1
// pdfBtn.width = 100
pdfBtn.backgroundColor = 'transparent'
pdfBtn.addEventListener(CLICK, function() {
// pdfBtn.text = 'downloading'
alert('Please wait, it may take a few minutes while we build your PDF file.')
self.events.dispatchEvent('lightboxDownloadPdf')
// pdfBtn.removeEventListener(CLICK, arguments.callee)
})
pdfBtn.addEventListener(MOUSE_OVER, function() {
this.style.textDecoration = 'underline'
// Tween(this, UPDATE_SPEED, {alpha:1})
})
pdfBtn.addEventListener(MOUSE_OUT, function() {
this.style.textDecoration = 'none'
// Tween(this, UPDATE_SPEED, {alpha:0.5})
})
pdfBtn.style.cursor = 'pointer'
self.addChild(pdfBtn)
}
if(/zip/.test(LAYOUT_MODEL.lightboxDownloadOptions)) {
zipBtn = new Button()
zipBtn.textTransform = 'uppercase'
zipBtn.text = 'zip ↓'
zipBtn.position = 'relative'
// zipBtn.x = inputField.x + inputField.width + 10
// zipBtn.y = inputField.y
zipBtn.element.style.padding = '0 20px'
zipBtn.element.style.margin = '0 10px'
zipBtn.height = 38
zipBtn.fontFamily = LAYOUT_MODEL.menuFont
zipBtn.fontSize = 16
zipBtn.fontColor = textColor
zipBtn.element.style.flexGrow = 1
// zipBtn.width = 100
zipBtn.backgroundColor = 'transparent'
zipBtn.addEventListener(CLICK, function() {
// zipBtn.text = 'downloading'
alert('Please wait, it may take a few minutes while we build your ZIP file.')
self.events.dispatchEvent('lightboxDownloadZip')
// zipBtn.removeEventListener(CLICK, arguments.callee)
})
zipBtn.addEventListener(MOUSE_OVER, function() {
this.style.textDecoration = 'underline'
// Tween(this, UPDATE_SPEED, {alpha:1})
})
zipBtn.addEventListener(MOUSE_OUT, function() {
this.style.textDecoration = 'none'
// Tween(this, UPDATE_SPEED, {alpha:0.5})
})
zipBtn.style.cursor = 'pointer'
self.addChild(zipBtn)
}
var blurLayers = dx && exists(dx, 'admin.adminView') ? [dx.site.siteView, dx.admin.adminView] : [dx.site.siteView]
overlay = new Overlay(self, {userOverride:true, backgroundColor:inputOverlayBgColor, alpha:inputOverlayBgAlpha, blurLayers:blurLayers, zIndex:99})
overlay.zIndex = 99
self.open()
overlay.onClose = function() {
isOpen = false
}
self.overlay = overlay
overlay.overlayResize()
isOpen = true
}
self.updatePosition = function(e) {
width = (stage.width * 0.9) > 800 ? 800 : (stage.width * 0.9)
// pdfBtn.x = width - pdfBtn.width - 32
pdfBtn.x = width - ((height - pdfBtn.width) * 0.5)
// background.width = width
// Tween(self, self.updateSpeed, {
// width:width,
// x:layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - width) * 0.5),
// y:layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - height) * 0.5
// })
self.width = width
self.x = layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - width) * 0.5)
self.y = layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - height) * 0.5
// Tween(self, self.updateSpeed, {
// width:width,
// x:layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - width) * 0.5),
// y:layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - height) * 0.5
// })
self.updateSpeed = UPDATE_SPEED
}
self.close = function () {
isOpen = false
// pdfBtn.removeEventListener(CLICK, onPdfDownload)
overlay.close()
}
self.open = function(section) {
if(section) vars.section = section
overlay.open()
setTimeout(function() {
// pdfBtn.addEventListener(CLICK, onPdfDownload)
}, 100)
isOpen = true
}
build()
return self
}
function passwordInput(vars) {
var self = new Sprite({events:vars.events})
var passWidth = (stage.width * 0.9) > 800 ? 800 : (stage.width * 0.9)
var passHeight = 78
var inputField
var password
var background
var submit
var overlay
var overlayColorSet = !!(LAYOUT_MODEL.inputOverlayFontColor && LAYOUT_MODEL.inputOverlayBarColor)
var menuColorSet = !!(LAYOUT_MODEL.menuOverlayFontColor && LAYOUT_MODEL.menuOverlayBgColor)
var textColor
var inputBarColor
if(overlayColorSet) {
textColor = LAYOUT_MODEL.inputOverlayFontColor
inputBarColor = LAYOUT_MODEL.inputOverlayBarColor
} else if(menuColorSet) {
textColor = LAYOUT_MODEL.menuOverlayFontColor
inputBarColor = LAYOUT_MODEL.menuOverlayBgColor
} else {
textColor = '#000000'
inputBarColor = '#FFFFFF'
}
var inputOverlayBgColor = LAYOUT_MODEL.inputOverlayBgColor || LAYOUT_MODEL.menuOverlayBgColor || '#000000'
var inputOverlayBgAlpha = LAYOUT_MODEL.inputOverlayBgAlpha || LAYOUT_MODEL.menuOverlayBgAlpha || 0.5
var isOpen
self.updateSpeed = 0
self.addEventListener(CHILD_ADDED, function(child) {
})
function build() {
self.width = passWidth
self.height = passHeight
background = new Sprite()
background.backgroundColor = inputBarColor
background.boxShadow = "0px 2px 10px rgba(0,0,0,0.05)"
background.borderRadius = 2
background.width = passWidth
background.height = passHeight
inputField = new Input()
inputField.backgroundColor = 'transparent'
inputField.fontFamily = LAYOUT_MODEL.menuFont
inputField.fontColor = textColor
inputField.fontSize = 16
// inputField.width = 170
inputField.height = passHeight
inputField.x = 0
inputField.y = 0
inputField.element.style.padding = '0px 46px'
// inputField.textTransform = LAYOUT_MODEL.menuTextTransform
inputField.addEventListener(FOCUS, onInputFieldFocus)
inputField.addEventListener(BLUR, onInputFieldBlur)
inputField.element.addEventListener(CLICK, function(e){e.stopPropagation();})
inputField.element.tabIndex = 1
self.setMessage('PASSWORD')
// submit = new Button()
// submit.text = 'SUBMIT'
// submit.x = inputField.x + inputField.width + 10
// submit.y = inputField.y
// submit.height = 23
// submit.width = 70
// submit.fontSize = USER_AGENT === MOBILE ? 16 : 14
// submit.fontFamily = LAYOUT_MODEL.contactFont
// submit.fontColor = LAYOUT_MODEL.contactFontColor
// submit.backgroundColor = LAYOUT_MODEL.contactFieldRectColor
//
submit = new Svg()
var _path = new Path()
// _path.d = svgPaths.search
// _path.fill = LAYOUT_MODEL.menuOverlayFontColor || '#FFFFFF'
// _path.fillRule = 'evenodd'
_path.d = svgPaths.arrowRight
_path.strokeWidth = 3
_path.fill = 'none'
_path.stroke = textColor
submit.addChild(_path)
submit.width = 11
submit.height = 15
submit.x = passWidth - ((passHeight - submit.width) * 0.5)
submit.y = (passHeight - submit.height) * 0.5
submit.alpha = 0.5
submit.cursor = 'pointer'
submit.addEventListener(MOUSE_OVER, function() {
Tween(this, UPDATE_SPEED, {alpha:1})
})
submit.addEventListener(MOUSE_OUT, function() {
Tween(this, UPDATE_SPEED, {alpha:0.5})
})
inputField.width = passWidth - passHeight - 96 // 92 = 46 * 2 which is the padding on the inputField
self.addChild(background)
self.addChild(inputField)
self.addChild(submit)
var blurLayers = dx && exists(dx, 'admin.adminView') ? [dx.site.siteView, dx.admin.adminView] : [dx.site.siteView]
overlay = new Overlay(self, {userOverride:true, backgroundColor:inputOverlayBgColor, alpha:inputOverlayBgAlpha, blurLayers:blurLayers, zIndex:99})
overlay.zIndex = 99
self.open()
overlay.onClose = function() {
isOpen = false
inputField.removeEventListener(KEY_UP, onKeyUp)
submit.removeEventListener(CLICK, onSubmit)
}
self.overlay = overlay
overlay.overlayResize()
isOpen = true
}
function onKeyUp(e) {
if(isOpen) {
if(e.keyCode === 13) {
onSubmit(e)
}
}
}
function onSubmit(e) {
self.events.dispatchEvent('SITE_SERVICE_PASSWORD_CHECK', {sectionKey: vars.section.key, value: inputField.value})
}
function onInputFieldBlur(e) {
stage.isInputFocus = false
if(inputField.value === "") {
self.setMessage('PASSWORD')
}
}
function onInputFieldFocus(e) {
stage.isInputFocus = true
inputField.value = ""
}
self.updatePosition = function(e) {
passWidth = (stage.width * 0.9) > 800 ? 800 : (stage.width * 0.9)
// submit.x = passWidth - submit.width - 32
submit.x = passWidth - ((passHeight - submit.width) * 0.5)
inputField.width = passWidth - passHeight - 96 // 92 = 46 * 2 which is the padding on the inputField
background.width = passWidth
// Tween(self, self.updateSpeed, {
// width:passWidth,
// x:layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - passWidth) * 0.5),
// y:layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - passHeight) * 0.5
// })
self.width = passWidth
self.x = layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - passWidth) * 0.5)
self.y = layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - passHeight) * 0.5
// Tween(self, self.updateSpeed, {
// width:passWidth,
// x:layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - passWidth) * 0.5),
// y:layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - passHeight) * 0.5
// })
self.updateSpeed = UPDATE_SPEED
}
self.close = function () {
isOpen = false
inputField.removeEventListener(KEY_UP, onKeyUp)
submit.removeEventListener(CLICK, onSubmit)
overlay.close()
}
self.setMessage = function(msg) {
inputField.value = msg
}
self.open = function(section) {
if(section) vars.section = section
overlay.open()
setTimeout(function() {
inputField.addEventListener(KEY_UP, onKeyUp)
submit.addEventListener(CLICK, onSubmit)
}, 100)
isOpen = true
}
build()
return self
}
function searchInput(vars) {
var self = new Sprite({events:vars.events})
var searchWidth = (stage.width * 0.9) > 800 ? 800 : (stage.width * 0.9)
var searchHeight = 78
var inputField
// var selector
// var selectorWidth = 180
var background
var submit
var overlay
var tags = vars.tags || []
var tagsContainer
var addTag
var addTagContainer
var overlayColorSet = !!(LAYOUT_MODEL.inputOverlayFontColor && LAYOUT_MODEL.inputOverlayBarColor)
var menuColorSet = !!(LAYOUT_MODEL.menuOverlayFontColor && LAYOUT_MODEL.menuOverlayBgColor)
var textColor
var inputBarColor
if(overlayColorSet) {
textColor = LAYOUT_MODEL.inputOverlayFontColor
inputBarColor = LAYOUT_MODEL.inputOverlayBarColor
} else if(menuColorSet) {
textColor = LAYOUT_MODEL.menuOverlayFontColor
inputBarColor = LAYOUT_MODEL.menuOverlayBgColor
} else {
textColor = '#000000'
inputBarColor = '#FFFFFF'
}
var inputOverlayBgColor = LAYOUT_MODEL.inputOverlayBgColor || LAYOUT_MODEL.menuOverlayBgColor || '#000000'
var inputOverlayBgAlpha = LAYOUT_MODEL.inputOverlayBgAlpha || LAYOUT_MODEL.menuOverlayBgAlpha || 0.5
// var sortOptions = [
// ['New - Old', 'date-asc'],
// ['Old - New', 'date-dsc'],
// ['A - Z', 'label-asc'],
// ['Z - A', 'label-dsc'],
// // ['Type, A - Z', 'type-asc'],
// // ['Type, Z - A', 'type-dsc'],
// ['Small - Large', 'size-asc'],
// ['Large - Small', 'size-dsc']
// ]
// var sortSelection = vars.sortBy || ''
var _path
var arrowPath
var addPath
var isOpen
self.updateSpeed = 0
self.addEventListener(CHILD_ADDED, function(child) {
})
function build() {
self.width = searchWidth
self.height = searchHeight
background = new Sprite()
background.backgroundColor = inputBarColor
background.boxShadow = "0px 2px 10px rgba(0,0,0,0.05)"
background.borderRadius = 2
background.width = searchWidth
background.height = searchHeight
inputField = new Input()
inputField.backgroundColor = 'transparent'
inputField.fontFamily = LAYOUT_MODEL.menuFont
inputField.fontColor = textColor
inputField.fontSize = 16
// inputField.width = 170
inputField.height = searchHeight
inputField.x = 0
inputField.y = 0
inputField.element.style.padding = '0px 46px'
// inputField.textTransform = LAYOUT_MODEL.menuTextTransform
inputField.addEventListener(FOCUS, onInputFieldFocus)
inputField.addEventListener(BLUR, onInputFieldBlur)
inputField.element.addEventListener(CLICK, function(e){
e.stopPropagation()
})
inputField.element.tabIndex = 1
self.setMessage('Search')
// submit = new Button()
// submit.text = 'SUBMIT'
// submit.height = 23
// submit.width = 70
// submit.fontSize = USER_AGENT === MOBILE ? 16 : 14
// submit.fontFamily = LAYOUT_MODEL.contactFont
// submit.fontColor = LAYOUT_MODEL.contactFontColor
// submit.backgroundColor = LAYOUT_MODEL.contactFieldRectColor
// submit.x = searchWidth - submit.width - 25
// submit.y = inputField.y
submit = new Svg()
_path = new Path()
_path.d = svgPaths.search
_path.fill = textColor
_path.fillRule = 'evenodd'
submit.addChild(_path)
submit.width = 25
submit.height = 25
submit.x = searchWidth - submit.width - 24
submit.y = (searchHeight - submit.height) * 0.5
submit.alpha = 0.5
submit.cursor = 'pointer'
submit.addEventListener(MOUSE_OVER, function() {
Tween(this, UPDATE_SPEED, {alpha:1})
})
submit.addEventListener(MOUSE_OUT, function() {
Tween(this, UPDATE_SPEED, {alpha:0.5})
})
// function buildSortOption(option) {
// var optionText = option[0]
// var optionValue = option[1]
// var btn = new Button()
// btn.position = 'relative'
// btn.backgroundColor = toRgba(inputBarColor, 0.85)
// btn.color = toRgba(textColor, 0.5)
// // btn.textTransform = LAYOUT_MODEL.menuTextTransform
// btn.fontFamily = LAYOUT_MODEL.menuFont
// btn.text = optionText
// btn.width = selectorWidth
// btn.height = searchHeight * 0.65
// btn.cursor = 'pointer'
// btn.addEventListener(MOUSE_OVER, function() {
// Tween(this, UPDATE_SPEED, {color:toRgba(textColor, 1), backgroundColor:toRgba(inputBarColor, 1)})
// })
// btn.addEventListener(MOUSE_OUT, function() {
// Tween(this, UPDATE_SPEED, {color:toRgba(textColor, 0.5), backgroundColor:toRgba(inputBarColor, 0.85)})
// })
// btn.addEventListener('click', function() {
// sortSelection = optionValue
// selector.text = optionText
// selectorOptions.display = 'none'
// downarrow.rotate = 0
// })
// return btn
// }
// selectorOptions = new Sprite()
// selectorOptions.display = 'none'
// selectorOptions.element.style.flexDirection = 'column'
// selectorOptions.boxShadow = "0px 2px 10px rgba(0,0,0,0.05)"
// selectorOptions.zIndex = -1
// selectorOptions.width = selectorWidth
// selectorOptions.y = searchHeight
// sortOptions
// .map(buildSortOption)
// .forEach(function(opt) {
// selectorOptions.addChild(opt)
// })
// var sortLabel = sortOptions.filter(function(option) {
// return option[1] === sortSelection
// })
// .map(function(option) {
// return option[0]
// })[0]
// selector = new Button()
// selector.backgroundColor = 'transparent'
// selector.fontFamily = LAYOUT_MODEL.menuFont
// selector.cursor = 'pointer'
// selector.borderLeft = '1px solid ' + toRgba(textColor, 0.05)
// selector.borderRight = '1px solid ' + toRgba(textColor, 0.05)
// selector.fontColor = toRgba(textColor, 0.5)
// selector.fontSize = 16
// selector.width = selectorWidth
// selector.height = searchHeight
// selector.y = 0
// selector.text = sortLabel || 'Sort By'
// selector.element.style.padding = '27px 0px'
// // selector.textTransform = LAYOUT_MODEL.menuTextTransform
// // selector.addEventListener(FOCUS, onInputFieldFocus)
// // selector.addEventListener(BLUR, onInputFieldBlur)
// selector.addEventListener(MOUSE_OVER, function() {
// Tween(this, UPDATE_SPEED, {color:toRgba(textColor, 1)})
// })
// selector.addEventListener(MOUSE_OUT, function() {
// Tween(this, UPDATE_SPEED, {color:toRgba(textColor, 0.5)})
// })
// selector.element.addEventListener(CLICK, function(e) {
// if(selectorOptions.display === 'none') {
// selectorOptions.display = 'flex'
// downarrow.rotate = 180
// } else {
// selectorOptions.display = 'none'
// downarrow.rotate = 0
// }
// })
// // selector.element.tabIndex = 2
// var downarrow = new Svg()
// downarrow.element.style['user-select'] = 'none'
// downarrow.width = 14
// downarrow.height = 9
// downarrow.transition = 0.25
// downarrow.x = selectorWidth - submit.width - 12
// downarrow.y = (searchHeight - downarrow.height) * 0.5
// downarrow.rotate = 0
// downarrow.alpha = 0.2
// arrowPath = new Path()
// arrowPath.d = svgPaths.arrowDown
// arrowPath.strokeWidth = 1
// arrowPath.fill = 'none'
// arrowPath.stroke = textColor
// downarrow.addChild(arrowPath)
// selector.addChild(downarrow)
// selector.x = searchWidth - searchHeight - selectorWidth
// selectorOptions.x = selector.x
inputField.width = searchWidth - searchHeight - 92 // 92 = 46 * 2 which is the padding on the inputField
tagsContainer = new Sprite()
tagsContainer.display = 'flex'
tagsContainer.width = searchWidth - 20
tagsContainer.x = 20
tagsContainer.y = searchHeight
tagsContainer.zIndex = -1
addTagContainer = new Svg()
addTagContainer.element.style['user-select'] = 'none'
addTagContainer.alpha = 0
addTagContainer.x = 4
// addTagContainer.y = searchHeight + 14
addTagContainer.width = 14
addTagContainer.height = 14
addTagContainer.transition = 0.25
addTagContainer.cursor = 'pointer'
addTagContainer.addEventListener('click', function(){
addTag(inputField.value)
inputField.value = ''
})
// addTagContainer.x = selectorWidth - submit.width - 12
// addTagContainer.y = (searchHeight - addTagContainer.height) * 0.5
// addTagContainer.rotate = 0
addTagContainer.alpha = 0
addPath = new Path()
addPath.d = svgPaths.plusSmall
addPath.strokeWidth = 2
addPath.fill = 'none'
addPath.stroke = textColor
addTagContainer.addChild(addPath)
self.addChild(addTagContainer)
self.addChild(background)
self.addChild(inputField)
self.addChild(submit)
self.addChild(tagsContainer)
// self.addChild(selector)
// self.addChild(selectorOptions)
var blurLayers = dx && exists(dx, 'admin.adminView') ? [dx.site.siteView, dx.admin.adminView] : [dx.site.siteView]
overlay = new Overlay(self, {userOverride:true, backgroundColor:inputOverlayBgColor, alpha:inputOverlayBgAlpha, blurLayers:blurLayers, zIndex:99})
overlay.onClose = function() {
isOpen = false
inputField.removeEventListener(KEY_UP, onKeyUp)
submit.removeEventListener(CLICK, onSubmit)
}
self.open()
self.overlay = overlay
overlay.overlayResize()
isOpen = true
}
function buildTags(tags) {
tagsContainer.text = ''
tags = tags
.filter(function(tag, i, a) {
return a.indexOf(tag) === i
})
.map(buildTag)
tags
.forEach(function(tag) {
tagsContainer.addChild(tag)
})
}
function buildTag(tag) {
var container = new Sprite()
container.position = 'relative'
container.backgroundColor = toRgba(inputBarColor, 0.35)
container.boxShadow = "0px 2px 10px rgba(0,0,0,0.05)"
container.borderRadius = 20
container.display = 'flex'
container.element.style.padding = '3px 8px 3px 10px'
container.element.style.margin = '8px 0 0 8px'
var closeBtn = new Button()
closeBtn.position = 'relative'
closeBtn.background = 'transparent'
closeBtn.fontSize = 12
closeBtn.fontFamily = LAYOUT_MODEL.menuFont
closeBtn.color = textColor
closeBtn.text = '×'
closeBtn.alpha = 0.2
closeBtn.top = 0
closeBtn.cursor = 'pointer'
closeBtn.addEventListener(MOUSE_OVER, function() {
Tween(this, UPDATE_SPEED, {alpha:1})
})
closeBtn.addEventListener(MOUSE_OUT, function() {
Tween(this, UPDATE_SPEED, {alpha:0.2})
})
var label = new Sprite()
label.position = 'relative'
label.color = textColor
label.fontSize = 12
label.fontFamily = LAYOUT_MODEL.menuFont
label.paddingRight = 7
label.text = tag
closeBtn.addEventListener('click', function() {
tags = tags.filter(function(_tag) {
return tag !== _tag
})
buildTags(tags)
})
container.addChild(label)
container.addChild(closeBtn)
return container
}
function trim(str) {
return str.replace(/^\s+|\s+$/g, '')
}
function addTag(tag) {
// if value has commas, split into tags
if(inputField.value !== '' && !inputField.isPlaceholder) {
tags = tags.concat(
inputField.value.split(',')
.map(trim)
)
buildTags(tags)
}
addTagContainer.y = searchHeight + 4 + (((tagsContainer.element.offsetHeight || 25) - 14) * 0.5)
}
function onKeyUp(e) {
// console.log('search keyup')
if(isOpen) {
if(e.keyCode === 13) {
if(inputField.value !== '' && !inputField.isPlaceholder) {
addTag(inputField.value)
inputField.value = ''
onSubmit()
} else if(tags.length) {
onSubmit()
} else {
// do nothing or close the overlay
}
} else {
addTagContainer.y = searchHeight + 4 + (((tagsContainer.element.offsetHeight || 25) - 14) * 0.5)
addTagContainer.alpha = inputField.value !== '' && !inputField.isPlaceholder ? 1 : 0
inputField.isPlaceholder = false
}
}
}
function onSubmit(e) {
if(inputField.value && !inputField.isPlaceholder) {
tags = tags.concat(
inputField.value.split(',')
.map(trim)
)
}
if(tags.length) {
self.events.dispatchEvent('SEARCH_SUBMIT', Object.assign({}, vars.navEvent, {searchTerm:tags.join(','), searchSubmit:true}))
}
}
function onInputFieldBlur(e) {
stage.isInputFocus = false
// inputField.element.setAttribute('placeholder', 'SEARCH')
if(inputField.value === "") {
self.setMessage('Search')
}
}
function onInputFieldFocus(e) {
stage.isInputFocus = true
if(inputField.isPlaceholder) {
inputField.value = ''
}
// inputField.element.setAttribute('placeholder', '')
}
self.updatePosition = function(e) {
searchWidth = (stage.width * 0.9) > 800 ? 800 : (stage.width * 0.9)
submit.x = searchWidth - submit.width - 24
// selector.x = searchWidth - searchHeight - selectorWidth
// selectorOptions.x = selector.x
inputField.width = searchWidth - searchHeight - 92 // 92 = 46 * 2 which is the padding on the inputField
background.width = searchWidth
tagsContainer.width = searchWidth
addTagContainer.y = searchHeight + 4 + (((tagsContainer.element.offsetHeight || 25) - 14) * 0.5)
// Tween(self, self.updateSpeed, {
// width:searchWidth,
// x:layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - searchWidth) * 0.5),
// y:layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - searchHeight) * 0.5
// })
self.width = searchWidth
self.x = layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - searchWidth) * 0.5)
self.y = layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - searchHeight) * 0.5
// Tween(self, self.updateSpeed, {
// width:searchWidth,
// x:layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - searchWidth) * 0.5),
// y:layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - searchHeight) * 0.5
// })
self.updateSpeed = UPDATE_SPEED
}
self.setMessage = function(msg) {
inputField.value = msg
inputField.isPlaceholder = true
}
self.setTags = function(_tags) {
tags = _tags
}
self.setSortBy = function(_sortSelection) {
// sortSelection = _sortSelection
// var sortLabel = sortOptions.filter(function(option) {
// return option[1] === sortSelection
// })
// .map(function(option) {
// return option[0]
// })[0]
// selector.text = sortLabel || 'Sort By'
}
self.close = function () {
isOpen = false
inputField.removeEventListener(KEY_UP, onKeyUp)
submit.removeEventListener(CLICK, onSubmit)
overlay.close()
}
self.blur = function() {
inputField.element.blur()
}
self.open = function(section) {
if(section) vars.section = section
overlay.open()
buildTags(tags)
setTimeout(function() {
inputField.addEventListener(KEY_UP, onKeyUp)
submit.addEventListener(CLICK, onSubmit)
}, 100)
isOpen = true
}
build()
return self
}
function inputPopup(vars) {
var self = new Sprite({events:vars.events}),
passWidth = 272,
passHeight = 47,
inputField,
password,
background,
submit,
overlay;
self.updateSpeed = 0;
self.addEventListener(CHILD_ADDED, function(child) {
});
function build() {
self.width = passWidth;
self.height = passHeight;
background = new Sprite();
background.backgroundColor = vars.backgroundColor || LAYOUT_MODEL.overlayColor;
background.width = passWidth;
background.height = passHeight;
inputField = new Input();
inputField.backgroundColor = vars.backgroundColor2 || LAYOUT_MODEL.contactFieldRectColor;
inputField.fontFamily = vars.fontFamily || LAYOUT_MODEL.contactFont;
inputField.fontColor = vars.fontColor || LAYOUT_MODEL.contactFontColor;
inputField.fontSize = vars.fontSize || 12;
inputField.width = 170;
inputField.height = 23;
inputField.x = 10;
inputField.y = (passHeight - inputField.height) * 0.5;
inputField.paddingLeft = 3;
inputField.addEventListener(FOCUS, onInputFieldFocus);
inputField.addEventListener(BLUR, onInputFieldBlur);
inputField.element.addEventListener(CLICK, function(e){e.stopPropagation();});
inputField.element.tabIndex = 1;
inputField.element.setAttribute('class', 'dx_placeholder_input')
self.setMessage(vars.placeholder || '');
submit = new Button();
submit.text = 'SUBMIT';
submit.x = inputField.x + inputField.width + 10;
submit.y = inputField.y;
submit.height = 23;
submit.width = 70;
submit.fontSize = 12;
submit.fontFamily = LAYOUT_MODEL.contactFont;
submit.fontColor = vars.fontColor || LAYOUT_MODEL.contactFontColor;
submit.backgroundColor = vars.backgroundColor2 || LAYOUT_MODEL.contactFieldRectColor;
self.addChild(background);
self.addChild(inputField);
self.addChild(submit);
var blurLayers = dx && exists(dx, 'admin.adminView') ? [dx.site.siteView, dx.admin.adminView] : [dx.site.siteView];
overlay = new Overlay(self, {userOverride:true, backgroundColor:'#000000', alpha:0.5, blurLayers:blurLayers});
self.open();
overlay.overlayResize();
};
function onKeyUp(e) {
if(e.keyCode === 13) {
onSubmit(e);
}
}
function onSubmit(e) {
if(typeof vars.onSubmit === 'function') {
vars.onSubmit(inputField.value)
} else {
console.warn('should have a onSubmit function')
}
// self.events.dispatchEvent('passwordViewAuthCheck', inputField.value);
}
function onInputFieldBlur(e) {
// if(inputField.value === "") {
// self.setMessage(vars.placeholder || '');
// }
}
function onInputFieldFocus(e) {
// inputField.value = "";
}
self.updatePosition = function(e) {
Tween(self, self.updateSpeed, {x:layoutCalcs.mediaView.x() + ((layoutCalcs.mediaView.width() - passWidth) * 0.5), y:layoutCalcs.mediaView.y() + (layoutCalcs.mediaView.height() - passHeight) * 0.5});
self.updateSpeed = UPDATE_SPEED;
};
self.close = function () {
stage.removeEventListener(KEY_UP, onKeyUp);
submit.removeEventListener(CLICK, onSubmit);
overlay.close();
};
self.setMessage = function(msg) {
inputField.element.setAttribute('placeholder', msg)
};
self.open = function() {
overlay.open();
setTimeout(function() {
stage.addEventListener(KEY_UP, onKeyUp);
submit.addEventListener(CLICK, onSubmit);
}, 100);
};
build();
return self;
}
function Resize(obj, duration, vars) {
var resizeVars = vars;
var scale = new ScaleEngine({
type:vars.type,
hRange:vars.hRange,
vRange:vars.vRange,
width:vars.width || obj.width,
height:vars.height || obj.height,
disableOrientationCheck:vars.disableOrientationCheck
});
var align = new AlignEngine({
hRange:vars.hRange,
vRange:vars.vRange,
hAlign:vars.hAlign,
vAlign:vars.vAlign,
width:scale.width,
height:scale.height
});
var tweenVars = {
x:Math.round(align.x),
y:Math.round(align.y),
width:scale.width,
height:scale.height,
onComplete:vars.onComplete,
onCompleteParams:vars.onCompleteParams,
onCompleteScope:vars.onCompleteScope,
onUpdate:vars.onUpdate,
onUpdateParams:vars.onUpdateParams,
onUpdateScope:vars.onUpdateScope,
onInit:vars.onInit,
onInitScope:vars.onInitScope,
onInitParams:vars.onInitParams
}
if(vars.onComplete) tweenVars.onComplete = vars.onComplete;
if(obj) Tween(obj, duration, tweenVars);
return {scale:scale, align:align};
}
function RetinaResizeEngine(vars) {
var width = vars.width,
height = vars.height,
scaleFactor = getScaleFactor(vars.filename);
function getScaleFactor(str) {
var scaleFactor = str.match(/[@]([0-9]*\.?[0-9]+)?[x]/i);
var scaleFactorWebSafe = str.match(/__at__([0-9]*\.?[0-9]+)?x/i);
if(scaleFactor) {
return Number(scaleFactor[1]);
} else if(scaleFactorWebSafe) {
return Number(scaleFactorWebSafe[1]);
} else {
return 1;
}
}
return {width: Math.round(width / scaleFactor), height: Math.round(height / scaleFactor)};
}
function Scale(obj, duration, vars) { // eslint-disable-line
var scale = ScaleEngine({
type:vars.type,
hRange:vars.hRange,
vRange:vars.vRange,
width:vars.width || obj.width,
height:vars.height || obj.height,
disableOrientationCheck:vars.disableOrientationCheck || false
})
var tweenVars = {
width:Mth.round(scale.width),
height:Mth.round(scale.height),
onComplete:vars.onComplete,
onCompleteParams:vars.onCompleteParams,
onCompleteScope:vars.onCompleteScope,
onUpdate:vars.onUpdate,
onUpdateParams:vars.onUpdateParams,
onUpdateScope:vars.onUpdateScope,
onInit:vars.onInit,
onInitScope:vars.onInitScope,
onInitParams:vars.onInitParams
}
if(vars.onComplete) tweenVars.onComplete = vars.onComplete
Tween(obj, duration, tweenVars)
return scale
}
function ScaleEngine(vars) {
vars = vars || {}
var _type = vars.type || 'fit'
var _disableOrientationCheck = vars.disableOrientationCheck || false
var _hRange = vars.hRange
var _vRange = vars.vRange
var _width = vars.width || 0
var _height = vars.height || 0
var _ratio = -1
var _rangeRatio = -1
function isFitToHRange() {
_rangeRatio = _hRange / _vRange
if(_type === 'fit' || _type === 'native') return _rangeRatio < _ratio
return _rangeRatio > _ratio
}
function calc() {
_ratio = _width / _height
orientationOverride()
if(vars.type === 'fitWidth' || isFitToHRange()) {
_width = _hRange
_height = _hRange / _ratio
} else if(_vRange) {
_width = _vRange * _ratio
_height = _vRange
} else {
_width = _hRange
_height = _hRange / _ratio
}
if(vars.type === 'native') {
if(_width > vars.width || _height > vars.height) {
_width = vars.width
_height = vars.height
}
}
}
calc()
function orientationOverride() {
if(!_disableOrientationCheck && !orientationMatch(_width, _height, _hRange, _vRange) && !isSquare(_width, _height)) _type = 'fit'
}
function orientationMatch(width, height, maskWidth, maskHeight) {
return isHorizontal(width, height) === isHorizontal(maskWidth, maskHeight)
}
function isHorizontal(width, height) {
return width > height
}
function isSquare(width, height) {
return width === height
}
return {
set hRange(value) {
_hRange = value
},
set vRange(value) {
_vRange = value
},
set type(value) {
_type = value
},
get type() {
return _type
},
set width(value) {
_width = value
},
set height(value) {
_height = value
},
get width() {
return _width
},
get height() {
return _height
}
}
}
var Scrolls = {
arr: [],
focusTarget:null,
register: function(scroll) {
this.arr.push(scroll)
},
unRegister: function(scroll) {
var i = this.arr.length
while(i--) {
if(scroll === this.arr[i]) {
this.arr.splice(i, 1)
}
}
},
resize: function() {
if(this.arr.length > 0) {
var i = this.arr.length
while(i--) {
this.arr[i].resize()
}
}
},
setActive: function(scroll) {
var i = this.arr.length
while(i--) {
if(!this.arr[i].disabled) this.arr[i].active = (scroll === this.arr[i])
}
},
hitMask: function(x, y) {
var i = this.arr.length
while(i--) {
if(!this.arr[i].disabled) this.arr[i].active = this.arr[i].mask.hitTestPoint(x, y)
}
},
hitScrollBar: function(x, y) {
var i = this.arr.length
while(i--) {
if(this.arr[i].bar && this.arr[i].bar.handle.hitTestAbs(x, y)) {
return this.arr[i].bar.back.hitTestAbs(x, y)
}
}
return false
},
get ing() {
var i = this.arr.length
while(i--) {
if(this.arr[i].ing) {
return this.arr[i].ing
}
}
return false
}
}
function Scroll(obj, mask, vars) {
vars.events = vars.events || globalEvents
var _percent = 0,
_position = 0,
_scrollDist = 0,
_scrolling = false,
_scrollTimer,
_startup = true
var scroll = {
name: vars.name,
obj: obj,
mask: mask,
listeners: vars.events.listeners,
dispatchEvent: vars.events.dispatchEvent,
addEventListener: vars.events.addEventListener,
removeEventListener: vars.events.removeEventListener,
types: vars.types || ['bar','wheel','touch'],
axis: vars.axis || 'y',
align: vars.align || 'center',
margin: vars.margin || 0,
marginTop: vars.marginTop || 0,
marginBottom: vars.marginBottom || 0,
maxTime: vars.maxTime || 300,
minTime: vars.minTime || 1,
maxSpeed: vars.maxSpeed || 500,
minSpeed: vars.minSpeed || 5,
color: vars.color || '#00FF00',
hover: vars.hover || '#FF0000',
zIndex: vars.zIndex,
side: vars.side || 'right',
offsetX: vars.offsetX || 0,
offsetY: vars.offsetY || 0,
topPad:vars.topPad || 0,
parent: vars.parent || mask.parent,
width: vars.width !== undefined ? vars.width : 7,
property: vars.property,
scrollTopCheck: vars.scrollTopCheck,
rounded: vars.rounded,
visibility: vars.visibility,
disabled: false,
get percent(){
return _percent
},
set percent(value){
value = value < 0 ? 0 : value
value = value > 1 ? 1 : value
_percent = value
},
get position(){
return _position
},
set position(value){
_position = value
},
get scrollDist(){
return _scrollDist
},
set scrollDist(value){
_scrollDist = value
},
get ing(){
return _scrolling
},
set ing(value){
_scrolling = value
}
}
scroll.perpAxis = vars.axis === 'x' ? 'y' : 'x'
scroll.dim = vars.axis === 'x' ? 'width' : 'height'
scroll.perpDim = vars.axis === 'x' ? 'height' : 'width'
scroll.alpha = !isNaN(vars.alpha) ? vars.alpha : 0.35
var scrollStart = false
var offsetDim = scroll.dim === 'width' ? 'offsetWidth' : 'offsetHeight'
scroll.alignment = function() {
switch(scroll.align) {
case 'middle':
case 'center':
return 0.5
case 'right':
case 'bottom':
return 1
default:
return 0
}
}
scroll.scrollTo = function(value) {
if(scroll.bar) {
scroll.bar.scrollTo(value, 0)
}
}
function alignCaptionScroll(objSize, maskSize) {
if(objSize > maskSize) {
if(!scroll.alignSave) {
scroll.alignSave = scroll.align
scroll.align = scroll.dim === 'width' ? 'left' : 'top'
_percent = scroll.alignment()
}
} else {
if(scroll.alignSave) {
scroll.align = scroll.alignSave
delete scroll.alignSave
}
_percent = scroll.alignment()
}
}
function resetScrollPercent(objSize, maskSize) {
if(objSize < maskSize) {
_percent = scroll.alignment()
}
}
scroll.update = function(speed, accel, resize) {
speed = speed || 0
if(!scrollStart) {
scrollStart = true
if(!resize) scroll.dispatchEvent('scrollStart')
}
var maskDim = scroll.mask.element[offsetDim]
var objSize = (scroll.margin || scroll.marginTop) + obj.element[offsetDim] + (scroll.margin || scroll.marginBottom)
if(objSize && maskDim) {
_scrollDist = (objSize) - maskDim
if(scroll.captionScroll) {
alignCaptionScroll(objSize, maskDim)
} else {
resetScrollPercent(objSize, maskDim)
}
_position = -(_scrollDist * _percent) + (scroll.margin || scroll.marginTop)
var tweenVars = {}
obj.transition = 0
if(scroll.property === 'translate') {
tweenVars['translate' + vars.axis.toUpperCase()] = Mth.round(_position)
} else {
tweenVars[vars.axis] = Mth.round(_position)
}
tweenVars.ease = 'cubic-bezier(0.5, 0.5, 0.5, 0.8)'
if(scroll.hvr) {
tweenVars.onUpdate = function() {
scroll.dispatchEvent(SCROLL)
}
}
Tween(obj, speed, tweenVars)
if(scroll.bar) {
scroll.bar.moveHandle(0)
}
if(scroll.bar && scroll.visibility === 'when scrolling') {
scroll.bar.show()
scroll.bar.checkVisible()
}
clearTimeout(_scrollTimer)
_scrollTimer = setTimeout(function(){
if(!_startup) scroll.dispatchEvent('scrollStop')
if(scroll.bar && scroll.visibility === 'when scrolling') {
scroll.bar.hide()
scroll.bar.checkVisible()
}
scrollStart = false
if(scroll.bar) {
scroll.bar.resize()
}
_startup = false
}, 200)
}
}
scroll.resize = function(speed) {
scroll.update(speed || 0, false, true)
if(scroll.bar) {
scroll.bar.resize()
}
}
scroll.destroy = function() {
if(scroll.bar) {
scroll.bar.destroy()
}
if(scroll.wheel) {
scroll.wheel.destroy()
}
if(scroll.hvr) {
scroll.hvr.destroy()
}
if(scroll.touch) {
scroll.touch.destroy()
}
}
scroll.hide = function() {
if(scroll.bar) {
scroll.bar.hide()
scroll.bar.checkVisible()
}
}
scroll.show = function() {
if(scroll.bar) {
scroll.bar.show()
scroll.bar.checkVisible()
}
}
scroll.enable = function() {
scroll.disabled = false
if(scroll.bar) scroll.bar.enable()
}
scroll.disable = function() {
scroll.disabled = true
if(scroll.bar) scroll.bar.disable()
}
scroll.setAlpha = function(value) {
if(scroll.bar) {
scroll.bar.setAlpha(value)
}
}
scroll.getBack = function() {
if(scroll.bar) {
return scroll.bar.getBack()
}
return null
}
function buildBehaviors() {
var i = vars.types.length
while(i--) {
switch (vars.types[i]) {
case 'bar':
scroll.bar = new ScrollBar(scroll)
break
case 'wheel':
scroll.wheel = new ScrollWheel(scroll)
break
case 'hover':
scroll.hvr = new ScrollHover(scroll)
break
case 'touch':
scroll.touch = new ScrollTouch(scroll)
break
}
}
}
buildBehaviors()
scroll.resize()
scroll.update()
Scrolls.register(scroll)
return scroll
}
function ScrollBar(scroll) {
var obj = scroll.obj,
mask = scroll.mask,
moveDist = 0,
startPoint = 0,
visible = true
var back = this.back = new Sprite()
back.alpha = 0
back.selectable = true
back.backgroundColor = scroll.color
if(scroll.zIndex) back.zIndex = scroll.zIndex
scroll.parent.addChild(back)
var handle = this.handle = new Sprite()
handle.alpha = 0
handle.backgroundColor = scroll.color
if(scroll.zIndex) handle.zIndex = scroll.zIndex
handle.selectable = false
handle.cursor = 'default'
handle.borderRadius = scroll.rounded ? Math.ceil(scroll.width / 2) : 0
handle.style.pointerEvents = 'auto'
scroll.parent.addChild(handle)
handle.addEventListener(MOUSE_OVER, onMouseOver)
handle.addEventListener(MOUSE_OUT, onMouseOut)
handle.addEventListener(MOUSE_DOWN, onMouseDown)
handle.addEventListener(TOUCH_START, onMouseDown)
this.moveHandle = function(speed) {
handle.transition = speed || 0
handle[scroll.axis] = ((back[scroll.dim] - handle[scroll.dim]) * scroll.percent) + back[scroll.axis]
if(scroll.visibility === 'hidden') {
handle.alpha = 0
} else if(scroll.visibility === 'when scrolling') {
handle.alpha = 0.5
} else {
handle.alpha = 1
}
}
this.resize = function() {
back.transition = UPDATE_SPEED
handle.transition = UPDATE_SPEED
back[scroll.perpDim] = scroll.width
back[scroll.dim] = mask[scroll.dim]
if(scroll.parent === mask) {
back[scroll.axis] = getOffset()
} else {
back[scroll.axis] = mask[scroll.axis] + getOffset()
}
handle[scroll.perpDim] = scroll.width
if(scroll.side === 'left' || scroll.side === 'top') {
back[scroll.perpAxis] = mask[scroll.perpAxis] - scroll.width + getPerpOffset()
handle[scroll.perpAxis] = mask[scroll.perpAxis] - scroll.width + getPerpOffset()
} else {
back[scroll.perpAxis] = mask[scroll.perpAxis] + mask[scroll.perpDim] + getPerpOffset()
handle[scroll.perpAxis] = mask[scroll.perpAxis] + mask[scroll.perpDim] + getPerpOffset()
}
this.moveHandle(0)
setTimeout(this.checkVisible, 0)
}
this.checkVisible = function() {
back.style['transition'] = 'opacity 750ms'
handle.style['transition'] = 'opacity 750ms'
var offsetDim = 'offset' + scroll.dim[0].toUpperCase() + scroll.dim.substr(1),
maskScrollDim = mask.element[offsetDim]
var objSize = (scroll.margin || scroll.marginTop) + obj.element[offsetDim] + (scroll.margin || scroll.marginBottom)
var handleSize = (maskScrollDim / objSize) * maskScrollDim
if(handleSize < back[scroll.dim] && visible) {
back.display = 'block'
back.alpha = scroll.alpha
handle.display = 'block'
handle[scroll.dim] = handleSize
} else if(!isNaN(handleSize) && handleSize >= back[scroll.dim]) {
back.transition = 0
back.alpha = 0
back.display = 'none'
handle.transition = 0
handle.alpha = 0
handle.display = 'none'
handle[scroll.dim] = back[scroll.dim]
scroll.scrollTo(0, 0)
} else {
Tween(back, 0.35, {alpha:0, onComplete:function(){
this.dislplay = 'none'
}})
Tween(handle, 0.35, {alpha:0, onComplete:function(){
setTimeout(function() {
handle.dislplay = 'none'
}, 200)
scroll.scrollTo(0, 0)
}})
}
}
this.destroy = function() {
scroll.parent.removeChild(handle)
scroll.parent.removeChild(back)
handle.removeEventListener(MOUSE_OVER, onMouseOver)
handle.removeEventListener(MOUSE_OUT, onMouseOut)
handle.removeEventListener(MOUSE_DOWN, onMouseDown)
handle.removeEventListener(TOUCH_START, onMouseDown)
}
this.setAlpha = function(value) {
handle.alpha = back.alpha = value
}
this.getBack = function() {
return back
}
this.scrollTo = function(value) {
/*scroll.percent = value
scroll.update(0)
scroll.dispatchEvent(SCROLL);*/
}
this.hide = function() {
visible = false
}
this.show = function() {
visible = true
}
this.disable = function() {
handle.removeEventListener(MOUSE_OVER, onMouseOver)
handle.removeEventListener(MOUSE_OUT, onMouseOut)
handle.removeEventListener(MOUSE_DOWN, onMouseDown)
handle.removeEventListener(TOUCH_START, onMouseDown)
}
this.enable = function() {
handle.addEventListener(MOUSE_OVER, onMouseOver)
handle.addEventListener(MOUSE_OUT, onMouseOut)
handle.addEventListener(MOUSE_DOWN, onMouseDown)
handle.addEventListener(TOUCH_START, onMouseDown)
}
function onMouseOver(e) {
var scrollAlpha = scroll.visibility === 'when scrolling' ? 0.5 : 1
if(!scroll.active && /hidden/.test(scroll.visibility)) scrollAlpha = 0
Tween(handle, 0.35, {alpha:scrollAlpha, backgroundColor:scroll.hover})
}
function onMouseOut(e) {
if(!scroll.ing && /when scrolling|hidden/.test(scroll.visibility)) {
Tween(handle, 0.35, {alpha:0, backgroundColor:scroll.color})
}
}
function onMouseDown(e) {
var scrollAlpha = scroll.visibility === 'when scrolling' ? 0.5 : 1
if(!scroll.active && /hidden/.test(scroll.visibility)) scrollAlpha = 0
Tween(handle, 0.35, {alpha:scrollAlpha, backgroundColor:scroll.hover})
startPoint = getPoint(e) - back[scroll.axis] - handle[scroll.axis]
stage.addEventListener(MOUSE_UP, onMouseUp, false)
stage.addEventListener(MOUSE_MOVE, onMouseMove, false)
stage.addEventListener(TOUCH_END, onMouseUp, false)
stage.addEventListener(TOUCH_MOVE, onMouseMove, false)
}
function onMouseMove(e) {
if(scroll.ing === false) {
scroll.ing = true
e.preventDefault()
}
// for bug #1174
window.getSelection().removeAllRanges()
moveDist = getPoint(e) - startPoint - back[scroll.axis]
scroll.percent = (moveDist - back[scroll.axis]) / (back[scroll.dim] - handle[scroll.dim])
scroll.update(0)
scroll.dispatchEvent(SCROLL)
}
function onMouseUp(event) {
setTimeout(function(){
scroll.ing = false
}, 10)
Tween(handle, 0.35, {backgroundColor:scroll.color})
stage.removeEventListener(MOUSE_MOVE, onMouseMove)
stage.removeEventListener(MOUSE_UP, onMouseUp)
stage.removeEventListener(TOUCH_END, onMouseUp, false)
stage.removeEventListener(TOUCH_MOVE, onMouseMove, false)
}
function getPoint(e) {
if(scroll.axis === 'x') {
return getX(e)
}
return getY(e)
}
function getOffset() {
if(scroll.axis === 'x') {
return scroll.offsetX
}
return scroll.offsetY
}
function getPerpOffset() {
if(scroll.axis === 'y') {
return scroll.offsetX
}
return scroll.offsetY
}
}
function ScrollTouch(scroll) {
var startPoint = 0,
startPercent = 0,
moveDist = 0
scroll.mask.addEventListener(TOUCH_START, onStart)
if(isAppleMobile() && scroll.scrollTopCheck) window.addEventListener('scroll', windowScrollTop)
function windowScrollTop(e) {
if(scroll.active && !scroll.ing) {
scroll.dispatchEvent('WINDOW_SCROLL_TOP')
}
}
function onStart(e) {
Scrolls.setActive(scroll)
startPoint = getPoint(e)
startPercent = scroll.percent || 0
scroll.mask.addEventListener(TOUCH_END, onEnd)
scroll.mask.addEventListener(TOUCH_MOVE, onMove)
}
function onMove(e) {
if(scroll.ing === false) {
scroll.ing = true
if(isAppleMobile() && !STATE.podUseDesktop) window.scrollTo(0, 1)
e.preventDefault()
}
moveDist = getPoint(e) - startPoint
scroll.percent = -(moveDist / (scroll.scrollDist)) + startPercent
scroll.percent = scroll.percent < 0 ? 0 : scroll.percent
scroll.percent = scroll.percent > 1 ? 1 : scroll.percent
scroll.update(0)
scroll.dispatchEvent(SCROLL)
}
function getPoint(e) {
if(scroll.axis === 'x') {
return TOUCH_DEVICE ? event.touches[0].pageX : event.clientX
}
return TOUCH_DEVICE ? event.touches[0].pageY : event.clientY
}
function onEnd(e) {
scroll.ing = false
scroll.mask.removeEventListener(TOUCH_END, onEnd)
scroll.mask.removeEventListener(TOUCH_MOVE, onMove)
}
this.destroy = function() {
if(startPoint) {
scroll.ing = false
scroll.mask.removeEventListener(TOUCH_END, onEnd)
scroll.mask.removeEventListener(TOUCH_MOVE, onMove)
}
}
}
function ScrollWheel(scroll) {
var mask = scroll.mask,
self = this,
listenersAdded = false
scroll.active = false
mask.addEventListener(MOUSE_OVER, addWheelListener)
mask.addEventListener(MOUSE_OUT, removeWheelListener)
function checkContentScroll() {
var offsetDim = 'offset' + scroll.dim[0].toUpperCase() + scroll.dim.substr(1)
var objSize = (scroll.margin || scroll.marginTop) + scroll.obj.element[offsetDim] + (scroll.margin || scroll.marginBottom)
var _scrollDist = objSize - scroll.mask.element[offsetDim]
return _scrollDist > 0
}
function addWheelListener() {
if(checkContentScroll()) {
listenersAdded = true
Scrolls.focusTarget = self
stage.addEventListener(WHEEL, onMouseWheel, false)
stage.addEventListener(MOUSE_WHEEL, onMouseWheel, false)
}
}
function removeWheelListener() {
listenersAdded = false
stage.removeEventListener(WHEEL, onMouseWheel, false)
stage.removeEventListener(MOUSE_WHEEL, onMouseWheel, false)
}
function onMouseWheel(e) {
if(scroll.active) {
var delta = scroll.axis === 'x' ? e.deltaX : e.deltaY
if((Math.abs(e.deltaX) > Math.abs(e.deltaY) && scroll.axis === 'x') || (Math.abs(e.deltaY) > Math.abs(e.deltaX) && scroll.axis === 'y')) {
// intention is to scroll along the scroll axis
// need to update the scroll with the delta
// need to prevent the system from receiving the event
// check if delta is over hard end limits
// - and if so do not update or preventDefault
if(scroll.percent >= 0 && scroll.percent < 1 && delta > 0) {
update(delta)
e.preventDefault()
} else if(scroll.percent > 0 && scroll.percent <= 1 && delta < 0) {
update(delta)
e.preventDefault()
}
}
}
}
function update(delta) {
delta = scroll.align === 'bottom' ? delta = -delta : delta
if(isNaN(scroll.percent)) scroll.percent = 0
var offsetDim = 'offset' + scroll.dim[0].toUpperCase() + scroll.dim.substr(1)
var objSize = (scroll.margin || scroll.marginTop) + scroll.obj.element[offsetDim] + (scroll.margin || scroll.marginBottom)
var _scrollDist = objSize - scroll.mask.element[offsetDim]
var newPosition = scroll.percent + (delta / _scrollDist)
scroll.percent = newPosition < 0 ? 0 : newPosition
scroll.percent = newPosition > 1 ? 1 : newPosition
scroll.update(0)
scroll.dispatchEvent(SCROLL)
}
this.destroy = function() {
mask.removeEventListener(MOUSE_OVER, addWheelListener)
if(listenersAdded) {
removeWheelListener()
}
}
}
function ScrollHover(scroll) {
var self = this,
percent = 0,
weightedTime = 0,
num = 0,
hoverTimer,
hovering = false
self.enabled = true
self.destroy = remove
scroll.mask.addEventListener(MOUSE_OVER, add)
function add() {
scroll.mask.addEventListener(MOUSE_MOVE, update)
stage.addEventListener(MOUSE_MOVE, hoverCheck)
}
function hoverCheck(e) {
if(scroll.mask.hitTestPoint(getX(e), getY(e))) {
hovering = true
} else if(hovering) {
hovering = false
remove()
}
}
function remove() {
clearTimeout(hoverTimer)
scroll.mask.removeEventListener(MOUSE_MOVE, update)
stage.removeEventListener(MOUSE_MOVE, hoverCheck)
}
function update(e) {
if(self.enabled) {
hoverTimer = setTimeout(function() {
var mousePoint = scroll.axis === 'x' ? e.mouseX : e.mouseY,
offsetDim = 'offset' + scroll.dim[0].toUpperCase() + scroll.dim.substr(1)
percent = mousePoint / scroll.mask.element[offsetDim]
if(percent === 0 && mousePoint > scroll.mask.element[offsetDim] * 0.5) {
percent = 0.98
} else if (percent === 0 && mousePoint < scroll.mask.element[offsetDim] * 0.5) {
percent = 0.15
}
scroll.percent = percent > 0.5 ? 1 : 0
var destination = scroll.position
var currentPosition = scroll.obj._private[scroll.axis]
var distance = Math.abs(destination - currentPosition)
var time = Math.abs(distance) / scroll.maxSpeed
weightedTime += (time - weightedTime) * 0.10
weightedTime += (ease() - weightedTime) * 0.10
scroll.update(weightedTime, true)
scroll.dispatchEvent(SCROLL)
if(!hovering) {
var pos,
tweenVars = {}
if(scroll.axis === 'x') {
pos = scroll.obj.element.offsetLeft
} else {
pos = scroll.obj.element.offsetTop
}
tweenVars[scroll.axis] = Mth.round(pos)
Tween(scroll.obj, 1, tweenVars)
}
}, 50)
}
}
function ease() {
var half = percent < 0.5 ? percent * 2 : (percent * -2) + 2
return Math.round((Math.pow(half, 5) * scroll.maxSpeed) + scroll.minSpeed)
}
return self
}
function Sort(vars) {
var _events = new EventSandbox(),
_dragElements,
_disabled = false,
_timer;
var self = {
isDragging:false,
group:vars.group,
zoneSize:vars.zoneSize||0.5,
listeners:_events.listeners,
dispatchEvent:_events.dispatchEvent,
addEventListener:_events.addEventListener,
removeEventListener:_events.removeEventListener,
dragGroup:[],
get disabled() {
return _disabled;
},
set disabled(value) {
_disabled = value;
}
};
self.direction = '';
self.startIndex = 0;
function sort(e) {
var i,
mouse = {x:getX(e), y:getY(e)},
length = self.group.length;
for(i = 0; i < length; i++) {
if(this.indexOf(self.group[i]) === -1 && self.group[i].hitTestAbs(mouse.x, mouse.y)) {
dispatchReorder(getDragIndex(i), e);
break;
}
}
}
function dispatchReorder(newPos, e) {
if(newPos !== self.stopIndex) {
self.sorted = true;
self.dragGroup = getDragGroup(self.group);
spliceDragGroup(newPos);
e.group = self.group;
e.stopIndex = self.stopIndex;
self.dispatchEvent(REORDER_MOVE, e);
}
}
function getDragIndex(i) {
return self.group.indexOf(_dragElements[0]) < i ? i - (_dragElements.length - 1) : i;
}
function getDragGroup(arr) {
var group = [];
var i = arr.length;
while(i--) {
if(_dragElements && _dragElements.indexOf(arr[i]) > -1) {
var item = arr.splice(i, 1)[0];
group.push(item);
}
}
return group;
}
function spliceDragGroup(to) {
self.stopIndex = to;
var insertPoint = to;
var i = self.dragGroup.length;
while(i--) {
self.group.splice(insertPoint, 0, self.dragGroup[i]);
insertPoint++;
}
}
function dragStart(e) {
_dragElements = this.dragElements;
self.startIndex = this.dragElements[0].startIndex;
self.dispatchEvent(REORDER_START, e);
setZindex();
}
function dragMove(e) {
var ths = this;
self.isDragging = true;
if(!_disabled) {
if(_timer) clearTimeout(_timer);
_timer = setTimeout(function(){
sort.apply(ths.dragElements, [e]);
}, 80);
}
}
function dragStop(e) {
if(self.isDragging && self.sorted) {
self.direction = self.startIndex < self.stopIndex ? 'forward' : 'backward';
self.startIndex = self.startIndex;
if(_dragElements) _dragElements[0].stopIndex = self.stopIndex;
self.dispatchEvent(REORDER_STOP, {dragElements:_dragElements, stopIndex:self.stopIndex});
self.isDragging = false;
self.sorted = false;
self.update();
}
}
function setZindex() {
var i = self.group.length;
while(i--) {
var item = self.group[i];
if(_dragElements.indexOf(item) === -1) {
item.zIndex = 2;
} else {
item.zIndex = 3;
}
}
}
self.update = function() {
var i = self.group.length;
while(i--) {
var item = self.group[i];
item.startIndex = i;
if(item.drag && item.drag.dragElements) {
item.drag.addEventListener(DRAG_START, dragStart);
item.drag.addEventListener(DRAG_MOVE, dragMove);
item.drag.addEventListener(DRAG_STOP, dragStop);
}
}
};
return self;
}
function Tile(vars) {
vars = vars || {}
var self = this
var items = []
var colIdx
var rowIdx
var cols = []
var rows = []
var masonryGaps = []
self.axis = vars.axis || 'y'
self.perpLength = vars.perpLength || 300
self.align = vars.align || 'left'
self.wrap = vars.wrap || true
self.hGap = firstValid(vars.hGap, vars.gap, 0)
self.vGap = firstValid(vars.vGap, vars.gap, 0)
self.width = 0
self.height = 0
self.horizontalMasonry = vars.horizontalMasonry
self.masonryFill = vars.masonryFill
self.isWrap = false
self.items = items
self.maintainOrder = vars.maintainOrder
self.lastRowGap = vars.lastRowGap || false // remove the last gap by default
// to map legacy gap to new h/vGap
Object.defineProperty(self, 'gap', {
get: function () {
return this.hGap
},
set: function (value) {
this.hGap = value
this.vGap = value
}
})
self.layoutItems = function() {
colIdx = -1
rowIdx = -1
cols = Array.apply(null, Array(self.numberOfColumns || 1))
.map(function () { return {size:0, ids:[]} })
rows = [{size:0, gapRowSize:0, ids:[], gapRowIds:[], doubleSizeIds:[]}]
masonryGaps = []
var i = 0
var l = items.length
var minColIdx
var minRowIdx
var savedColWidthDiff = 0
for(i; i < l; i++) {
var itemPlacedInGap = self.maintainOrder ? false : placeItemInGap(i)
if(itemPlacedInGap === false) {
incrementGridArrays(i)
rowIdx = rowIdx < 0 ? 0 : rowIdx
colIdx = colIdx < 0 ? 0 : colIdx
// to keep track of the size of axis
if(!cols[colIdx] && !self.numberOfColumns) cols[colIdx] = {size:0, ids:[]}
if(!rows[rowIdx]) rows[rowIdx] = {size:0, gapRowSize:0, ids:[], gapRowIds:[], doubleSizeIds:[]}
// for masonry behavior this allows us to locate the next shortest column
// otherwise just return the next index
minColIdx = self.axis === 'y' && !self.maintainOrder ? minIndex(colIdx, cols) : colIdx
minRowIdx = self.axis === 'y' ? rowIdx : minIndex(rowIdx, rows)
var itemPlacedInGap = false
var itemWidth = items[i].isDoubleSize ? Math.round((items[i].width - self.hGap) * 0.5) : items[i].width
itemWidth = self.gridWidths || itemWidth
var rowX = minColIdx * (itemWidth + self.hGap)
var itemHeight = items[i].isDoubleSize ? Math.round((items[i].height - self.vGap) * 0.5) : items[i].height
if(self.horizontalMasonry || self.axis === 'x' || (self.axis === 'y' && self.maintainOrder)) rowX = rows[minRowIdx].size
// not using minRowIdx colY calc because no tiles wrap in the x axis
// var colY = minRowIdx * (itemHeight + self.vGap)
var colY = cols[minColIdx].size
rows[minRowIdx].size += items[i].width + self.hGap
if(items[i].isDoubleSize) {
rows[minRowIdx].doubleSizeIds.push(i)
rows[minRowIdx].gapRowIds.push(i)
}
rows[minRowIdx].ids.push(i)
var curRow = rows[minRowIdx]
if(self.horizontalMasonry && self.isWrap) {
// horizontal masonry
// when even row height, keep track of cols on 1st rowIdx
cols[minColIdx].ids.push(i)
var prevRowIdx = minRowIdx - 1
var gapSize = Math.max(0, self.perpLength - rows[prevRowIdx].gapRowSize)
// to place the "y" of the gap half way down the double sized image
var rowHeight = getRowHeight(rows[prevRowIdx])
var hasDoubleHeight = rowHasDoubleSize(rows[prevRowIdx])
if(hasDoubleHeight) {
var halfDoubleHeight = Math.round((rowHeight) * 0.5)
if(!self.maintainOrder) {
masonryGaps.push({
rowId: prevRowIdx,
gapType:'right',
x: rows[prevRowIdx].gapRowSize,
y: cols[0].size + halfDoubleHeight + self.vGap,
size: gapSize
})
}
}
if(!self.maintainOrder) {
masonryGaps.push({
rowId: prevRowIdx,
gapType:'top',
x: rows[prevRowIdx].size,
y: colY,
size: Math.max(0, self.perpLength - rows[prevRowIdx].size)
})
}
if(items[i].isDoubleSize) {
rows[minRowIdx].gapRowSize += items[i].width + self.hGap
}
if(hasDoubleHeight) {
cols[minColIdx].size += (rowHeight + self.vGap) + self.vGap
} else {
cols[minColIdx].size += rowHeight + self.vGap
}
colY = cols[minColIdx].size
var remainingTotalWidth = items.slice(i)
.map(function(item) {
return item.width + self.hGap
})
.reduce(sum, 0)
self.isLastRow = items[i].width + remainingTotalWidth - self.hGap < self.perpLength
if(self.isLastRow) {
itemPlacedInGap = placeItemInGap(i)
if(itemPlacedInGap) {
rows[minRowIdx].size -= items[i].width + self.hGap
var idx = rows[minRowIdx].ids.indexOf(i)
rows[minRowIdx].ids.splice(idx, 1)
}
}
} else if(self.horizontalMasonry) {
// all but first item in row (isWrap true), or last item in items array'
if(items[i].isDoubleSize) {
// if(!rows[minRowIdx + 1]) rows[minRowIdx + 1] = {size:0, ids:[]}
// left of image gap
var gapSize = Math.max(0, rowX - rows[minRowIdx].gapRowSize)
// to place the "y" of the gap half way down the double sized image
var halfDoubleHeight = Math.round((items[i].height - self.vGap) * 0.5)
if(!self.maintainOrder) {
masonryGaps.push({
rowId: minRowIdx,
gapType:'left',
x: rows[minRowIdx].gapRowSize,
y: cols[0].size + halfDoubleHeight + self.vGap,
size: gapSize
})
}
rows[minRowIdx].gapRowSize += gapSize + items[i].width + self.hGap
}
} else if(!self.horizontalMasonry) {
if(self.wrap) {
// vertical masonry fill
// this is necessary because the masonry fill width calc in ThumbsModule isnt always a whole number
// so the last column will have a unsightly gap
// the savedColWidthDiff is fixing the width but not the height so the image is distorted
// to make this correct we need to also scale the height of the image ... according to the image ratio
if(isLastColumn(minColIdx, self.numberOfColumns) && vars.name === 'thumbs') {
// dont check until all columns have been defined
if(items[i].isDoubleSize) {
items[i].width = self.gridWidths + self.hGap + self.lastColumnWidth
// should be scaled vertically in correct ratio
} else {
items[i].width = self.lastColumnWidth
// should be scaled vertically in correct ratio
}
}
}
if(self.wrap && vars.name === 'thumbs' && self.numberOfColumns > 1 && items[i].isDoubleSize) {
// define the scenarios for double thumbnail size
//
// NOTES:
// maintain order breaks layout with isDoubleSize
// non-maintain order works sorta except for when the double size is in the last column
// we don't yet know how to handle the double size in the last column
//
if(isLastColumn(minColIdx, self.numberOfColumns)) {
// last column scenarios
// to resolve the x we need to set to itemsx
// to resolve
//var prevItem = cols[minColIdx - 1].ids.slice(-1)
var item = items[i]
var curColSize = cols[minColIdx].size
var prevColSize = cols[minColIdx - 1].size
var prevRowX = (minColIdx - 1) * (itemWidth + self.hGap)
rowX = setPos('x', prevRowX, itemWidth)
if(prevColSize <= curColSize) {
// item.y stays the same
// current column size gets item.height added
// prev min column gets item.height plus difference
var delta = curColSize - prevColSize
masonryGaps.push({
x: setPos('x', prevRowX, itemWidth),
y: prevColSize,
size: delta,
isLastColumn: true
})
cols[minColIdx].size += item.height + self.vGap
cols[minColIdx - 1].size += item.height + delta + self.vGap
} else {
// get the delta between prev col size and item.y
// item.y set to prev col size
// prev col size gets item.height
// current col size get item.height plus delta
var delta = prevColSize - curColSize
var curRowX = minColIdx * (itemWidth + self.hGap)
masonryGaps.push({
x: setPos('x', curRowX, itemWidth),
y: cols[minColIdx].size,
size: delta,
isLastColumn: true
})
colY = prevColSize
cols[minColIdx - 1].size += item.height + self.vGap
cols[minColIdx].size += item.height + delta + self.vGap
}
cols[minColIdx].ids.push(i)
} else {
// last column scenarios
// other column scenarios
// get max height of current & next columns
// to place current y position
// increment colIdx & colIdx + 1 by current item height
var heightOffset = 0
if(cols[minColIdx + 1] && cols[minColIdx + 1].size > cols[minColIdx].size) {
// offset value
heightOffset = (cols[minColIdx + 1].size - cols[minColIdx].size)
masonryGaps.push({
x: setPos('x', rowX, itemWidth),
y: cols[minColIdx].size,
size: heightOffset
})
colY = cols[minColIdx + 1].size
}
cols[minColIdx].size += items[i].height + self.vGap + heightOffset
if(!cols[minColIdx + 1]) cols[minColIdx + 1] = {size:0, ids:[]}
cols[minColIdx + 1].size += items[i].height + self.vGap
}
cols[minColIdx].ids.push(i)
} else {
// normal grid and vertical masonry
cols[minColIdx].ids.push(i)
cols[minColIdx].size += items[i].height + self.vGap
}
}
if(itemPlacedInGap === false) {
items[i].x = setPos('x', rowX, itemWidth)
items[i].y = setPos('y', colY, itemHeight)
}
}
self.isWrap = false
}
// if hmasonry fill loop over all rows and scale
// longest row/gapRow to perpLength
// increase col size to include last row height for bounds check
// has to be outside the loop to handle last row bounds height
if(self.horizontalMasonry) {
var lastRowDeleted
if(rows[minRowIdx].ids.length === 0) {
// when item gets moved to gap row (placeItemInGap) then last row may have no ids
// if last row has no ids then dont add last row height
lastRowDeleted = rows.pop()
}
if(self.masonryFill && rows.length > 1) {
cols[0].size = 0
var perpLength = self.perpLength
var tolerance = perpLength * 0.5
var scalableItems
for(var i = 0, l = rows.length; i < l; i ++) {
scalableItems = JSON.parse(JSON.stringify(items))
var scaledRow = scaleRow(scalableItems, i, rows, perpLength, tolerance)
rows[i].ids
.concat(rows[i].gapRowIds)
.forEach(function(id) {
items[id] = scalableItems[id]
return items[id]
})
if(i !== l - 1) {
// dont increase col height for last row
cols[0].size += scaledRow.fullRowHeight + self.vGap
}
} // end of row loop
// cols[0].size -= self.vGap
}
// if(!lastRowDeleted) {
cols[minColIdx].size += lastRowHeight()
// }
}
self.width = maxBound(rows)
self.height = maxBound(cols)
// if we decide to subtract the gap for all rows
// then we need to fix the menu text hack for dropdown subs
if(self.horizontalMasonry) {
if(self.lastRowGap) self.height += self.vGap
} else {
if(!self.lastRowGap) self.height -= self.vGap
}
}
self.addItem = function(width, height, isDoubleSize, name) {
items.push({width:width, height:height, x:0, y:0, isDoubleSize:isDoubleSize, name:name})
}
self.setSize = function(index, width, height) {
items[index].width = width
items[index].height = height
}
self.getPosition = function(index) {
return items[index]
}
self.getBounds = function() {
return {width:self.width, height:self.height}
}
function scaleRowItems(self, curRow, curCol, rowItems, perpLength, newRowHeight) {
curRow.size = 0
rowItems
.forEach(function(item, idx) {
var isLast = idx === curRow.ids.length - 1
var hGap = isLast ? 0 : self.hGap
var fillToPerpLength = perpLength !== false
var newWidth = isLast && fillToPerpLength ? perpLength - curRow.size : Math.round(newRowHeight * (item.width/item.height))
item.width = newWidth
item.height = newRowHeight
item.x = curRow.size
item.y = curCol.size
curRow.size += item.width + hGap
})
}
function setPos(axis, axisSize, itemSize) {
if(self.wrap) {
return axisSize
} else {
return alignNoWrap(axis, axisSize, itemSize)
}
}
function alignNoWrap(axis, axisSize, itemSize) {
if((axis === 'x' && self.align === 'center') || (axis === 'y' && self.align === 'middle')) {
return (self.perpLength - itemSize) * 0.5
} else if((axis === 'x' && self.align === 'right') || (axis === 'y' && self.align === 'bottom')) {
return (self.perpLength - itemSize)
} else {
return axisSize
}
}
function incrementGridArrays(i) {
if(self.axis === 'y') {
var itemWidth = items[i].width
if(vars.name === 'thumbs' && /fill|vMasonry/.test(vars.type)) {
itemWidth = isLastColumn(colIdx + 1, self.numberOfColumns) ? self.lastColumnWidth : self.gridWidths
}
self.isWrap = (rows[rowIdx] && items[i] && rows[rowIdx].size + itemWidth > self.perpLength)
if(!self.wrap || self.isWrap) {
rowIdx += 1
colIdx = 0
} else if(self.wrap && !self.horizontalMasonry) {
colIdx += 1
}
} else {
if(!self.wrap || (cols[colIdx] && items[i] && cols[colIdx].size + items[i].height > self.perpLength)) {
colIdx += 1
rowIdx = 0
} else if(self.wrap) {
rowIdx += 1
}
}
}
function minIndex(index, arr) {
var i = arr.length
var min = arr[0] && arr[0].size ? arr[0].size : 0
while(i--) {
if(arr[0] && arr[i].size <= min) {
min = arr[i].size
index = i
}
}
return index
}
function maxBound(arr) {
var i = arr.length
var max = 0
while(i--) {
if(arr[i] && arr[i].size > max) max = arr[i].size
}
return max
}
function isLastColumn(curIdx, totalCols) {
return curIdx === totalCols - 1
}
function rowHasDoubleSize(row) {
return !!(row.ids
.filter(function(id) {
return items[id].isDoubleSize
}).length)
}
function getRowHeight(row) {
var rowFirstItem = items[row.ids[0]]
var itemHeight = rowFirstItem.isDoubleSize ? Math.round((rowFirstItem.height - self.vGap) * 0.5) : rowFirstItem.height
var isOnlyItem = row.ids.length === 1 && rowFirstItem.isDoubleSize
var gapCompensation = isOnlyItem ? self.vGap : 0
return rowHasDoubleSize(row) ? (itemHeight * 2) + gapCompensation : itemHeight
}
function placeItemInGap(i) {
if(masonryGaps.length) {
for(var g = 0, gapLen = masonryGaps.length; g < gapLen; g ++) {
var _gap = masonryGaps[g]
if(!items[i].isDoubleSize) {
if(self.horizontalMasonry) {
var itemSize = items[i].width + self.hGap
if(itemSize <= _gap.size) {
items[i].x = _gap.x
items[i].y = _gap.y
_gap.size -= itemSize
_gap.x += itemSize
if(_gap.gapType === 'top') {
rows[_gap.rowId].size += itemSize
rows[_gap.rowId].ids.push(i)
}
if(_gap.gapType === 'right') {
rows[_gap.rowId].gapRowSize += itemSize
rows[_gap.rowId].gapRowIds.push(i)
}
// gapType 'left' gap size already accounted for in row size
if(_gap.gapType === 'left') {
rows[_gap.rowId].gapRowIds.push(i)
}
return { index: i, rowId: _gap.rowId }
}
} else {
if(items[i].height + self.vGap <= _gap.size) {
// we found a spot for the item
// move the item to _gap.x/y
// subtract item.height + self.gap from _gap.height
// add item.height + self.gap to _gap.y
items[i].x = _gap.x
items[i].y = _gap.y
items[i].width = _gap.isLastColumn ? self.lastColumnWidth : items[i].width
// scale height to aspect ratio
_gap.size = _gap.size - (items[i].height + self.vGap)
_gap.y = _gap.y + items[i].height + self.vGap
return { index: i, rowId: _gap.rowId }
}
}
}
}
}
return false
}
function lastRowHeight() {
// increase col size to include last item height for bounds check
var row = rows[rows.length - 1]
var hasDoubleSize = rowHasDoubleSize(row)
if(row && row.ids.length) {
var rowHeight = getRowHeight(row)
return hasDoubleSize ? rowHeight + self.vGap : rowHeight
}
return 0
}
function sum(a, b) {
return a + b
}
function noMoreDblSize(i, doubleSizeIds) {
return !doubleSizeIds[i + 1]
}
function isMaxRow(rowTypeRegExp, maxRow) {
return rowTypeRegExp.test(maxRow)
}
function isLastItem(i, len) {
return i === len - 1
}
function xIsInRightGap(x, dblSizeItem, hGap) {
return x && dblSizeItem && x >= dblSizeItem.x + dblSizeItem.width + hGap
}
var lowPerpLength
var highPerpLength
var scaleRowCallCount = 0
function scaleRow(items, i, rows, perpLength, tolerance) {
// subtract last gap from row
var row = rows[i]
var rowSize = row.size - self.hGap
var gapRowSize = row.gapRowSize - self.hGap
row.scaledSize = 0
row.scaledGapRowSize = 0
if(i === rows.length - 1 && rowSize < tolerance) perpLength = rowSize
var topRowGaps = (row.ids.length - 1) * self.hGap
var gapRowGaps = (row.gapRowIds.length - 1) * self.hGap
var topRowWidth = rowSize - topRowGaps
var gapRowWidth = gapRowSize - gapRowGaps
var rowHasNoDoubleSize = row.doubleSizeIds.length === 0
var maxRow
var maxRowDiff
var maxWidth
var rowGapTotal
if(topRowWidth + topRowGaps > gapRowWidth + gapRowGaps) {
maxRow = 'top'
maxWidth = topRowWidth
rowGapTotal = topRowGaps
} else if(topRowWidth + topRowGaps < gapRowWidth + gapRowGaps) {
maxRow = 'gap'
maxWidth = gapRowWidth
rowGapTotal = gapRowGaps
} else {
maxRow = 'equal'
maxWidth = gapRowWidth
rowGapTotal = gapRowGaps
}
var rowHeight = getRowHeight(row)
var ratio = rowHeight / maxWidth
var newRowWidth = perpLength - rowGapTotal
var fullRowHeight = rowHasDoubleSize(row) ? (newRowWidth * ratio) + self.vGap : newRowWidth * ratio
var halfRowHeight = rowHasDoubleSize(row) ? Math.round((fullRowHeight - self.vGap) * 0.5) : fullRowHeight
var gapRowHeight = fullRowHeight - halfRowHeight - self.vGap
var prevRow = rows[i - 1]
var topRowY = 0
var gapRowY = halfRowHeight + self.vGap
if(prevRow) {
topRowY = cols[0].size
gapRowY = topRowY + halfRowHeight + self.vGap
}
for(var j = 0, idsLen = row.ids.length; j < idsLen; j ++) {
var item = items[row.ids[j]]
var prevItem = items[row.ids[j - 1]]
var height = item.isDoubleSize || rowHasNoDoubleSize ? fullRowHeight : halfRowHeight
var isLast = j === idsLen - 1
var newWidth = height * (item.width/item.height)
var nextX = prevItem ? prevItem.x + prevItem.width + self.hGap : 0
var remainder
if(/top|equal/.test(maxRow) && isLast && prevItem) {
remainder = Math.max(0, perpLength - (nextX + newWidth))
}
if(isLast && row.ids.length > 1) {
maxRowDiff = self.perpLength - (nextX + newWidth)
nextX = self.perpLength - newWidth
}
item.x = Math.round(nextX)
item.y = Math.round(topRowY)
item.height = Math.round(height)
item.width = Math.round(newWidth)
row.scaledSize = item.x + item.width
row.remainder = remainder
}
var curDblSizeId = 0
row.gapRowIds = row.gapRowIds
.map(function(id) {
items[id].id = id
return items[id]
})
.sort(function(a, b) {
return a.x < b.x ? -1 :
a.x > b.x ? 1 :
0
})
.map(function(item) {
return item.id
})
for(var k = 0, gapIdsLen = row.gapRowIds.length; k < gapIdsLen; k ++) {
var item = items[row.gapRowIds[k]]
var prevItem = items[row.gapRowIds[k - 1]]
var height = gapRowHeight
var isLast = isLastItem(k, gapIdsLen)
var newWidth = height * (item.width/item.height)
var nextX = prevItem ? prevItem.x + prevItem.width + self.hGap : 0
var remainder
var gapRowDiff
if(!item.isDoubleSize) {
if(isMaxRow(/gap|equal/, maxRow) && isLast) {
remainder = Math.max(0, perpLength - (nextX + newWidth))
}
if(isLast) {
gapRowDiff = self.perpLength - (nextX + newWidth)
if(isMaxRow(/gap/, maxRow)) maxRowDiff = gapRowDiff
nextX = self.perpLength - newWidth
}
item.x = Math.round(nextX)
item.y = Math.round(gapRowY)
item.height = Math.round(height)
item.width = Math.round(newWidth)
row.scaledGapRowSize = item.x + item.width
row.gapRemainder = remainder
}
}
row.fullRowHeight = Math.round(fullRowHeight)
row.maxRow = maxRow
if(maxRowDiff > 2 && scaleRowCallCount < 12) {
// too short
if(!lowPerpLength || lowPerpLength < perpLength) {
lowPerpLength = perpLength
}
var newPerpLength
if(highPerpLength) {
newPerpLength = (lowPerpLength + highPerpLength) / 2
} else {
newPerpLength = (maxRowDiff / 2) + perpLength
}
scaleRowCallCount++
return scaleRow(items, i, rows, newPerpLength, tolerance)
} else if(maxRowDiff < -2 && scaleRowCallCount < 12) {
// too long
if(!highPerpLength || highPerpLength > perpLength) {
highPerpLength = perpLength
}
var newPerpLength
if(lowPerpLength) {
newPerpLength = (lowPerpLength + highPerpLength) / 2
} else {
newPerpLength = (maxRowDiff / 2) + perpLength
}
scaleRowCallCount++
return scaleRow(items, i, rows, newPerpLength, tolerance)
return scale
} else {
// console.log('maxRowDiff && scale row calls', maxRowDiff, scaleRowCallCount)
lowPerpLength = undefined
highPerpLength = undefined
scaleRowCallCount = 0
return row
}
} // end of scaleRow
function getScaledPerpLength(scaledPerpLength, perpLength, scaledRowSize) {
var perpLengthComp = (scaledPerpLength * perpLength) / scaledRowSize
return (perpLengthComp - perpLength) * 0.85 + perpLength
}
}
function Timer(callback, duration, vars) {
var vars = vars || {},
scope = vars.scope || arguments.callee.caller || this,
count = vars.count || 1,
params = vars.params || [],
loop = vars.loop || false,
paused = true,
duration = (duration * 1000),
iterations = 0,
rAF,
startTime;
function step() {
currentTime = performance.now();
var elapsed = currentTime - startTime;
if(durationIsComplete(elapsed) && !paused) onComplete();
}
function onComplete() {
callback.apply(scope, params);
startTime = performance.now();
iterations++;
}
function durationIsComplete(elapsed) {
/*4 ms padding to elapsed (-2ms over duration or 2ms from duration)*/
var tolerance = 2,
timeRemaining = duration - elapsed;
/*check if timeRemaining meets duration threshold to return durationIsComplete true*/
if(timeRemaining < tolerance && timeRemaining > -tolerance) {
return true;
/*check if timeRemaining over shot duration threshold*/
} else if(timeRemaining < -tolerance) {
/*console.log('timer missed by', timeRemaining);*/
return true;
}
return false;
}
function loopCheck() {
if(loop && !paused) {
step();
rAF = requestAnimationFrame(loopCheck);
} else if(!loop) {
if(iterations < count) {
step();
rAF = requestAnimationFrame(loopCheck);
} else {
destroy();
}
}
}
function destroy() {
paused = true;
cancelAnimationFrame(rAF);
callback = undefined;
duration = undefined;
}
function start() {
paused = false;
startTime = performance.now();
rAF = requestAnimationFrame(loopCheck);
}
return {
start: start,
resume: start,
pause: function pause() { paused = true },
set duration(value) {
duration = (value * 1000);
},
get duration() {
return duration;
},
get paused() {
return paused
},
destroy: destroy
}
}
function Toggle(vars) {
this.state = vars.state || false;
this.target = vars.target;
this.onCb = vars.on;
this.offCb = vars.off;
this.on = function() {
this.onCb.call(this.target);
this.state = true;
};
this.off = function() {
this.offCb.call(this.target);
this.state = false;
};
this.flip = function() {
if(this.state) {
this.off();
} else {
this.on();
}
};
}
function Tooltip(vars) {
var v = vars || {},
self = this,
container = new Sprite(),
box = new Sprite(),
arw = new Sprite(),
txt = new Sprite(),
alpha = 0,
color = v.backgroundColor || 'rgba(0,0,0,0.7)',
arwColor = color,
fontColor = v.fontColor || '#FFFFFF',
fontFamily = v.fontFamily || 'Helvetica Neue, Arial, sans-serif',
fontSize = v.fontSize|| 11,
corRadius = v.cornerRadius || 4,
border = v.border || 'none',
gap = v.gap || 12,
padding = v.padding || 4,
shadow = v.shadow || true,
xPerc = 0,
yAxis = 80,
tipOffset = 0,
containerAboveOffset = 0,
containerBelowOffset = 0,
delay = vars.delay || 350,
delayTimer,
debug = false;
self.isShowing = false;
if(debug) {
arwColor = '#000000';
arw.backgroundColor = '#FFFFFF';
txt.fontColor = '#000000';
txt.backgroundColor = '#000000';
container.backgroundColor = '#000000';
}
txt.x = padding;
txt.y = padding;
txt.width = vars.width || 100;
txt.textAlign = 'center';
txt.fontColor = fontColor;
txt.fontFamily = 'Helvetica Neue';
txt.fontSize = fontSize;
/*txt.wordWrap = 'break-word';*/
box.x = gap;
box.y = gap;
box.borderRadius = corRadius;
box.border = border;
box.backgroundColor = color;
if(shadow) {
box.element.style.boxShadow = '0px 1px 3px rgba(0,0,0, 0.5)';
}
container.alpha = alpha;
container.overflow = 'hidden';
arw.w = 8;
arw.point = arw.w * 0.5;
arw.h = 6;
arw.borderRight = arw.point + 'px solid transparent';
arw.borderLeft = arw.point + 'px solid transparent';
box.addChild(txt);
container.addChild(box);
container.addChild(arw);
function update(e) {
txt.text = e.target.tooltip;
txt.alpha = 1;
box.width = txt.element.offsetWidth + (padding * 2);
box.height = txt.element.offsetHeight + (padding * 2);
container.width = box.width + (gap * 2);
container.height = box.height + (gap * 2);
containerAboveOffset = tipOffset + container.height + (gap * 0.5);
containerBelowOffset = tipOffset + gap;
}
function setXPos(e) {
xPerc = e.pageX / window.innerWidth;
var tipX = Math.round(container.width * xPerc);
if((tipX - arw.point - corRadius) < gap) {
arw.x = corRadius + gap;
container.x = e.pageX - (gap + arw.point + corRadius);
} else if((tipX + gap + arw.point + corRadius) > container.width) {
arw.x = (container.width - (gap + arw.width + corRadius));
container.x = (e.pageX - container.width) + gap + arw.point + corRadius;
} else {
arw.x = tipX - (gap - arw.width);
container.x = e.pageX - tipX;
}
}
function setYPos(e) {
if(e.pageY < yAxis) {
arw.borderTop = arw.h + 'px solid transparent';
arw.borderBottom = arw.h + 'px solid ' + arwColor;
container.y = e.pageY + containerBelowOffset;
arw.y = box.y - arw.height;
} else {
arw.borderBottom = arw.h + 'px solid transparent';
arw.borderTop = arw.h + 'px solid ' + arwColor;
container.y = e.pageY - containerAboveOffset;
arw.y = box.height + gap;
}
}
function move(e) {
container.transition = 0;
setXPos(e);
setYPos(e);
}
self.show = function(e) {
if(e.target.tooltip) {
container.transition = 0;
e.target.addEventListener(MOUSE_MOVE, move);
e.target.addEventListener(MOUSE_OUT, hide);
container.zIndex = 1000;
delayTimer = setTimeout(function() {
Tween(container, 0.35, {alpha: 1});
}, delay);
update(e);
self.isShowing = true;
}
};
function hide(e) {
if(delayTimer) clearTimeout(delayTimer);
e.target.removeEventListener(MOUSE_MOVE, move);
e.target.removeEventListener(MOUSE_OUT, hide);
container.transition = 0;
container.alpha = 0;
container.width = 0;
container.height = 0;
container.zIndex = 0;
self.isShowing = false;
}
self.hide = hide
stage.addChild(container);
}
function TouchNav(vars) {
var self = this,
moveDistanceX = 0,
originTouchX = 0,
originTouchY = 0,
touchStartPointX = 0,
touchStartPointY = 0,
quantize = 0,
swipeDirection,
touchMoves = 0,
lastPageX = 0,
lastPageY = 0,
touchTimeStart,
touchTimeEnd,
isMove = false,
container = vars.mediaViewContainer;
self.startdrag = false;
container.addEventListener(TOUCH_START, touchStart);
container.addEventListener(TOUCH_MOVE, touchMove, false);
container.addEventListener(TOUCH_END, touchEnd, false);
container.addEventListener(TOUCH_CANCEL, touchEnd, false);
function touchStart(e) {
if(e.touches.length === 1 && stage.zoom <= 1) {
self.startdrag = true;
originTouchX = e.touches[0].pageX;
originTouchY = e.touches[0].pageY;
touchStartPointX = e.touches[0].pageX - container.translateX;
touchStartPointY = e.touches[0].pageY - container.translateY;
startDeltaX = 0;
startDeltaY = 0;
touchTimeStart = new Date().getTime();
vars.events.dispatchEvent(TOUCH_NAVIGATION_START);
}
}
function touchMove(e) {
if(self.startdrag) {
var pageX = e.touches[0].pageX,
pageY = e.touches[0].pageY;
touchMoves++;
if(touchMoves < 20) {
swipeDirection = getSwipeDirection(pageX, pageY);
} else if(quantize === 2) {
swipeDirection = getSwipeDirection(pageX, pageY);
quantize = 0;
} else {
quantize++;
}
if(isSwipe(swipeDirection) && (!isMove || self.swipeDirection !== swipeDirection)) {
isMove = true;
}
self.swipeDirection = swipeDirection;
var navDir = self.swipeDirection === 'left' ? 'next' : 'prev';
if(swipeDirection === 'left') {
// allow vertical default for text page native scroll
e.preventDefault();
e.stopPropagation()
if(isSwipe(swipeDirection)) {
container.transition = 0;
container.translateX = pageX - touchStartPointX;
vars.events.dispatchEvent(TOUCH_NAVIGATION_MOVE, navDir);
}
} else if(!self.disabled && swipeDirection === 'right') {
// allow vertical default for text page native scroll
e.preventDefault();
e.stopPropagation()
if(isSwipe(swipeDirection)) {
container.transition = 0;
container.translateX = pageX - touchStartPointX;
vars.events.dispatchEvent(TOUCH_NAVIGATION_MOVE, navDir);
}
}
}
}
function isSwipe(dir) {
return (dir === 'left' || dir === 'right');
}
function getSwipeDirection(pageX, pageY) {
/*var deltaX = pageX - lastPageX,
deltaY = pageY - lastPageY;*/
var deltaX = pageX - originTouchX,
deltaY = pageY - originTouchY;
lastPageX = pageX;
lastPageY = pageY;
moveDistanceX = deltaX;
if(Mth.abs(deltaX) >= Mth.abs(deltaY)) {
return deltaX > 0 ? 'right' : 'left';
} else if(Mth.abs(deltaX) < Mth.abs(deltaY)) {
return deltaY > 0 ? 'down' : 'up';
}
return false;
}
function touchEnd(e) {
touchTimeEnd = new Date().getTime();
var flick = flickSpeed(touchTimeStart, touchTimeEnd, e.pageX - originTouchX);
vars.events.dispatchEvent(TOUCH_NAVIGATION_END, {
flickSpeed: flick,
isMove:isMove,
swipeDirection:self.swipeDirection
});
self.startdrag = false;
self.swipeDirection = false;
isMove = false;
sectionEnd = false;
touchMoves = 0;
}
function flickSpeed(start, end, moveDist) {
var slowest = 1,
fastest = 0.7,
flickSpeed = ((end - start) / Math.abs(moveDist));
if(flickSpeed > slowest) flickSpeed = slowest;
if(flickSpeed < fastest) flickSpeed = fastest;
return flickSpeed * 0.88;
}
function getTouchMoveThreshold() {
return Math.round(layoutCalcs.mediaView.width() * 0.02);
}
self.destroy = function() {
container.removeEventListener(TOUCH_START, touchStart);
container.removeEventListener(TOUCH_MOVE, touchMove, false);
container.removeEventListener(TOUCH_END, touchEnd, false);
container.removeEventListener(TOUCH_CANCEL, touchEnd, false);
};
}
function TouchNavMobile(vars) {
var self = this
var moveDistanceX = 0
var pageX = 0
var pageY = 0
var touchStartPointX = 0
var touchStartPointY = 0
var quantize = 0
var swipeDirection
var touchMoves = 0
var lastPageX = 0
var lastPageY = 0
var touchTimeStart
var touchTimeEnd
var isMove = false
var container = vars.mediaViewContainer
self.startdrag = false
container.addEventListener(TOUCH_START, touchStart, false)
container.addEventListener(TOUCH_MOVE, touchMove, false)
container.addEventListener(TOUCH_END, touchEnd, false)
container.addEventListener(TOUCH_CANCEL, touchEnd, false)
function touchStart(e) {
if(e.touches.length === 1 && stage.zoom <= 1) {
self.startdrag = true
touchStartPointX = e.touches[0].pageX
touchStartPointY = e.touches[0].pageY
touchTimeStart = new Date().getTime()
vars.events.dispatchEvent(TOUCH_NAVIGATION_START)
// alert(self.section) // getting "no section" here
}
}
function touchMove(e) {
if(self.startdrag && stage.zoom <= 1) {
pageX = e.touches[0].pageX
pageY = e.touches[0].pageY
touchMoves++
if(touchMoves < 20) {
swipeDirection = getSwipeDirection()
} else if(quantize === 2) {
swipeDirection = getSwipeDirection()
quantize = 0
} else {
quantize++
}
if(!self.disabled && isSwipe(swipeDirection)) {
// allow vertical default for text page native scroll
if(!isMove || self.swipeDirection !== swipeDirection) {
isMove = true;
}
e.preventDefault()
e.stopPropagation()
var items = container.children
var prevAsset = items[self.assetId - 1]
var curAsset = items[self.assetId]
var nextAsset = items[self.assetId + 1]
if(prevAsset) {
prevAsset.transition = 0
prevAsset.display = 'block'
prevAsset.alpha = 1
prevAsset.translateX = pageX - touchStartPointX - STATE.mediaView.width()
}
if(curAsset) {
curAsset.transition = 0
curAsset.display = 'block'
curAsset.alpha = 1
curAsset.translateX = pageX - touchStartPointX
var navDir = swipeDirection === 'left' ? 'next' : 'prev';
vars.events.dispatchEvent(TOUCH_NAVIGATION_MOVE, navDir)
}
if(nextAsset) {
nextAsset.transition = 0
nextAsset.display = 'block'
nextAsset.alpha = 1
nextAsset.translateX = pageX - touchStartPointX + STATE.mediaView.width()
}
}
self.swipeDirection = swipeDirection;
}
}
function isSwipe(dir) {
return (dir === 'left' || dir === 'right')
}
function getSwipeDirection() {
var deltaX = pageX - touchStartPointX
var deltaY = pageY - touchStartPointY
lastPageX = pageX
lastPageY = pageY
moveDistanceX = deltaX
if(Mth.abs(deltaX) >= Mth.abs(deltaY)) {
return deltaX > 0 ? 'right' : 'left'
} else if(Mth.abs(deltaX) < Mth.abs(deltaY)) {
return deltaY > 0 ? 'down' : 'up'
}
return false;
}
function touchEnd(e) {
if(self.startdrag && stage.zoom <= 1) {
touchTimeEnd = new Date().getTime()
var flick = flickSpeed(touchTimeStart, touchTimeEnd, pageX - touchStartPointX)
vars.events.dispatchEvent(TOUCH_NAVIGATION_END, {
flickSpeed:flick,
isMove:isMove,
swipeDirection:self.swipeDirection
})
self.startdrag = false
self.swipeDirection = false
isMove = false
sectionEnd = false
touchMoves = 0
pageX = 0
pageY = 0
}
}
function flickSpeed(start, end, moveDist) {
var slowest = 1
var fastest = 0.5
var flickSpeed = ((end - start) / Math.abs(moveDist))
if(flickSpeed > slowest) flickSpeed = slowest
if(flickSpeed < fastest) flickSpeed = fastest
return flickSpeed * 0.88
}
function getTouchMoveThreshold() {
return Math.round(layoutCalcs.mediaView.width() * 0.02)
}
self.destroy = function() {
container.removeEventListener(TOUCH_START, touchStart, false)
container.removeEventListener(TOUCH_MOVE, touchMove, false)
container.removeEventListener(TOUCH_END, touchEnd, false)
container.removeEventListener(TOUCH_CANCEL, touchEnd, false)
};
}
function Transition() {
}
function Popup(vars, info) {
var self = new ViewProxy({events:vars.events}),
blocker = new Sprite(),
updateSpeed = 0.35;
self.overflow = 'hidden';
self.events.addEventListener(RESIZE_END, function(e) {
self.resize();
});
init();
self.resize = function() {
Tween(blocker, updateSpeed, {width:stage.width, height:stage.height});
centerDiv(Popup.plusDiv, updateSpeed);
centerDiv(Popup.likeDiv, updateSpeed);
};
function init() {
buildBlocker();
self.zIndex = 1000;
setTimeout(function() {
if(info.label.indexOf('like') > -1) {
buildLike();
} else {
buildPlusOne();
}
}, updateSpeed * 1000);
}
function buildPlusOne() {
buildPlusOneDiv();
injectPlusOneScript();
}
function buildLike() {
buildLikeDiv();
injectLikeScript();
}
function injectLikeScript() {
if(!document.getElementById('likesrc')) {
var fileref = document.createElement('script');
fileref.setAttribute('id', 'likesrc');
fileref.setAttribute("type", "text/javascript");
fileref.setAttribute("src", 'https://connect.facebook.net/en_US/all.js#xfbml=1');
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
function injectPlusOneScript() {
if(!document.getElementById('plus1src')) {
var fileref = document.createElement('script');
fileref.setAttribute('id', 'plus1src');
fileref.setAttribute("type", "text/javascript");
fileref.setAttribute("src", 'https://apis.google.com/js/plusone.js');
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
function buildPlusOneDiv() {
if(!Popup.plusDiv) {
var plusDiv = makeDiv('plus1', 100, 40);
plusDiv.overflow = 'hidden';
plusDiv.text = "";
var closeButton = makeCloseButton();
closeButton.x = plusDiv.width - 2;
closeButton.y = 2;
plusDiv.addChild(closeButton);
stage.addChild(plusDiv);
Popup.plusDiv = plusDiv;
Popup.plusClose = closeButton;
} else {
Popup.plusDiv.alpha = 0;
Popup.plusDiv.display = "block";
centerDiv(Popup.plusDiv, 0);
Popup.plusDiv.alpha = 1;
}
Popup.plusClose.addEventListener(CLICK, close);
}
function buildLikeDiv() {
if(!Popup.likeDiv) {
var likeDiv = makeDiv('like', 430, 40);
likeDiv.overflow = 'visible';
likeDiv.text = "";
var closeButton = makeCloseButton();
closeButton.x = likeDiv.width - 2;
closeButton.y = 2;
likeDiv.addChild(closeButton);
stage.addChild(likeDiv);
Popup.likeDiv = likeDiv;
Popup.likeClose = closeButton;
} else {
Popup.likeDiv.alpha = 0;
Popup.likeDiv.display = "block";
centerDiv(Popup.likeDiv, 0);
Popup.likeDiv.alpha = 1;
}
Popup.likeClose.addEventListener(CLICK, close);
}
function buildBlocker() {
blocker.backgroundColor = toRgba('#000000', 0.65);
blocker.width = stage.width;
blocker.alpha = 0;
blocker.addEventListener(CLICK, close);
self.addChild(blocker);
blocker.height = stage.height;
stage.addChild(self);
Tween(blocker, updateSpeed, {alpha:1});
}
function makeDiv(name, width, height) {
var div = new Sprite();
div.element.setAttribute('id', name);
div.backgroundColor = toRgba('#FFFFFF', 0.85);
div.x = (stage.width - width) * 0.5;
div.y = (stage.height - height) * 0.5;
div.width = width;
div.height = height;
div.paddingTop = 20;
div.paddingBottom = 2;
div.paddingLeft = 15;
div.zIndex = 2000;
return div;
}
function makeCloseButton() {
var button = new Svg();
button.width = 14;
button.height = 14;
button.rotate = 0;
var icon = new Path();
icon.id = 'icon';
icon.d = svgPaths.close;
icon.strokeWidth = 2;
icon.fill = 'none';
icon.stroke = '#555';
button.addChild(icon);
return button;
}
function centerDiv(div, speed) {
if(div && div.style.display === 'block') {
var centerX = (stage.width - div.width) * 0.5;
var centerY = (stage.height - div.height) * 0.5;
Tween(div, speed, {x:centerX, y:centerY});
}
}
function close(e) {
e.target.removeEventListener(CLICK, close);
Tween(blocker, updateSpeed, {alpha:0, onComplete:function() {
stage.removeChild(self);
}});
if(Popup.plusDiv) Popup.plusDiv.display = "none";
if(Popup.likeDiv) Popup.likeDiv.display = "none";;
}
return self;
}
var Anim = (function() {
/////////////////////
// EASING FORMULAS //
/////////////////////
var FRAME_DURATION = 1000 / 60
var ease = {
linear: function(t, b, c, d) {
return c*t/d + b
},
inQuad: function(t, b, c, d) {
t /= d
return c*t*t + b
},
outQuad: function(t, b, c, d) {
t /= d
return -c * t*(t-2) + b
},
inOutQuad: function(t, b, c, d) {
t /= d/2
if (t < 1) return c/2*t*t + b
t--
return -c/2 * (t*(t-2) - 1) + b
},
inCubic: function(t, b, c, d) {
t /= d
return c*t*t*t + b
},
outCubic: function(t, b, c, d) {
t /= d
t--
return c*(t*t*t + 1) + b
},
inOutCubic: function(t, b, c, d) {
t /= d/2
if (t < 1) return c/2*t*t*t + b
t -= 2
return c/2*(t*t*t + 2) + b
},
inQuart: function(t, b, c, d) {
t /= d
return c*t*t*t*t + b
},
outQuart: function(t, b, c, d) {
t /= d
t--
return -c * (t*t*t*t - 1) + b
},
inOutQuart: function(t, b, c, d) {
t /= d/2
if (t < 1) return c/2*t*t*t*t + b
t -= 2
return -c/2 * (t*t*t*t - 2) + b
},
inQuint: function(t, b, c, d) {
t /= d
return c*t*t*t*t*t + b
},
outQuint: function(t,b,c,d) {
t /= d
t--
return c*(t*t*t*t*t + 1) + b
},
inOutQuint: function(t,b,c,d) {
t /= d/2
if (t < 1) return c/2*t*t*t*t*t + b
t -= 2
return c/2*(t*t*t*t*t + 2) + b
},
inSine: function(t,b,c,d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b
},
outSine: function(t,b,c,d) {
return c * Math.sin(t/d * (Math.PI/2)) + b
},
inOutSine: function(t,b,c,d) {
return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b
},
inExpo: function(t,b,c,d) {
return c * Math.pow( 2, 10 * (t/d - 1) ) + b
},
outExpo: function(t,b,c,d) {
return c * ( -Math.pow( 2, -10 * t/d ) + 1 ) + b
},
inOutExpo: function(t,b,c,d) {
t /= d/2
if (t < 1) return c/2 * Math.pow( 2, 10 * (t - 1) ) + b
t--
return c/2 * ( -Math.pow( 2, -10 * t) + 2 ) + b
},
inCirc: function(t,b,c,d) {
t /= d
return -c * (Math.sqrt(1 - t*t) - 1) + b
},
outCirc: function(t,b,c,d) {
t /= d
t--
return c * Math.sqrt(1 - t*t) + b
},
inOutCirc: function(t,b,c,d) {
t /= d/2
if (t < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b
t -= 2
return c/2 * (Math.sqrt(1 - t*t) + 1) + b
}
}
function easy(type, b,c,d) {
var t = 0
var output = []
var tDelta = d - t
for(var i = 0, l = Math.round(tDelta / FRAME_DURATION); i < l; i++) {
t += FRAME_DURATION
output.push(ease[type](t,b,c-b,d))
}
output[output.length - 1] = c
return output
}
/////////////////
// COLOR UTILS //
/////////////////
function hexToRgbaValue(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i
.exec(hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function(m, r, g, b) {
return r + r + g + g + b + b
}))
return result ?
[parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16), 1]
.map(Math.round) :
null
}
function addAlphaChannel(rgb) {
return rgb.length < 4 ? rgb.concat([1]) : rgb
}
function toRgbaValue(str) {
return addAlphaChannel(
str.replace(/^rgb\(|^rgba\(/, '')
.replace(')', '')
.split(',')
.map(Number)
.map(Math.round)
)
}
function toColorValues(str) {
return /^#/.test(str) ?
hexToRgbaValue(str) :
toRgbaValue(str)
}
function valToHex(c) {
return c.toString(16).length === 1 ?
'0' + c.toString(16) :
c.toString(16)
}
function rgbToHex(rgb) {
return '#' + valToHex(rgb[0]) + valToHex(rgb[1]) + valToHex(rgb[2])
}
function hexToRgb(hex) {
var rgb = hexToRgbaValue(hex)
return 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')'
}
function hexToRgba(hex) {
var rgb = hexToRgbaValue(hex)
return 'rgba(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ',1)'
}
function rgbToRgba(rgb) {
var rgba = toRgbaValue(rgb)
return 'rgba(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ',' + rgba[3] + ')'
}
function toRgbaFromValues(values) {
var rgb = values.map(Math.round)
return 'rgba(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ',' + values[3] + ')'
}
//////////
// ANIM //
//////////
function applyValues(obj, steps, curStep) {
for(var key in steps) {
if(steps.hasOwnProperty(key)) {
if(key === 'scrollY') {
obj.scrollTo(obj.pageXOffset, steps[key][curStep])
} else if(key === 'scrollX') {
obj.scrollTo(steps[key][curStep], obj.pageYOffset)
} else {
obj[key] = steps[key][curStep]
}
}
}
}
function buildSteps(target, dur, props, easeType) {
var steps = {}
for(var key in props) {
if(props.hasOwnProperty(key)) {
if(/color/i.test(key)) {
var propColor = toColorValues(props[key])
var colorValues = toColorValues(target[key])
.map(function(c, i) {
return easy(easeType, c, propColor[i], dur)
})
var rs = colorValues[0]
var gs = colorValues[1]
var bs = colorValues[2]
var as = colorValues[3]
var colors = []
for(var i = 0, l = rs.length; i < l; i++) {
colors.push(toRgbaFromValues([rs[i],gs[i],bs[i],as[i]]))
}
steps[key] = colors
} else {
steps[key] = easy(easeType, target[key], props[key], dur)
}
}
}
return steps
}
function createRevStepper(inst, steps, cb) {
return function revStepper() {
var prop = Object.keys(steps)[0]
if(typeof inst.onUpdate === 'function') inst.onUpdate(inst.target)
if(steps[prop][inst.curStep] === undefined) {
inst.curStep = 0
cancelAnimationFrame(inst.rAF)
if(typeof cb === 'function') {
cb.apply(null, [inst])
}
} else {
applyValues(inst.target, steps, inst.curStep)
inst.curStep --
inst.rAF = requestAnimationFrame(revStepper)
}
}
}
function createStepper(inst, steps, cb) {
return function stepper() {
var prop = Object.keys(steps)[0]
if(typeof inst.onUpdate === 'function') inst.onUpdate(inst.target)
if(steps[prop][inst.curStep] === undefined) {
inst.curStep = inst.steps[prop].length - 1
cancelAnimationFrame(inst.rAF)
if(typeof cb === 'function') {
cb.apply(null, [inst])
}
} else {
applyValues(inst.target, steps, inst.curStep)
inst.curStep ++
inst.rAF = requestAnimationFrame(stepper)
}
}
}
function Anim(target, dur, props) {
var toProps = {}
for(var key in props) {
if(props.hasOwnProperty(key)) {
if(!/ease|onStart|onUpdate|onComplete/.test(key)) {
toProps[key] = props[key]
}
}
}
props.ease = props.ease || 'inOutQuad'
this.startTime = window.performance.now ?
(performance.now() + performance.timing.navigationStart) :
Date.now()
this.target = target
this.onUpdate = props.onUpdate
this.toProps = toProps
this.duration = dur * 1000
this.steps = buildSteps(this.target, this.duration, toProps, props.ease)
this.curStep = 0
if(typeof props.onStart === 'function') props.onStart.call(this)
}
Anim.prototype = {
rewind: function(cb) {
cancelAnimationFrame(this.rAF)
var _steps = JSON.parse(JSON.stringify(this.steps))
if(typeof this.onStart === 'function') this.onStart(this.target)
this.rAF = requestAnimationFrame(createRevStepper(this, _steps, cb))
},
play: function(cb) {
cancelAnimationFrame(this.rAF)
var _steps = JSON.parse(JSON.stringify(this.steps))
if(typeof this.onStart === 'function') this.onStart(this.target)
this.rAF = requestAnimationFrame(createStepper(this, _steps, cb))
},
reset: function(cb) {
this.play(function(inst) {
inst.curStep = 0
if(typeof cb === 'function') cb(inst)
})
},
kill: function() {
cancelAnimationFrame(this.rAF)
this.steps = null
this.rAF = null
},
stop: function() {
cancelAnimationFrame(this.rAF)
if(typeof this.onComplete === 'function') this.onComplete(this.target)
}
}
Anim.to = function(target, dur, props) {
var inst = new Anim(target, dur, props)
inst.play(props.onComplete)
return inst
}
return Anim
}())
function Tween(target, duration, vars) {
var delay = vars.delay || 0
var rAF
function init() {
if(vars.onInit) onInit()
setTimeout(complete, duration * 1000)
if(vars.onUpdate) rAF = requestAnimationFrame(update)
setTransition(duration)
var i; for(i in vars) {
if(!/delay|ease|overwrite|css|onComplete|onCompleteScope|onCompleteParams|onUpdate|onUpdateScope|onUpdateParams|onInit|onInitScope|onInitParams/.test(i)) {
setStyle(i, vars[i])
}
}
}
function onInit() {
vars.onInit.apply(vars.onInitScope || target, vars.onInitParams || [false])
}
function update() {
if(rAF) rAF = requestAnimationFrame(update)
vars.onUpdate.apply(vars.onUpdateScope || target, vars.onUpdateParams || [false])
}
function complete(e) {
if(rAF) cancelAnimationFrame(rAF)
if(vars.onComplete) vars.onComplete.apply(vars.onCompleteScope || target, vars.onCompleteParams || [false])
vars = {}
setTransition(0)
}
function setTransition(value) {
if(value) {
value = 'all ' + value + 's'
if(vars.ease) value += ' ' + vars.ease
} else {
value = ''
}
if(target && target.style) {
target.style.WebkitTransition = value
target.style.MozTransition = value
target.style.OTransition = value
target.style.transition = value
}
}
function setStyle(style, value) {
if(target && target.element) {
target[style] = value
} else if(target && target.style) {
target.style[style] = value
}
}
setTimeout(init, delay * 1000)
return {
destroy: function() {
delete vars.onComplete
}
}
}
Tween.defer = function(target, duration, vars) {
setTimeout(function(){
Tween(target, duration, vars)
}, 0)
}
function Bitmap(vars) {
vars = vars || {};
vars.type = 'img';
vars.className = 'Bitmap';
var bitmap = new Sprite(vars);
bitmap.element.style['user-select'] = 'none'
return bitmap
}
function Button(vars) {
vars = vars || {};
vars.type = 'button';
vars.className = 'Button';
var button = new Sprite(vars)
button.borderRadius = 0
button.enable = function() {
this.alpha = 1
this.element.removeAttribute('disabled');
}
button.disable = function() {
this.alpha = 0.25
this.element.setAttribute('disabled', true);
}
return button;
}
function ControllerProxy(vars) {
var proxy = vars || {};
proxy.events = proxy.events || new EventSandbox();
var template = {
listeners: proxy.events.listeners,
dispatchEvent: proxy.events.dispatchEvent,
addEventListener: proxy.events.addEventListener,
removeEventListener: proxy.events.removeEventListener
};
var i;
for(i in template) {
proxy[i] = template[i];
}
return proxy;
}
function EventSandbox() {
var _logAll = false;
function findInArray(needle, haystack) {
var i = haystack.length;
while(i--) {
if(needle.callback === haystack[i].callback && needle.target === haystack[i].target) {
return true;
}
}
return false;
}
return {
listeners: {},
addEventListener: function(type, callback) {
if(!this.listeners[type]) this.listeners[type] = [];
var newListener = {type:type, callback:callback, target:this};
if(!findInArray(newListener, this.listeners[type])) {
this.listeners[type].push(newListener);
}
},
removeEventListener: function(type, callback) {
if(!this.listeners[type]) {
/*console.error('removeEventListener: type not registered');*/
}
if(!callback || typeof callback !== 'function') {
delete this.listeners[type];
} else if(this.listeners[type]) {
var i = 0,
l = this.listeners[type].length;
for(;i < l; i ++) {
if(this.listeners[type][i] && this.listeners[type][i].callback === callback && this.listeners[type][i].target === this) {
this.listeners[type].splice(i, 1);
}
}
}
},
removeAllListeners: function(target) {
var i;
for(i in this.listeners) {
var j = 0,
l = this.listeners[i].length;
for(;j < l; j++) {
if(this.listeners[i][j] && this.listeners[i][j].target === target) {
this.listeners[i].splice(j, 1);
}
}
}
},
dispatchEvent: function(type, data) {
if(this.listeners[type]) {
for(var i = 0, l = this.listeners[type].length; i < l; i ++) {
if(this.listeners[type][i] && !this.listeners[type][i].callback) {
console.warn('VALID CALLBACK NOT FOUND ON LISTENER: ', this.listeners[type][i]);
break;
}
if(this.listeners[type][i] && this.listeners[type][i].target === this) {
if(_logAll) console.log(this.listeners[type][i]);
this.listeners[type][i].callback.apply(this.listeners[type][i].target, [data]);
}
}
}
},
set logAll(value) { _logAll = value; }
}
}
var globalEvents = new EventSandbox();
function Input(vars) {
vars = vars || {};
vars.type = 'input';
vars.className = 'Input';
var input = new Sprite(vars);
input.borderRadius = 0;
input.style['-webkit-appearance'] = 'none';
input.element.addEventListener('focus', function() {
if(BROWSER_NAME === 'Safari') document.webkitCancelFullScreen();
stage.disableKeyNavigation = true;
stage.activeFocus = input;
stage.isInputFocus = true
});
input.element.addEventListener('blur', function() {
stage.disableKeyNavigation = false;
stage.isInputFocus = false
});
return input;
}
function LoadingIndicator(vars) {
vars = vars || {};
var _type = vars.type || 'spinner',
_alpha = vars.alpha || 0.75,
_color = vars.color || '#FFFFFF';
var self = new Sprite();
self.width = 24;
self.height = 24;
self.alpha = _alpha;
self.overflow = 'hidden';
var png = new Bitmap();
png.width = 24;
png.height = 288;
if(_color === '#FFFFFF') {
png.src = ICONS + 'loader1.png';
} else {
png.src = ICONS + 'loader2.png';
}
self.addChild(png);
function move() {
if(_interval) {
if(png.y > -264) {
png.y -= 24;
} else {
png.y = 0;
}
}
}
var _interval = setInterval(move, 80);
self.removeLoader = function() {
clearInterval(_interval);
};
return self;
}
var Sprite = (function() {
var pixelValues = [ 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeatX', 'backgroundRepeatY', 'baselineShift', 'borderBottomLeftRadius', 'borderBottomRightRadius', 'borderBottomWidth', 'borderImageWidth', 'borderLeftWidth', 'borderRadius', 'borderRightWidth', 'borderSpacing', 'borderTopLeftRadius', 'borderTopRightRadius', 'borderTopWidth', 'borderWidth', 'bottom', 'fontSize', 'height', 'left', 'letterSpacing', 'lineHeight', 'margin', 'marginBottom', 'marginLeft', 'marginRight', 'marginTop', 'maxHeight', 'maxWidth', 'minHeight', 'minWidth', 'outlineOffset', 'outlineWidth', 'padding', 'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop', 'right', 'strokeWidth', 'textIndent', 'textLineThroughWidth', 'textOverlineWidth', 'textUnderlineWidth', 'top', 'width', 'wordSpacing' ];
function Sprite(_vars) {
this.vars = {};
var i;
for(i in _vars) this.vars[i] = _vars[i];
var el = this.vars.element || document.createElement(this.vars.type || 'div');
el.proxy = this;
this._private = {};
if(this.vars.id) this.id = this.vars.id;
this.element = el;
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
this.element.style['-webkit-backface-visibility'] = 'hidden'
}
if(BROWSER_NAME === 'Safari') {
this.element.style['-webkit-backface-visibility'] = 'hidden'
}
this.type = this.vars.type;
this.children = [];
this.style = el.style;
this.name = 'Sprite';
this.events = this.vars.events || globalEvents;
this.listeners = this.events.listeners;
if(!this.vars.selectable) this.selectable = false;
this.style.position = 'absolute';
this.style.display = 'block';
}
var properties = ["backfaceVisibility", "background", "backgroundAttachment", "backgroundBlendMode", "backgroundClip", "backgroundColor", "backgroundImage", "backgroundOrigin", "backgroundPosition", "backgroundPositionX", "backgroundPositionY", "backgroundRepeat", "backgroundRepeatX", "backgroundRepeatY", "backgroundSize", "border", "borderBottom", "borderBottomColor", "borderBottomLeftRadius", "borderBottomRightRadius", "borderBottomStyle", "borderBottomWidth", "borderCollapse", "borderColor", "borderImage", "borderImageOutset", "borderImageRepeat", "borderImageSlice", "borderImageSource", "borderImageWidth", "borderLeft", "borderLeftColor", "borderLeftStyle", "borderLeftWidth", "borderRadius", "borderRight", "borderRightColor", "borderRightStyle", "borderRightWidth", "borderSpacing", "borderStyle", "borderTop", "borderTopColor", "borderTopLeftRadius", "borderTopRightRadius", "borderTopStyle", "borderTopWidth", "borderWidth", "bottom", "boxShadow", "boxSizing", "bufferedRendering", "clear", "color", "content", "cursor", "direction", "display", "float", "font", "fontKerning", "fontSize", "fontStretch", "fontStyle", "fontVariant", "fontWeight", "height", "imageRendering", "left", "letterSpacing", "lineHeight", "listStyle", "listStyleImage", "listStylePosition", "listStyleType", "margin", "marginBottom", "marginLeft", "marginRight", "marginTop", "mask", "maskType", "maxHeight", "maxWidth", "maxZoom", "minHeight", "minWidth", "minZoom", "opacity", "order", "orientation", "outline", "outlineColor", "outlineOffset", "outlineStyle", "outlineWidth", "overflow", "overflowWrap", "overflowX", "overflowY", "padding", "paddingBottom", "paddingLeft", "paddingRight", "paddingTop", "page", "pageBreakAfter", "paintOrder", "pointerEvents", "position", "resize", "right", "size", "src", "stroke", "strokeDasharray", "strokeDashoffset", "strokeLinecap", "strokeLinejoin", "strokeMiterlimit", "strokeOpacity", "strokeWidth", "tabSize", "tableLayout", "textAlign", "textAnchor", "textDecoration", "textIndent", "textLineThroughColor", "textLineThroughMode", "textLineThroughStyle", "textLineThroughWidth", "textOverflow", "textOverlineColor", "textOverlineMode", "textOverlineStyle", "textOverlineWidth", "textRendering", "textShadow", "textTransform", "textUnderlineColor", "textUnderlineMode", "textUnderlineStyle", "textUnderlineWidth", "top", "transform", "transformOrigin", "transformStyle", "transition", "transitionDelay", "transitionDuration", "transitionProperty", "transitionTimingFunction", "userZoom", "verticalAlign", "visibility", "webkitBackfaceVisibility", "webkitBoxShadow", "webkitFilter", "webkitFontSmoothing", "webkitHighlight", "webkitTransformStyle", "webkitTransition", "webkitTransitionDelay", "webkitTransitionDuration", "webkitTransitionProperty", "webkitTransitionTimingFunction", "webkitUserDrag", "webkitUserModify", "webkitUserSelect", "whiteSpace", "width", "wordBreak", "wordSpacing", "wordWrap", "zIndex", "zoom"];
(function defineProperties (properties){
var CSSMatrix =
typeof CSSMatrix == 'function' ? CSSMatrix :
typeof MSCSSMatrix == 'function' ? MSCSSMatrix :
typeof WebKitCSSMatrix == 'function' ? WebKitCSSMatrix :
function() { console.log('CSSMatrix not supported') }
Sprite.prototype.dispatchEvent = function(type, data) {
this.events.dispatchEvent.apply(this, [type, data]);
};
Sprite.prototype.addEventListener = function(type, callback) {
var sprite = this;
var l = ELEMENT_EVENTS.length;
while(l--) {
if(type === ELEMENT_EVENTS[l]) {
this.element.addEventListener(type, this.event, false);
}
}
this.events.addEventListener.apply(this, [type, callback]);
};
Sprite.prototype.removeEventListener = function(type, callback) {
var sprite = this;
var l = ELEMENT_EVENTS.length;
while(l--) {
if(type === ELEMENT_EVENTS[l]) {
this.element.removeEventListener(type, this.event, false);
}
}
this.events.removeEventListener.apply(this, [type, callback]);
};
Sprite.prototype.removeAllListeners = function() {
this.events.removeAllListeners.call(this);
};
Sprite.prototype.addChild = function(child) {
this.element.appendChild(child.element);
child.parent = this;
this.children.push(child);
child.dispatchEvent(CHILD_ADDED, child);
};
Sprite.prototype.prependChild = function(child) {
this.element.insertBefore(child.element, this.element.firstChild);
child.parent = this;
this.children.unshift(child);
child.dispatchEvent(CHILD_ADDED, child);
};
Sprite.prototype.removeChild = function(child) {
if(child) {
if(child.events) child.events.removeAllListeners(child);
if(child.removeLoader) child.removeLoader();
if(child.element.parentNode) {
child.element.parentNode.removeChild(child.element);
}
var i = this.children.length;
while(i--) {
if(this.children[i] === child) {
this.children.splice(i, 1);
}
}
child = null;
}
};
Sprite.prototype.removeChildren = function(parent) {
if(parent && parent.children && parent.children.length > 0) {
var i = parent.children.length;
while(i--) {
this.removeChildren(parent.children[i]);
parent.removeChild(parent.children[i]);
}
}
};
Sprite.prototype.childAdded = function(child) {
var i = this.children.length;
while(i--) {
if(this.children[i].topParentName === 'Stage' && this.children[i] === child && this.children[i].dispatchEvent) {
this.children[i].dispatchEvent(CHILD_ADDED, this.children[i]);
}
}
};
Sprite.prototype.moveToTop = function(child) {
var highestZ = 0;
var i = this.children.length;
while(i--) {
if(this.children[i].zIndex >= highestZ && !this.children[i] === child) {
highestZ = this.children[i].zIndex + 1;
} else {
this.children[i].zIndex--;
}
}
child.zIndex = highestZ;
};
Sprite.prototype.event = function(e) {
if(!this.proxy._private.selectable && !TOUCH_DEVICE && this.proxy.vars.type !== 'input' && this.proxy.vars.type !== 'textarea' && this.proxy.vars.type !== 'button') {
// removed this due to custom html logo click preventDefault
// not really seeing how this benefits the system currently
// 6/29/2018
// e.preventDefault();
}
var event = {
type: e.type,
target:this.proxy,
currentTarget:this.proxy,
keyCode: e.which,
detail: e.detail,
pageX:e.pageX,
pageY:e.pageY,
clientX:e.clientX,
clientY:e.clientY,
offsetX:e.offsetX || e.layerX,
offsetY:e.offsetY || e.layerY,
mouseX: e.clientX - this.proxy.stageX,
mouseY: e.clientY - this.proxy.stageY,
preventDefault: function() {
e.preventDefault();
},
stopPropagation: function() {
e.stopPropagation();
},
dataTransfer: e.dataTransfer
};
if(e.touches) event.touches = e.touches;
this.proxy.dispatchEvent(e.type, event);
};
Sprite.prototype.hitTestPoint = function(xPoint, yPoint) {
if(!this._private.width) this._private.width = this.element.offsetWidth || this.element.scrollWidth || 0;
return this.style.display !== 'none' && xPoint >= this.stageX && xPoint <= this.stageX + this._private.width && yPoint >= this.stageY && yPoint <= this.stageY + this._private.height;
};
Sprite.prototype.hitTestAbs = function(xPoint, yPoint) {
return this.style.display !== 'none' && xPoint >= this.scrollAbsX && xPoint <= this.scrollAbsX + this._private.width && yPoint >= this.scrollAbsY && yPoint <= this.scrollAbsY + this._private.height;
};
Sprite.prototype.globalToLocal = function(point) {
return {x:point.x - this.stageX, y:point.y - this.stageY};
};
Sprite.prototype.localToGlobal = function(point) {
return {x:point.x + this.stageX, y:point.y + this.stageY};
};
Sprite.prototype.focus = function() {
stage.activeFocus = this;
if(this.vars.type === 'input' || this.vars.type === 'textarea' || this.vars.type === 'button') this.element.focus();
};
Sprite.prototype.blur = function() {
if(this.vars.type === 'input' || this.vars.type === 'textarea' || this.vars.type === 'button') this.element.blur();
};
Sprite.prototype.getClass = function() {
return this.element.className;
};
Sprite.prototype.setClass = function(value) {
return this.element.setAttribute('class', value);
};
properties.forEach (function(prop) {
if(!/width|height|fontSize|src|transition/.test(prop)) {
Object.defineProperty (Sprite.prototype, prop, {
get: function () { return this._private[prop] ; },
set: function (value) {
// if(/overflow/.test(prop) && this.name === 'SiteView') console.trace('site view overflow', value)
this._private[prop] = value;
this.element.style[prop] = pixelValues.indexOf(prop) > -1 ? value + 'px' : value;
}
});
}
});
Object.defineProperty(Sprite.prototype, 'fontFamily', {
get:function() {
return this.element.style.fontFamily;
},
set:function(val) {
if(val.indexOf(':') > -1) {
var fontProps = val.split(':')
var fontName = fontProps[0]
var fontWeight = fontProps[1]
this.fontWeight = fontWeight
this.element.style.fontFamily = fontName
this._private.fontFamily = fontName;
} else {
this.element.style.fontFamily = val
this._private.fontFamily = val;
}
}
});
Object.defineProperty(Sprite.prototype, 'scrollLeft', {
get:function() {
return this.element.scrollLeft;
},
set:function(val) {
this.element.scrollLeft = val;
}
});
Object.defineProperty(Sprite.prototype, 'scrollTop', {
get:function() {
return this.element.scrollTop;
},
set:function(val) {
this.element.scrollTop = val;
}
});
Object.defineProperty(Sprite.prototype, 'offsetLeft', {
get:function() {
return this.element.offsetLeft;
}
});
Object.defineProperty(Sprite.prototype, 'offsetTop', {
get:function() {
return this.element.offsetTop;
}
});
Object.defineProperty(Sprite.prototype, 'value', {
get:function() {
return this.element.value;
},
set:function(val) {
this.element.value = val;
}
});
Object.defineProperty (Sprite.prototype, 'topParentName', {
get: function() {
if(this.parent) {
return this.parent.topParentName;
}
return this.topParentName;
}
});
Object.defineProperty (Sprite.prototype, 'stageX', {
get: function() {
if(this.parent) {
var x = this.x > 0 ? this.x : this.translateX;
return this.parent.stageX + (x || 0);
}
return this.x;
}
});
Object.defineProperty (Sprite.prototype, 'stageY', {
get: function() {
if(this.parent) {
var y = this.y > 0 ? this.y : this.translateY;
return this.parent.stageY + (y || 0);
}
return this.y;
}
});
Object.defineProperty (Sprite.prototype, 'absX', {
get: function() {
var x = 0;
var el = this.element;
if (el.offsetParent) {
do {
var curTransform = new CSSMatrix(window.getComputedStyle(el).getPropertyValue('transform'));
x += el.offsetLeft + curTransform.m41;
} while (el = el.offsetParent);
}
return x;
}
});
Object.defineProperty (Sprite.prototype, 'absY', {
get: function() {
var y = 0;
var el = this.element;
if (el.offsetParent) {
do {
var curTransform = new CSSMatrix(window.getComputedStyle(el).getPropertyValue('transform'));
y += el.offsetTop + curTransform.m42;
} while (el = el.offsetParent);
}
return y;
}
});
Object.defineProperty (Sprite.prototype, 'scrollAbsX', {
get: function() {
var x = 0;
var el = this.element;
if (el.offsetParent) {
do {
var curTransform = new CSSMatrix(window.getComputedStyle(el).getPropertyValue('transform'));
x += el.offsetLeft + curTransform.m41 - el.scrollLeft;
} while (el = el.offsetParent);
}
return x;
}
});
Object.defineProperty (Sprite.prototype, 'scrollAbsY', {
get: function() {
var y = 0;
var el = this.element;
if (el.offsetParent) {
do {
var curTransform = new CSSMatrix(window.getComputedStyle(el).getPropertyValue('transform'));
y += el.offsetTop + curTransform.m42 - el.scrollTop;
} while (el = el.offsetParent);
}
return y;
}
});
Object.defineProperty (Sprite.prototype, 'src', {
get: function() {
return this._private.src;
},
set: function(value) {
if(value) {
this._private.src = value;
this.element.src = value;
} else {
console.trace(value);
}
}
});
Object.defineProperty (Sprite.prototype, 'text', {
get: function() {
return this._private.text;
},
set: function(value) {
this._private.text = value;
this.element.innerHTML = value;
}
});
Object.defineProperty (Sprite.prototype, 'textAlignVertical', {
get: function() {
return this._private.textAlignVertical;
},
set: function(value) {
this._private.textAlignVertical = value;
if(value === 'middle' || value === 'bottom') {
this.style.position = 'relative';
this.style.display = 'table-cell';
}
this.style.verticalAlign = value;
}
});
Object.defineProperty (Sprite.prototype, 'textWrap', {
get: function() {
return this._private.textWrap;
},
set: function(value) {
this._private.textWrap = value;
this.style.whiteSpace = value ? 'normal' : 'nowrap';
}
});
Object.defineProperty (Sprite.prototype, 'fontColor', {
get: function() {
return this._private.fontColor;
},
set: function(value) {
this._private.fontColor = value;
this.style.color = value;
}
});
Object.defineProperty (Sprite.prototype, 'selectable', {
get: function() {
return this._private.selectable;
},
set: function(value) {
this._private.selectable = value;
if(!this._private.selectable && this.vars.type !== 'input' && this.vars.type !== 'textarea') {
this.style.cursor = 'default';
this.style['-webkit-touch-callout'] = 'none';
this.style['-webkit-user-select'] = 'none';
this.style.MozUserSelect = 'none';
this.style['-ms-touch-callout'] = 'none';
this.style['user-select'] = 'none';
} else {
this.style.cursor = 'auto';
this.style['-webkit-touch-callout'] = 'text';
this.style['-webkit-user-select'] = 'text';
this.style.MozUserSelect = 'text';
this.style['-ms-touch-callout'] = 'text';
this.style['user-select'] = 'text';
}
}
});
Object.defineProperty (Sprite.prototype, 'alpha', {
get: function() {
return this._private.opacity;
},
set: function(value) {
this._private.opacity = value;
this.style.opacity = value;
}
});
Object.defineProperty (Sprite.prototype, 'x', {
get: function() {
return this._private.x || 0;
},
set: function(value) {
this._private.x = value;
this.style.left = value + 'px';
}
});
Object.defineProperty (Sprite.prototype, 'y', {
get: function() {
return this._private.y || 0;
},
set: function(value) {
if(this.name === 'textinputpanel') console.trace('textinputvalue', value)
this._private.y = value;
this.style.top = value + 'px';
}
});
Object.defineProperty (Sprite.prototype, 'translate', {
get: function() {
return this._private.translate;
},
set: function(value) {
this._private.translate = value;
this._private.translateX = value[0];
this._private.translateY = value[1];
this.style['-webkit-transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
this.style['-ms-transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
this.style['transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
}
});
Object.defineProperty (Sprite.prototype, 'translateX', {
get: function() {
if(!isNaN(this._private.translateX)) {
return this._private.translateX;
} else {
var matrix = new TransformMatrix(this.element);
return Number(matrix.x) || 0;
}
},
set: function(value) {
this._private.translateX = value;
this._private.translateY = this._private.translateY || 0;
this.style['-webkit-transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
this.style['-ms-transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
this.style['transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
}
});
Object.defineProperty (Sprite.prototype, 'translateY', {
get: function() {
if(this._private.translateY) {
return this._private.translateY;
} else {
var matrix = new TransformMatrix(this.element);
return Number(matrix.y) || 0;
}
},
set: function(value) {
this._private.translateY = value;
this._private.translateX = this._private.translateX || 0;
this.style['-webkit-transform'] = 'translate(' + this._private.translateX + 'px,' +this._private.translateY + 'px)';
this.style['-ms-transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
this.style['transform'] = 'translate(' + this._private.translateX + 'px,' + this._private.translateY + 'px)';
}
});
Object.defineProperty (Sprite.prototype, 'translateZ', {
get: function() {
return this._private.translateZ;
},
set: function(value) {
this._private.translateZ = value;
this.style['-webkit-transform'] = 'translateZ(' + value + 'px)';
this.style['-ms-transform'] = 'translateZ(' + value + 'px)';
this.style['transform'] = 'translateZ(' + value + 'px)';
}
});
Object.defineProperty (Sprite.prototype, 'translate3d', {
get: function() {
if(this._private.translate3d) {
return this._private.translate3d;
} else {
var matrix = new TransformMatrix(this.element);
return [matrix.x, matrix.y, matrix.z] || 0;
}
},
set: function(value) {
this._private.translate3d = value;
this._private.translateX = value[0] || 0;
this._private.translateY = value[1] || 0;
this._private.translateZ = value[2] || 0;
this.style['-webkit-transform'] = 'translate3d(' + value[0] + 'px,' + value[1] + 'px,' + value[2] + 'px)';
this.style['-ms-transform'] = 'translate3d(' + value[0] + 'px,' + value[1] + 'px,' + value[2] + 'px)';
this.style['transform'] = 'translate3d(' + value[0] + 'px,' + value[1] + 'px,' + value[2] + 'px)';
}
});
Object.defineProperty (Sprite.prototype, 'rotate', {
get: function() {
return this._private.rotate;
},
set: function(value) {
this._private.rotate = value;
this.style['-webkit-transform'] = 'rotate('+value+'deg)';
this.style['-moz-transform'] = 'rotate('+value+'deg)';
this.style['-o-transform'] = 'rotate('+value+'deg)';
this.style.transform = 'rotate('+value+'deg)';
}
});
Object.defineProperty (Sprite.prototype, 'width', {
get: function() {
this._private.width = this._private.width || 0;
return this._private.width;
},
set: function(value) {
if(value < 0) value = 0;
this._private.width = value;
this.style.width = value + 'px';
}
});
Object.defineProperty (Sprite.prototype, 'height', {
get: function() {
this._private.height = this._private.height || 0;
return this._private.height;
},
set: function(value) {
// if(this.id === 'pageViewMask') console.trace('page view mask height set:', value)
if(value < 0) value = 0;
this._private.height = value;
this.style.height = value + 'px';
}
});
Object.defineProperty (Sprite.prototype, 'numChildren', {
get: function() {
return this.children.length;
}
});
Object.defineProperty (Sprite.prototype, 'fontSize', {
get: function() {
return this._private.fontSize;
},
set: function(value) {
this._private.fontSize = value;
if(isNaN(value) && value.search('%') > -1) {
this.style.fontSize = value;
} else if(isNaN(value) && value.search('px') > -1) {
this.style.fontSize = value;
} else if(!isNaN(value)) {
this.style.fontSize = value + 'px';
} else {
this.style.fontSize = value;
}
}
});
Object.defineProperty (Sprite.prototype, 'transition', {
get: function() {
return this._private.transition
},
set: function(value) {
this._private.transition = value
if(value) {
value = 'all ' + value + 's cubic-bezier(1, 0, 0.3, 1)'
this.style.WebkitTransition = value
this.style.MozTransition = value
this.style.OTransition = value
this.style.transition = value
} else {
this.style.WebkitTransitionProperty = 'none'
this.style.MozTransitionProperty = 'none'
this.style.OTransitionProperty = 'none'
this.style.transitionProperty = 'none'
}
}
});
Object.defineProperty (Sprite.prototype, 'isInViewport', {
get: function() {
var viewportWidth = window.innerWidth
var viewportHeight = window.innerHeight
var viewportBuffer = 100
var viewportRect = {
x: 0,
y: 0,
width: viewportWidth * 2,
height: viewportHeight * 2
}
var childRect = this.element.getBoundingClientRect()
// for IE and Edge browsers
childRect.x = childRect.x || childRect.left
childRect.y = childRect.y || childRect.top
return isCollision(viewportRect, childRect)
}
});
})(properties);
return Sprite;
})();
function Stage() {
var _selectable = false,
_zoom = 1,
_private = {};
var name = 'Stage';
var siteLoaded
var stage = {
children: [],
dragElements: [],
activeFocus:undefined,
isInputFocus:undefined,
element:document.body,
listeners: globalEvents.listeners,
dispatchEvent: globalEvents.dispatchEvent,
addEventListener: globalEvents.addEventListener,
removeEventListener: globalEvents.removeEventListener,
addChild: function(child) {
if(!child.element.parentNode) {
document.body.appendChild(child.element);
}
child.parent = this;
this.children.push(child);
child.dispatchEvent(CHILD_ADDED, child);
},
get topParentName() {
return name;
},
addChildAt: function(child, index) {
},
removeChild: function(child) {
if(child.events) child.events.removeAllListeners(child);
if(child.removeLoader) child.removeLoader();
if(child.element.parentNode) {
document.body.removeChild(child.element);
}
var i = this.children.length;
while(i--) {
if(this.children[i] === child) {
this.children.splice(i, 1);
}
}
child = null;
},
removeChildren: function(parent) {
if(parent && parent.children && parent.children.length > 0) {
var i = parent.children.length;
while(i--) {
this.removeChildren(parent.children[i]);
parent.removeChild(parent.children[i]);
}
}
},
moveToTop: function(child) {
var highestZ = 0;
var i = this.children.length;
while(i--) {
if(this.children[i].zIndex >= highestZ && !this.children[i] === child) {
highestZ = this.children[i].zIndex + 1;
} else {
this.children[i].zIndex--;
}
}
child.zIndex = highestZ;
},
domContentLoaded: function() {
if(!siteLoaded) {
setTimeout(function() {
// this setTimeout is here due to safari's font load rendering delay 6-26-2017
// if(!stage.hasParallax && /* parallax is on*/ false) {
// parallax.init()
// stage.hasParallax = true
// } else if(/* parallax is on */ false){
// parallax.update()
// }
stage.element = document.body;
if(!_selectable) {
document.body.style.overflow = 'hidden';
}
document.body.style.margin = 0;
document.body.style.padding = 0;
stage.dispatchEvent(LOAD, stage);
}, 10)
siteLoaded = true
}
},
documentReadyListener: function() {
var allFonts = [
LAYOUT_MODEL.captionFont,
LAYOUT_MODEL.contactFont,
LAYOUT_MODEL.contactTitleFont,
LAYOUT_MODEL.copyrightFont,
LAYOUT_MODEL.logoFont,
LAYOUT_MODEL.menuFont,
LAYOUT_MODEL.navbarFont,
LAYOUT_MODEL.pageTextFont,
LAYOUT_MODEL.pageTitleFont,
LAYOUT_MODEL.thumbnailTitleFont,
LAYOUT_MODEL.thumbnailTitleBlockFont || ''
];
if(LAYOUT_MODEL.menuIconFont) {
allFonts.push(LAYOUT_MODEL.menuIconFont)
}
if(!isAdmin && LAYOUT_MODEL.menuFontMobile) {
allFonts.push(LAYOUT_MODEL.menuFontMobile)
}
if(!isAdmin && LAYOUT_MODEL.menuFontTablet) {
allFonts.push(LAYOUT_MODEL.menuFontTablet)
}
if(!isAdmin && LAYOUT_MODEL.mobileLogoFont) {
allFonts.push(LAYOUT_MODEL.mobileLogoFont)
}
if(!isAdmin && LAYOUT_MODEL.tabletLogoFont) {
allFonts.push(LAYOUT_MODEL.tabletLogoFont)
}
function objToArray(obj) {
return Object.keys(obj).map(function(key) { return obj[key] })
}
function getSectionFonts(sections) {
return sections
.reduce(function(acc, section) {
if(section && section.override) {
if(section.overrides.captionFont) acc.push(section.overrides.captionFont)
if(section.overrides.pageTextFont) acc.push(section.overrides.pageTextFont)
if(section.overrides.pageTitleFont) acc.push(section.overrides.pageTitleFont)
}
if(section && section.thumb && section.thumb.titleFont) acc.push(section.thumb.titleFont)
return acc
}, [])
}
function onlyUnique(val, idx, arr) {
return arr.indexOf(val) === idx
}
function isNotSysFont(val, idx, arr) {
var info = getFontData(val)
return info.service !== 'system'
}
function getFontConfigs(fontlist) {
return fontlist.reduce(function(cfg, str) {
if(!str) return cfg;
var info = getFontData(str);
if(info && info.family && info.weight && info.charset && info.service) {
if(!cfg[info.service]) {
cfg[info.service] = { families:[] };
}
var family = info.family
var weight = info.weight.join(',');
var charset = info.charset;
cfg[info.service].families.push(family + ':' + weight + ':' + charset);
} else {
console.warn('Font:', info, ' did not load')
}
return cfg;
}, {});
}
WebFontConfig = {
loading: function() {
},
fontloading: function(fontFamily, fontDescription) {
},
fontactive: function(fontFamily, fontDescription) {
},
fontinactive: function(fontFamily, fontDescription) {
},
active: function() {
stage.domContentLoaded();
stage.style = document.body.style;
stage.element = document.body;
},
inactive: function() {
stage.domContentLoaded();
stage.style = document.body.style;
stage.element = document.body;
}
};
var fonts = allFonts
.concat(getSectionFonts(objToArray(SECTIONS_MODEL)))
.filter(onlyUnique)
.filter(isNotSysFont)
var fontConfigs = getFontConfigs(fonts)
if(fontConfigs.google) WebFontConfig.google = fontConfigs.google
if(fontConfigs.typekit && SETTINGS_MODEL.typekitId) {
WebFontConfig.typekit = {
id: SETTINGS_MODEL.typekitId
}
}
if(fontConfigs.custom && SETTINGS_MODEL.customFonts.length) {
WebFontConfig.custom = fontConfigs.custom
// WebFontConfig.custom.urls = [SETTINGS_MODEL.cdnSslUri + '/css.' + SETTINGS_MODEL.revision + '.css']
WebFontConfig.custom.urls = ['https://' + window.location.host + '/css']
}
if(!WebFontConfig.custom && !WebFontConfig.google) {
stage.domContentLoaded();
stage.style = document.body.style;
stage.element = document.body;
}
},
globalToLocal: function (point) {
return {x:point.x, y:point.y};
},
localToGlobal: function (point) {
return {x:point.x, y:point.y};
},
event: function(e) {
var event = {
type:e.type,
target:e.target,
currentTarget:e.target,
x:e.x,
y:e.y,
keyCode:e.which,
pageX:e.pageX,
pageY:e.pageY,
screenX:e.screenX,
screenY:e.screenY,
clientX:e.clientX,
clientY:e.clientY,
mouseX:e.clientX - stage.stageX,
mouseY:e.clientY - stage.stageY,
deltaX:e.deltaX || -e.wheelDeltaX || 0,
deltaY:e.deltaY || -e.wheelDeltaY || 0,
preventDefault: function() {
e.preventDefault();
},
stopPropagation: function() {
e.stopPropagation();
},
dataTransfer: e.dataTransfer
};
if(e.touches) event.touches = e.touches;
if(e.type === WHEEL || e.type === MOUSE_WHEEL) {
event.type = MOUSE_WHEEL;
/*event.preventDefault(); was for FF scrolling */
}
if(e.type === RESIZE || e.type === GESTURE_CHANGE || e.type === GESTURE_END || e.type === ORIENTATION_CHANGE) {
if(window.visualViewport) {
_zoom = window.visualViewport.scale
} else {
_zoom = isPod() || isPad() ? document.documentElement.clientWidth / window.innerWidth : document.documentElement.clientHeight / window.innerHeight
}
_zoom = _zoom < 1 ? 1 : _zoom
}
if(Scrolls && e.clientX && e.clientY) {
Scrolls.hitMask(e.clientX, e.clientY);
}
if(/click|key|touch|down/.test(e.type)) {
stage.userInteraction = true
}
stage.dispatchEvent(e.type, event);
},
get disableScroll() {
return stage._disableScroll
},
set disableScroll(value) {
// only using this in MediaOverlay
// removed reference to disableScroll for bug #1517
// safari didnt like resetting the overflow x/y for some reason
// if needed, need to figure out why
stage._disableScroll = value
var html = document.getElementsByTagName('html')[0]
if(value) {
stage._previousOverflow = {x: document.body.style.overflowX, y: document.body.style.overflowY}
html.style.overflow = 'hidden'
stage.element.style.overflow = 'hidden'
} else {
html.style.overflow = 'initial'
if(stage._previousOverflow) {
stage.element.style.overflowX = stage._previousOverflow.x
stage.element.style.overflowY = stage._previousOverflow.y
}
}
},
get getChildren() {
return children;
},
get images() {
return document.images;
},
get forms() {
return document.forms;
},
get links() {
return document.links;
},
get anchors() {
return document.anchors;
},
get scripts() {
return document.scripts;
},
get plugins() {
return document.plugins;
},
get embeds() {
return document.embeds;
},
get width() {
var width = window.innerWidth
var nativeWidth = width * _zoom
// console.log('ORIENTATION', ORIENTATION)
// console.log('clientWidth', document.documentElement.clientWidth)
// console.log('innerWidth', window.innerWidth)
// console.log('_zoom', _zoom)
// console.log('width', width)
// console.log('nativeWidth', nativeWidth)
// console.log('stage.width', _zoom <= 1 ? nativeWidth : width)
return _zoom <= 1 ? nativeWidth : width
},
get height() {
var height = USER_AGENT !== MOBILE && isPod() && window.innerHeight === document.documentElement.clientHeight && window.innerWidth > window.innerHeight ? window.innerHeight + 81 : window.innerHeight
var nativeHeight = height * _zoom
return _zoom <= 1 ? nativeHeight : height
},
get stageX() {
return 0
// return -window.scrollX;
},
get stageY() {
return 0
// return -window.scrollY;
},
get scrollX() {
return _private.scrollX || window.scrollX;
},
set scrollX(val) {
_private.scrollX = val
},
get scrollY() {
return _private.scrollY || window.scrollY;
},
set scrollY(val) {
_private.scrollY = val
},
get selectable() {
return _selectable;
},
set selectable(value) {
_selectable = value;
},
get zoom() {
return _zoom;
},
set zoom(value) {
_zoom = value;
},
get backgroundColor() {
return _private.backgroundColor || document.body.style.backgroundColor;
},
set backgroundColor(value) {
_private.backgroundColor = value;
document.body.style.backgroundColor = value;
},
get transition() {
return _private.transition;
},
set transition(value) {
_private.transition = value;
value = value === 0 ? 'none' : 'all ' + value + 's';
document.body.style.WebkitTransition = value;
document.body.style.MozTransition = value;
document.body.style.OTransition = value;
document.body.style.transition = value;
},
get disableKeyNavigation() {
return _private.disableKeyNavigation;
},
set disableKeyNavigation(value) {
_private.disableKeyNavigation = value;
},
focus: function() {
stage.activeFocus = stage;
},
blur: function() {}
};
stage.proxy = stage;
/*********************************
* see if mac scrollbars present *
*********************************/
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
document.body.removeChild(scrollDiv);
MAC_SCROLLBARS = scrollbarWidth === 0 ? true : false
/***************************
* temp fix for minimal-ui *
***************************/
var debounce
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
debounce = createDebounce(200)
}
function resetScroll() {
if(debounce) {
debounce(function() {
if(stage.zoom <= 1 && !stage.isInputFocus) {
document.body.style['-webkit-overflow-scrolling'] = 'touch'
// due to contact form input getting reset on scroll events
// added this to ContactView
// window.scrollTo(0, 0)
}
})
}
}
window.addEventListener(ORIENTATION_CHANGE, function(e) {
// 200ms is the magic number for ios chrome orientation change
setTimeout(function() {
resetScroll()
stage.event(e)
}, 50)
}, false);
window.addEventListener(SCROLL, function(e) {
stage.scrollY = window.scrollY
// resetScroll()
stage.event(e)
}, false);
/***************************
* end fix for minimal-ui **
***************************/
window.addEventListener(TOUCH_START, stage.event, false);
window.addEventListener(TOUCH_MOVE, stage.event, false);
window.addEventListener(TOUCH_END, stage.event, false);
window.addEventListener(TOUCH_CANCEL, stage.event, false);
window.addEventListener(MOUSE_OVER, stage.event, false);
window.addEventListener(MOUSE_DOWN, stage.event, false);
window.addEventListener(MOUSE_MOVE, stage.event, false);
window.addEventListener(MOUSE_UP, stage.event, false);
window.addEventListener(MOUSE_OUT, stage.event, false);
window.addEventListener(CLICK, stage.event, false);
window.addEventListener(RESIZE, stage.event, false);
window.addEventListener(GESTURE_START, stage.event, false);
window.addEventListener(GESTURE_CHANGE, stage.event, false);
window.addEventListener(GESTURE_END, stage.event, false);
window.addEventListener(KEY_UP, stage.event, false);
window.addEventListener(KEY_DOWN, stage.event, false);
var resizeTimer, rotateTimer;
window.addEventListener(RESIZE, function(e) {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
if(isPod()) {
if(window.innerHeight > window.innerWidth) {
// is vertical
// stage.dispatchEvent(RESIZE_END, e);
} else {
// is horizontal
// stage.dispatchEvent(RESIZE_END, e);
}
} else {
stage.dispatchEvent(RESIZE_END, e);
}
}, 50);
}, false);
window.addEventListener(ORIENTATION_CHANGE, function(e) {
stage.dispatchEvent(ORIENTATION_CHANGE, e);
}, false);
window.addEventListener(WHEEL, stage.event, {passive:false});
window.addEventListener(MOUSE_WHEEL, stage.event, {passive:false});
stage.documentReadyListener();
return stage;
}
var stage = Stage.call(Stage);
function addChild(child) {
stage.addChild(child);
}
var svgPaths = {
navArrowRight:{
default:'M1.4,11.984l4.244-4.242L1.4,3.5',
thin:''
},
navArrowLeft:{
default:'M6.644,3.5L2.4,7.742l4.244,4.242',
thin:''
},
navArrowUp:{
default:'m 1.4562498,8.21905 5.1000001,-5.4 5.7000001,5.4',
thin:''
},
navArrowDown:{
default:'m 1.4562498,1.44405 5.1000001,5.4 5.7000001,-5.4',
thin:''
},
navFullscreen:{
default:'M0,0h15v9H0V0z M2,2v5h11V2H2z',
thin:'M1.5,1.5 L12.5,1.5 L12.5,7.5 L1.5,7.5 L1.5,1.5 z'
},
navShare:{
default:'M9.056,5.4 L9.056,3 L14.5,7.2 L9.056,11.4 L9.056,8.94 C5.167,8.94 2.444,9.9 0.5,12 C1.278,9 3.611,6 9.056,5.4 z',
thin:'M9.056,5.4 L9.056,3 L14.5,7.2 L9.056,11.4 L9.056,8.94 C5.167,8.94 2.444,9.9 0.5,12 C1.278,9 3.611,6 9.056,5.4 z'
},
navInfo:{
default:'M0.576,10.401c0.384,0.922,0.924,1.724,1.621,2.404c2.891,2.908,7.741,2.946,10.624,0c2.904-2.923,2.905-7.705,0-10.629 c-2.88-2.92-7.736-2.881-10.624,0c-0.738,0.715-1.274,1.525-1.607,2.43C-0.192,6.534-0.197,8.465,0.576,10.401 C0.959,11.324,0.192,9.479,0.576,10.401z M1.9,5.131c0.311-0.753,0.745-1.403,1.303-1.95c2.34-2.383,6.292-2.274,8.654,0 c2.316,2.448,2.284,6.187,0,8.643c-2.387,2.29-6.288,2.39-8.654,0c-0.543-0.542-0.985-1.207-1.329-1.994 c-0.293-0.738-0.44-1.528-0.44-2.371C1.435,6.661,1.59,5.885,1.9,5.131C2.211,4.378,1.59,5.885,1.9,5.131z M4.792,7.981 c0.562,0,1.844-0.876,2.245-0.566C7.531,7.798,6.011,9.726,5.89,9.94c-0.605,1.064-0.754,2.451,0.931,2.24 c1.02-0.128,2.904-0.903,3.41-1.88c0.232-0.451-2.039,0.442-2.189,0.278C7.69,10.194,8.925,8.421,9.058,8.096 C10.812,3.81,4.583,6.318,4.792,7.981C4.796,7.981,4.792,7.981,4.792,7.981z M8.151,4.869c0.465,0.459,1.194,0.432,1.651-0.025 c0.701-0.62,0.341-1.849-0.572-2.041C8.067,2.56,7.326,4.053,8.151,4.869C8.38,5.094,7.923,4.644,8.151,4.869z',
thin:'M7.5,12.5 C4.739,12.5 2.5,10.261 2.5,7.5 C2.5,4.739 4.739,2.5 7.5,2.5 C10.261,2.5 12.5,4.739 12.5,7.5 C12.5,10.261 10.261,12.5 7.5,12.5 z M7.5,5.694 L7.5,4.306 M7.5,10.37 L7.5,6.435'
},
navCart:{
default:'M 1.248,8.985 H 3.254 V 6.989 H 1.248 V 8.985 z M 0,0 1.05,5.992 h 9.235 L 11.271,0.966 13.248,0.968 13.256,0 H 0 z m 3.25,3.981 h -1 v -1 h 1 v 1 z M 3.25,2 h -1 V 1 h 1 v 1 z m 2,2 h -1 V 3 h 1 v 1 z m 0,-2 h -1 V 1 h 1 v 1 z m 2,1.979 h -1 v -1 h 1 v 1 z M 7.25,2 h -1 V 1 h 1 v 1 z m 2,1.979 h -1 v -1 h 1 v 1 z M 9.25,2 h -1 V 1 h 1 V 2 z M 7.252,9.007 H 9.25 V 7.002 H 7.252 v 2.005 z',
thin:'M3.673,7.806 C3.866,7.806 4.023,7.963 4.023,8.157 C4.023,8.35 3.866,8.507 3.673,8.507 C3.479,8.507 3.322,8.35 3.322,8.157 C3.322,7.963 3.479,7.806 3.673,7.806 z M10.034,1.526 L8.552,6.278 L2.701,6.278 L1.5,1.5 L11.542,1.5 M7.333,7.806 C7.139,7.806 6.982,7.963 6.982,8.157 C6.982,8.35 7.139,8.507 7.333,8.507 C7.527,8.507 7.684,8.35 7.684,8.157 C7.684,7.963 7.527,7.806 7.333,7.806 z',
},
navThumbs:{
default:'M0,3h7v4H0V3z M0,8h7v4H0V8z M8,3h7v4H8V3z M8,8h7v4H8V8z',
thin:'M1.5,3.5 L6.5,3.5 L6.5,6.5 L1.5,6.5 L1.5,3.5 z M8.5,3.5 L8.5,6.5 L13.5,6.5 L13.5,3.5 L8.5,3.5 z M1.5,8.5 L1.5,11.5 L6.5,11.5 L6.5,8.5 L1.5,8.5 z M8.5,8.5 L8.5,11.5 L13.5,11.5 L13.5,8.5 L8.5,8.5 z'
},
play:'M2,1l8,5.031L2,11V1z',
pause:'M2,2h3v8H2V2z M7,2h3v8H7V2z',
volume:'M2,7.5h1V10H2V7.5z M4,7h1v3H4V7z M6,6h1v4H6V6z M8,4h1v6H8V4z M10,2h1v8h-1V2z M0,8h1v2H0V8z',
mute:'M2,8h1v2H2V8z M4,8h1v2H4V8z M6,8h1v2H6V8z M8,8h1v2H8V8z M10,8h1v2h-1V8z M0,8h1v2H0V8z',
arrowLeft:'M 8.812269,1.1126749 2.1862736,7.2790289 8.876226,13.512325',
arrowRight:'M 1.0939806,1.1126749 7.719976,7.2790289 1.0300236,13.512325',
arrowUp:'M 1.1126747,8.812269 7.2790287,2.1862738 13.512325,8.876226',
arrowDown:'M 1.1126747,1.0939808 7.2790287,7.719976 13.512325,1.0300238',
arrowUpSmall:'M10.535,8.768L7,5.232L3.465,8.768',
arrowDownSmall:'M3.465,5.232L7,8.768l3.535-3.535',
arrowRightSmall:'M4.5,11.001L9.5,6l-5-5',
arrowLeftSmall:'M9.5,2l-5,5.001l5,5',
edit:'M4.244,7.759L9.203,2.8l2.151,2.151L6.396,9.909L2.8,11.397L4.244,7.759z',
popout:'M3,8 L3,1 L12,1 L12,8 L10,8 L10,11 L0,11 L0,3 L3,3 L2,3 L2,4 L1.969,9 L10,9 L10,8 L3,8 z M10,3 L5,3 L5,6 L10,6 L10,3 z',
remove:'M4,7h6 M7,2.5C4.515,2.5,2.5,4.515,2.5,7c0,2.486,2.015,4.5,4.5,4.5 c2.486,0,4.5-2.014,4.5-4.5C11.5,4.515,9.485,2.5,7,2.5z',
spacer:'M12,10H2V4h10V10z',
chart:'M1.844,9.188 L5.094,6.188 L7.031,8.562 L12.156,4.188',
eyeSmall:'M2.613,6.95c0-1.391,2.021-2.518,4.513-2.518 c2.493,0,4.514,1.127,4.514,2.518 M7.125,5.691c-0.682,0-1.235,0.553-1.235,1.235c0,0.681,0.553,1.235,1.235,1.235 c0.681,0,1.235-0.554,1.235-1.235C8.36,6.244,7.807,5.691,7.125,5.691z',
lock:'M10,9.875H4v-5h6V9.875z M9.5,4.625c0-1.381-1.119-2.5-2.5-2.5s-2.5,1.119-2.5,2.5 M5.5,4.625c0-0.828,0.672-1.5,1.5-1.5s1.5,0.672,1.5,1.5',
plusSmall:'M3,7h8 M7,11V3',
listSmall:'M11,4H3V3h8V4z M11,9H3v1h8V9z M11,6H3v1h8V6z',
thumbXSmall:'M6,6H2V3h4V6z M12,3H8v3h4V3z M6,8H2v3h4V8z M12,8H8v3h4V8z',
eyeHide:'M19.781,4.592 L21.552,6.272 L19.239,8.467 C21.488,9.601 23.362,11.298 25,13.186 C20.879,18.097 14.534,21.593 8.14,19.004 L5.219,21.776 L3.448,20.096 L5.761,17.9 C3.573,16.71 1.624,15.072 0,13.186 C2.735,10.019 6.181,7.253 10.432,6.602 C11.132,6.495 11.845,6.518 12.551,6.476 C14.03,6.531 15.436,6.958 16.838,7.386 L19.781,4.592 z M17.152,10.449 L16.088,11.458 L16.098,11.48 L11.356,15.995 L11.902,16.512 L16.432,12.199 C16.554,12.509 16.546,12.855 16.578,13.182 C16.578,15.412 14.674,17.221 12.324,17.22 C11.124,17.106 11.733,17.245 10.508,16.756 L10.108,17.135 C14.331,18.386 17.629,16.231 20.391,13.185 C19.486,12.082 18.4,11.139 17.152,10.449 z M12.357,8.854 C8.758,9.069 6.619,10.465 4.257,13.185 C5.207,14.373 6.45,15.227 7.71,16.051 L8.665,15.144 C8.045,13.746 8.2,14.412 8.07,13.182 C8.07,10.952 9.974,9.144 12.324,9.144 C13.614,9.267 12.915,9.119 14.391,9.709 L14.748,9.37 C13.149,8.884 13.947,9.051 12.357,8.854 z',
minimize:'M0,11.5 L12,11.5',
maximize:'M12,0 L12,12 L0,12 L0,0 L12,0 z M11,1.998 L1,1.998 L1,11.002 L11,11.002 L11,1.998 z',
desktop:'M1.195,26.607 C0.561,26.543 0.018,26 -0.018,25.395 L0.018,3.755 C0.018,3.086 0.561,2.542 1.23,2.542 L30.805,2.542 C31.474,2.542 32.018,3.086 32.018,3.755 L31.982,25.394 C32.018,26 31.474,26.543 30.77,26.608 L18.932,26.607 C18.932,26.607 18.719,28.746 20.05,29.45 C20.9,29.9 20.558,30.258 20.558,30.258 L11.407,30.258 C11.407,30.258 11.09,29.93 11.95,29.5 C13.45,28.75 13.144,26.607 13.144,26.607 L1.195,26.607 z M30.237,4.404 L1.798,4.404 L1.798,20.531 L30.237,20.531 L30.237,4.404 z',
tablet:'M25.638,0 C26.307,0 26.85,0.543 26.85,1.213 L26.85,30.787 C26.85,31.457 26.307,32 25.638,32 L6.362,32 C5.693,32 5.15,31.457 5.15,30.787 L5.15,1.213 C5.15,0.543 5.693,0 6.362,0 L25.638,0 z M16,29.476 C15.553,29.476 15.19,29.838 15.19,30.286 C15.19,30.733 15.553,31.095 16,31.095 C16.447,31.095 16.81,30.733 16.81,30.286 C16.81,29.838 16.447,29.476 16,29.476 z M25.188,3.231 L6.812,3.231 L6.812,28.769 L25.188,28.769 L25.188,3.231 z M15.896,1.406 C15.729,1.406 15.594,1.54 15.594,1.707 C15.594,1.874 15.729,2.009 15.896,2.009 C16.062,2.009 16.198,1.874 16.198,1.707 C16.198,1.54 16.062,1.406 15.896,1.406 z',
mobile:'M21.718,0 C22.754,0 23.594,0.836 23.594,1.869 L23.594,30.131 C23.594,31.164 22.754,32 21.718,32 L10.282,32 C9.246,32 8.406,31.164 8.406,30.132 L8.406,1.868 C8.406,0.836 9.246,0 10.282,0 L21.718,0 z M16,28.5 C15.352,28.5 14.826,29.023 14.826,29.668 C14.826,30.314 15.352,30.837 16,30.837 C16.648,30.837 17.174,30.314 17.174,29.668 C17.174,29.023 16.648,28.5 16,28.5 z M22.539,4.083 L9.461,4.083 L9.461,27.345 L22.539,27.345 L22.539,4.083 z M17.287,2.563 L14.938,2.563 C14.876,2.563 14.825,2.623 14.825,2.697 L14.825,2.999 C14.825,3.073 14.875,3.133 14.938,3.133 L17.287,3.133 C17.351,3.133 17.402,3.073 17.402,2.999 L17.402,2.697 C17.402,2.623 17.351,2.563 17.287,2.563 z M16.117,1.042 C15.923,1.042 15.766,1.199 15.766,1.393 C15.766,1.586 15.923,1.743 16.117,1.743 C16.31,1.743 16.467,1.586 16.467,1.393 C16.467,1.199 16.31,1.042 16.117,1.042 z',
close:'M0,0l12,12 M0,12l12-12',
closeSmall:'M3,3l8,8 M3,11l8-8',
plus:'M 6.5591462,0.00335385 6.5033537,13.059146',
minus:'M 0.0033543,6.5033535 13.059146,6.5591465',
operand:'m 0.07131516,7.5193495 14.99702684,0',
fullscreen:'M0,2h2.77v0.898H0.923v1.801H0V2z M0,8.3h0.923v1.8H2.77V11H0V8.3z M1.846,3.8h8.308v5.4H1.846V3.8z M2.77,4.699V8.3h6.46 V4.699H2.77z M9.23,2H12v2.699h-0.923V2.898H9.23V2z M9.23,10.1h1.847V8.3H12V11H9.23V10.1z',
resize:'M5.795,11l5.121-5.125 M9.293,11l1.623-1.623 M2.314,10.979l8.608-8.607',
arrow1Left:'M7.5,20l18.338,18.336l6.662-6.664L20.829,20L32.5,8.327l-6.662-6.663L7.5,20z',
arrow1Right:'M7.5,8.329L19.172,20L7.5,31.674l6.664,6.662L32.5,20L14.164,1.665L7.5,8.329z',
arrow2Left:'M9.5,20l16.792,16.151l4.208-4.046L17.913,20L30.5,7.896l-4.208-4.047L9.5,20z',
arrow2Right:'M9.5,7.894L22.084,20L9.5,32.104l4.208,4.047L30.5,20L13.708,3.849L9.5,7.894z',
arrow3Left:'M66.5,15 L33.5,50 L66.5,85',
arrow3Right:'M33,85 L67,50 L33,15',
arrow3Down:'M15,33 L50,67 L85,33',
plus1Left:'M0,15v10h40V15H0z',
plus1Right:'M0,15v9.999h15V40h9.998V24.999H40V15H24.998V0H15v15H0z',
plus2Left:'M5,17v6h30v-6H5z',
plus2Right:'M5,17.001v5.998h12V35h6V22.999H35v-5.998H23.001V5h-6v12.001H5z',
cursorThumbs:'M8,12h11v7H8V12z M8,20h11v7H8V20z M20,12h11v7H20V12z M20,20h11v7H20V20z',
updates:'M7,3.563v4.649 M7,1.541C3.986,1.541,1.541,3.986,1.541,7c0,3.017,2.445,5.459,5.459,5.459c3.017,0,5.459-2.442,5.459-5.459C12.459,3.986,10.014,1.541,7,1.541z M6.333,9.022L7,9.832l0.665-0.81H6.333z',
menuIconMobile:'M0,0 L20,0 L20,20 L0,20 L0,20 L20,20 L20,15 L0,15 L0,12 L20,12 L20,9 L0,9 L0,6 L20,6 L20,3 L0,3 L0,0 z',
bigX:'M38.5,38.5L20.5,20.5L38.5,2.5L20.5,20.5L38.5,38.5ZM2.5,2.5L20.5,20.5L2.5,38.5L20.5,20.5L2.5,2.5Z',
liveBtn:'M7,11.5 C4.515,11.5 2.5,9.485 2.5,7 C2.5,4.515 4.515,2.5 7,2.5 C9.485,2.5 11.5,4.515 11.5,7 C11.5,9.485 9.485,11.5 7,11.5 z',
search:'M9.216,0.017 C11.426,0.129 13.407,1.063 15,2.577 L15,2.577 C17.352,4.953 18.186,8.521 17.078,11.685 C16.691,12.792 16.082,13.715 15.347,14.616 L16.512,14.302 L17.787,15.578 L17.785,15.587 L24.981,22.783 L22.771,24.993 L15.572,17.794 L15.571,17.794 L14.295,16.518 L14.61,15.349 C14.029,15.823 13.915,15.952 13.253,16.343 C10.537,17.95 7.052,17.95 4.336,16.343 C3.693,15.962 3.128,15.5 2.589,14.988 C-0.838,11.56 -0.838,6.004 2.589,2.577 C4.537,0.698 6.547,0.017 9.216,0.017 z M8.762,2.634 C7.117,2.657 5.65,3.34 4.446,4.433 C2.044,6.835 2.044,10.729 4.446,13.131 C6.847,15.533 10.742,15.533 13.143,13.131 C15.545,10.729 15.545,6.835 13.143,4.433 C12.001,3.289 10.672,2.791 9.089,2.639 L8.762,2.634 z',
cloud:'M8.279,2.576 L9.048,2.632 C10.89,2.933 12.369,3.804 13.452,5.307 C13.976,5.2 13.716,5.232 14.233,5.206 C16.032,5.236 17.521,6.473 17.878,8.229 C19.765,8.595 20.911,10.333 21.003,12.16 C20.965,14.315 19.296,16.099 17.129,16.208 L15.216,16.217 L16.412,14.939 L17.011,14.931 L14.093,14.931 L10.825,18.424 L7.557,14.931 L5.001,14.931 L5.001,14.927 L7.553,14.927 L7.551,14.925 L9.688,14.925 L9.688,10.046 L11.962,10.046 L11.962,14.925 L14.099,14.925 L14.096,14.927 L17.013,14.927 L17.013,14.931 C18.528,14.846 19.699,13.681 19.725,12.16 C19.725,10.625 18.48,9.38 16.945,9.38 L16.85,9.385 C16.907,9.219 16.861,9.362 16.893,8.938 C16.893,7.48 15.711,6.298 14.253,6.298 C13.727,6.325 13.202,6.435 12.776,6.765 C12.033,5.001 10.151,3.977 8.299,3.932 C5.544,3.932 3.31,6.173 3.31,8.938 L3.324,9.229 C2.09,9.75 1.31,10.619 1.278,12.017 C1.278,13.631 2.593,14.939 4.207,14.939 L5.237,14.939 L6.433,16.217 L3.915,16.203 C1.655,16.105 0.108,14.161 0,12.017 C0.009,10.539 0.757,9.297 1.96,8.484 C2.144,5.037 4.983,2.743 8.279,2.576 z',
attachment:'M9.931,1.636 C9.583,1.288 9.177,1.017 8.724,0.833 C8.286,0.655 7.824,0.564 7.349,0.564 C6.876,0.564 6.412,0.653 5.975,0.829 C5.522,1.012 5.116,1.279 4.767,1.626 L0.846,5.538 C0.571,5.811 0.358,6.13 0.212,6.487 C0.072,6.83 -0,7.194 -0,7.568 C-0,7.94 0.071,8.302 0.21,8.646 C0.353,9.001 0.565,9.32 0.838,9.594 C1.112,9.869 1.431,10.081 1.787,10.225 C2.131,10.365 2.494,10.436 2.867,10.436 C3.24,10.436 3.603,10.365 3.947,10.227 C4.304,10.082 4.623,9.87 4.898,9.597 L8.014,6.493 C8.214,6.294 8.368,6.062 8.473,5.802 C8.575,5.552 8.626,5.287 8.626,5.016 C8.626,4.458 8.409,3.937 8.014,3.545 C7.62,3.149 7.097,2.931 6.54,2.928 C5.982,2.927 5.457,3.144 5.062,3.539 L3.122,5.48 C3.023,5.579 2.97,5.708 2.97,5.846 C2.97,5.984 3.023,6.115 3.122,6.212 L3.13,6.22 C3.331,6.423 3.66,6.423 3.863,6.221 L5.808,4.282 C6.214,3.879 6.874,3.877 7.281,4.277 C7.477,4.472 7.583,4.732 7.583,5.011 C7.583,5.293 7.474,5.557 7.276,5.754 L4.161,8.857 C4.156,8.863 4.151,8.867 4.148,8.874 C3.804,9.209 3.35,9.392 2.868,9.389 C2.383,9.387 1.928,9.198 1.587,8.857 C1.417,8.683 1.285,8.48 1.194,8.255 C1.106,8.036 1.062,7.804 1.062,7.568 C1.062,7.084 1.248,6.631 1.587,6.291 C1.592,6.287 1.596,6.284 1.6,6.28 L5.513,2.369 C5.516,2.366 5.52,2.361 5.523,2.356 C5.771,2.113 6.059,1.923 6.38,1.795 C6.693,1.67 7.021,1.607 7.36,1.607 C7.698,1.607 8.028,1.672 8.339,1.797 C8.662,1.928 8.952,2.119 9.199,2.366 C9.447,2.613 9.638,2.903 9.769,3.226 C9.895,3.537 9.959,3.867 9.959,4.205 C9.959,4.545 9.895,4.876 9.768,5.19 C9.637,5.514 9.444,5.806 9.195,6.056 L6.491,8.751 C6.393,8.85 6.338,8.979 6.338,9.118 C6.338,9.257 6.393,9.387 6.49,9.484 L6.496,9.49 C6.697,9.692 7.026,9.692 7.228,9.49 L9.929,6.796 C10.277,6.447 10.548,6.041 10.733,5.588 C10.911,5.15 11,4.688 11,4.214 C11,3.74 10.91,3.278 10.733,2.841 C10.55,2.389 10.28,1.983 9.931,1.636 z',
gear:'M10.329,6.099 L9.534,5.923 C9.522,5.462 9.423,5.017 9.239,4.597 L9.857,4.097 C9.956,4.016 9.971,3.871 9.891,3.772 L9.048,2.731 C9.009,2.683 8.954,2.653 8.893,2.646 C8.832,2.64 8.771,2.658 8.723,2.696 L8.121,3.185 C7.753,2.908 7.342,2.709 6.9,2.593 L6.9,1.827 C6.9,1.699 6.796,1.596 6.669,1.596 L5.329,1.596 C5.201,1.596 5.098,1.699 5.098,1.827 L5.098,2.594 C4.646,2.713 4.228,2.918 3.853,3.205 L3.245,2.72 C3.197,2.682 3.136,2.665 3.075,2.672 C3.015,2.679 2.959,2.71 2.921,2.757 L2.086,3.806 C2.048,3.854 2.031,3.915 2.038,3.976 C2.045,4.037 2.075,4.092 2.123,4.13 L2.747,4.627 C2.568,5.047 2.473,5.493 2.465,5.953 L1.669,6.137 C1.609,6.151 1.558,6.188 1.525,6.239 C1.493,6.291 1.482,6.354 1.496,6.413 L1.798,7.72 C1.827,7.844 1.95,7.921 2.075,7.893 L2.894,7.703 C3.108,8.095 3.389,8.438 3.731,8.724 L3.362,9.497 C3.336,9.552 3.333,9.616 3.353,9.673 C3.373,9.731 3.416,9.778 3.471,9.804 L4.681,10.381 C4.712,10.396 4.746,10.404 4.78,10.404 C4.806,10.404 4.832,10.399 4.857,10.391 C4.915,10.37 4.962,10.328 4.988,10.273 L5.361,9.49 C5.792,9.569 6.239,9.567 6.666,9.486 L7.046,10.264 C7.101,10.378 7.24,10.426 7.354,10.37 L8.559,9.782 C8.614,9.755 8.656,9.708 8.676,9.65 C8.696,9.592 8.692,9.529 8.665,9.474 L8.291,8.706 C8.631,8.416 8.909,8.07 9.119,7.676 L9.939,7.858 C10.064,7.885 10.187,7.807 10.214,7.683 L10.504,6.374 C10.532,6.25 10.453,6.127 10.329,6.099 z M7.516,6.013 C7.516,6.849 6.836,7.529 6,7.529 C5.164,7.529 4.484,6.849 4.484,6.013 C4.484,5.177 5.164,4.497 6,4.497 C6.836,4.497 7.516,5.177 7.516,6.013 z'
};
var Svg = (function(imports) {
var _Sprite = imports.Sprite,
methodsToInherit = ['dispatchEvent', 'addEventListener', 'removeEventListener', 'removeAllListeners', 'addChild', 'removeChild', 'removeChildren', 'childAdded', 'moveToTop', 'event', 'hitTestPoint', 'hitTestAbs', 'globalToLocal', 'localToGlobal', 'focus', 'blur'],
pixelValues = [ 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeatX', 'backgroundRepeatY', 'baselineShift', 'borderBottomLeftRadius', 'borderBottomRightRadius', 'borderBottomWidth', 'borderImageWidth', 'borderLeftWidth', 'borderRadius', 'borderRightWidth', 'borderSpacing', 'borderTopLeftRadius', 'borderTopRightRadius', 'borderTopWidth', 'borderWidth', 'bottom', 'fontSize', 'height', 'left', 'letterSpacing', 'lineHeight', 'marginBottom', 'marginLeft', 'marginRight', 'marginTop', 'maxHeight', 'maxWidth', 'minHeight', 'minWidth', 'outlineOffset', 'outlineWidth', 'overflowX', 'overflowY', 'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop', 'right', 'strokeWidth', 'textIndent', 'textLineThroughWidth', 'textOverlineWidth', 'textUnderlineWidth', 'top', 'width', 'wordSpacing' ],
svgAttribute = ['cx', 'cy', 'd', 'points', 'r', 'rx', 'ry', 'fill', 'stroke', /*'x', 'y', */'width', 'height'],
properties = ["backfaceVisibility", "background", "backgroundAttachment", "backgroundBlendMode", "backgroundClip", "backgroundColor", "backgroundImage", "backgroundOrigin", "backgroundPosition", "backgroundPositionX", "backgroundPositionY", "backgroundRepeat", "backgroundRepeatX", "backgroundRepeatY", "backgroundSize", "border", "borderBottom", "borderBottomColor", "borderBottomLeftRadius", "borderBottomRightRadius", "borderBottomStyle", "borderBottomWidth", "borderCollapse", "borderColor", "borderImage", "borderImageOutset", "borderImageRepeat", "borderImageSlice", "borderImageSource", "borderImageWidth", "borderLeft", "borderLeftColor", "borderLeftStyle", "borderLeftWidth", "borderRadius", "borderRight", "borderRightColor", "borderRightStyle", "borderRightWidth", "borderSpacing", "borderStyle", "borderTop", "borderTopColor", "borderTopLeftRadius", "borderTopRightRadius", "borderTopStyle", "borderTopWidth", "borderWidth", "bottom", "boxShadow", "boxSizing", "bufferedRendering", "clear", "color", "content", "cursor", "direction", "display", "float", "font", "fontFamily", "fontKerning", "fontSize", "fontStretch", "fontStyle", "fontVariant", "fontWeight", "height", "imageRendering", "left", "letterSpacing", "lineHeight", "listStyle", "listStyleImage", "listStylePosition", "listStyleType", "margin", "marginBottom", "marginLeft", "marginRight", "marginTop", "mask", "maskType", "maxHeight", "maxWidth", "maxZoom", "minHeight", "minWidth", "minZoom", "opacity", "order", "orientation", "outline", "outlineColor", "outlineOffset", "outlineStyle", "outlineWidth", "overflow", "overflowWrap", "overflowX", "overflowY", "padding", "paddingBottom", "paddingLeft", "paddingRight", "paddingTop", "page", "pageBreakAfter", "paintOrder", "pointerEvents", "position", "resize", "right", "size", "src", "stroke", "strokeDasharray", "strokeDashoffset", "strokeLinecap", "strokeLinejoin", "strokeMiterlimit", "strokeOpacity", "strokeWidth", "tabSize", "tableLayout", "textAlign", "textAnchor", "textDecoration", "textIndent", "textLineThroughColor", "textLineThroughMode", "textLineThroughStyle", "textLineThroughWidth", "textOverflow", "textOverlineColor", "textOverlineMode", "textOverlineStyle", "textOverlineWidth", "textRendering", "textShadow", "textTransform", "textUnderlineColor", "textUnderlineMode", "textUnderlineStyle", "textUnderlineWidth", "top", "transform", "transformOrigin", "transformStyle", "transition", "transitionDelay", "transitionDuration", "transitionProperty", "transitionTimingFunction", "userZoom", "verticalAlign", "visibility", "webkitBackfaceVisibility", "webkitBoxShadow", "webkitFilter", "webkitFontSmoothing", "webkitHighlight", "webkitTransformStyle", "webkitTransition", "webkitTransitionDelay", "webkitTransitionDuration", "webkitTransitionProperty", "webkitTransitionTimingFunction", "webkitUserDrag", "webkitUserModify", "webkitUserSelect", "whiteSpace", "width", "wordBreak", "wordSpacing", "wordWrap", "zIndex", "zoom"];
function Svg(_vars) {
this.vars = {};
var i;
for(i in _vars) this.vars[i] = _vars[i];
var el = document.createElementNS('http://www.w3.org/2000/svg', this.vars.type || 'svg');
el.style.position = 'absolute';
el.style.display = 'block';
el.proxy = this;
this._private = {};
this.element = el;
this.children = [];
this.style = el.style;
this.name = this.vars.type || 'svg';
this.events = this.vars.events || globalEvents;
this.listeners = this.events.listeners;
}
(function defineProperties (methodsToInherit, properties, attributes){
var i = methodsToInherit.length;
while(i --) {
Svg.prototype[methodsToInherit[i]] = _Sprite.prototype[methodsToInherit[i]];
}
properties.forEach(function(prop) {
if(!/fill|stroke|strokeWidth|width|height|x|y|transition/.test(prop)) {
Object.defineProperty (Svg.prototype, prop, {
get: function () { return this._private[prop] ; },
set: function (value) {
this._private[prop] = value;
this.element.style[prop] = pixelValues.indexOf(prop) > -1 ? value + 'px' : value;
}
});
}
});
attributes.forEach(function(prop) {
Object.defineProperty (Svg.prototype, prop, {
get: function () { return this._private[prop] ; },
set: function (value) {
this._private[prop] = value;
this.element.setAttribute(prop, value);
}
});
});
Object.defineProperty (Svg.prototype, 'scale', {
get: function () { return this._private.scale ; },
set: function () {
var value = !arguments[1] ? arguments[0] : arguments[0] + ',' + arguments[1];
this._private.scale = value;
this.element.setAttribute('transform', 'scale(' + value + ')');
}
});
Object.defineProperty (Svg.prototype, 'fillRule', {
get: function () { return this._private.fillRule ; },
set: function (value) {
this._private.fillRule = value;
this.element.setAttribute('fill-rule', value);
}
});
Object.defineProperty (Svg.prototype, 'strokeWidth', {
get: function () { return this._private['strokeWidth'] ; },
set: function (value) {
this._private['strokeWidth'] = value;
this.element.setAttribute('stroke-width', value);
}
});
Object.defineProperty (Svg.prototype, 'topParentName', {
get: function() {
if(this.parent) {
return this.parent.topParentName;
}
return this.topParentName;
}
});
Object.defineProperty (Svg.prototype, 'stageX', {
get: function() {
if(this.parent) {
return this.parent.stageX + this.x;
}
return this.x;
}
});
Object.defineProperty (Svg.prototype, 'stageY', {
get: function() {
if(this.parent) {
return this.parent.stageY + this.y;
}
return this.y;
}
});
Object.defineProperty (Svg.prototype, 'absX', {
get: function() {
var x = 0;
var el = this.element;
if (el.offsetParent) {
do { x += el.offsetLeft; } while (el = el.offsetParent);
}
return x;
}
});
Object.defineProperty (Svg.prototype, 'absY', {
get: function() {
var y = 0;
var el = this.element;
if (el.offsetParent) {
do { y += el.offsetTop; } while (el = el.offsetParent);
}
return y;
}
});
Object.defineProperty (Svg.prototype, 'class', {
get: function() {
return this.element.className;
},
set: function(value) {
this.element.setAttribute('class', value);
}
});
Object.defineProperty (Svg.prototype, 'selectable', {
get: function() {
console.log('selectable', this);
return this._private.selectable;
},
set: function(value) {
this._private.selectable = value;
if(!this._private.selectable && this.vars.type !== 'input' && this.vars.type !== 'textarea') {
this.style.cursor = 'default';
this.style['-webkit-touch-callout'] = 'none';
this.style['-webkit-user-select'] = 'none';
this.style['-khtml-user-select'] = 'none';
this.style['-moz-user-select'] = 'none';
this.style['-ms-touch-callout'] = 'none';
this.style['user-select'] = 'none';
} else {
this.style.cursor = 'auto';
this.style['-webkit-touch-callout'] = 'auto';
this.style['-webkit-user-select'] = 'auto';
this.style['-khtml-user-select'] = 'auto';
this.style['-moz-user-select'] = 'auto';
this.style['-ms-touch-callout'] = 'auto';
this.style['user-select'] = 'auto';
}
}
});
Object.defineProperty (Svg.prototype, 'x', {
get: function() {
return this._private.x || 0;
},
set: function(value) {
this._private.x = value;
this.style.left = value + 'px';
}
});
Object.defineProperty (Svg.prototype, 'y', {
get: function() {
return this._private.y || 0;
},
set: function(value) {
this._private.y = value;
this.style.top = value + 'px';
}
});
Object.defineProperty (Svg.prototype, 'alpha', {
get: function() {
return this._private.opacity;
},
set: function(value) {
this._private.opacity = value;
this.style.opacity = value;
}
});
Object.defineProperty (Svg.prototype, 'translate', {
get: function() {
return this._private.translate;
},
set: function(value) {
this._private.translate = value;
this._private.translateX = value[0];
this._private.translateY = value[1];
this.style['-webkit-transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
this.style['-ms-transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
this.style['transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
}
});
Object.defineProperty (Svg.prototype, 'translateX', {
get: function() {
var matrix = new TransformMatrix(this.element);
return matrix.x;
},
set: function(value) {
this._private.translateX = value;
this._private.translateY = this._private.translateY || 0;
this.style['-webkit-transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
this.style['-ms-transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
this.style['transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
}
});
Object.defineProperty (Svg.prototype, 'translateY', {
get: function() {
var matrix = new TransformMatrix(this.element);
return matrix.y;
},
set: function(value) {
this._private.translateY = value;
this._private.translateX = this._private.translateX || 0;
this.style['-webkit-transform'] = 'translate3d(' + this._private.translateX + 'px,' +this._private.translateY + 'px, 0px)';
this.style['-ms-transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
this.style['transform'] = 'translate3d(' + this._private.translateX + 'px,' + this._private.translateY + 'px, 0px)';
}
});
Object.defineProperty (Svg.prototype, 'translateZ', {
get: function() {
return this._private.translateZ;
},
set: function(value) {
this._private.translateZ = value;
this._private.translateZ = this._private.translateZ || 0;
this.style['-webkit-transform'] = 'translate3d(' + this._private.translateZ + 'px,' + this._private.translateZ + 'px, 0px)';
this.style['-ms-transform'] = 'translate3d(' + this._private.translateZ + 'px,' + this._private.translateZ + 'px, 0px)';
this.style['transform'] = 'translate3d(' + this._private.translateZ + 'px,' + this._private.translateZ + 'px, 0px)';
}
});
Object.defineProperty (Svg.prototype, 'rotate', {
get: function() {
return this._private.rotate;
},
set: function(value) {
this._private.rotate = value;
this.style['-webkit-transform'] = 'rotate('+value+'deg)';
this.style['-moz-transform'] = 'rotate('+value+'deg)';
this.style['-o-transform'] = 'rotate('+value+'deg)';
this.style.transform = 'rotate('+value+'deg)';
}
});
Object.defineProperty (Svg.prototype, 'numChildren', {
get: function() {
return this.children.length;
}
});
Object.defineProperty (Svg.prototype, 'transition', {
get: function() {
return this._private.transition;
},
set: function(value) {
this._private.transition = value;
value = value === 0 ? 'none' : 'all ' + value + 's cubic-bezier(1, 0, 0.3, 1)';
this.style.WebkitTransition = value;
this.style.MozTransition = value;
this.style.OTransition = value;
this.style.transition = value;
}
});
})(methodsToInherit, properties, svgAttribute);
return Svg;
})({
Sprite:Sprite
});
function Path() {
return new Svg({type:'path'});
}
function Rect() {
return new Svg({type:'rect'});
}
function Circle() {
return new Svg({type:'circle'});
}
function TextArea(vars) {
var textarea;
vars = vars || {};
vars.type = 'textarea';
vars.className = 'TextArea';
textarea = new Sprite(vars);
textarea.borderRadius = 0;
textarea.style['-webkit-appearance'] = 'none';
textarea.element.addEventListener('focus', function() {
if(BROWSER_NAME === 'Safari') document.webkitCancelFullScreen();
stage.disableKeyNavigation = true;
stage.activeFocus = textarea;
stage.isInputFocus = true
});
textarea.element.addEventListener('blur', function() {
stage.disableKeyNavigation = false;
stage.isInputFocus = false
});
return textarea;
}
function TextField(vars) {
vars = vars || {};
vars.type = 'span';
vars.className = 'TextField';
var textField = new Sprite(vars);
textField.selectable = true;
textField.fontFamily = 'sans-serif';
textField.element.addEventListener('focus', function() {
stage.disableKeyNavigation = true;
stage.activeFocus = textField;
stage.isInputFocus = true
});
textField.element.addEventListener('blur', function() {
stage.disableKeyNavigation = false;
stage.isInputFocus = false
});
return textField;
}
function ViewProxy(vars) {
var proxy = vars || {};
proxy.events = proxy.events || new EventSandbox();
return new Sprite(proxy);
}
function VideoPlayer(vars) { // eslint-disable-line
vars = vars || {}
vars.type = 'video'
vars.className = 'VideoPlayer'
var self = new Sprite(vars)
var autoplayOnMetaData = false
self.element.setAttribute('playsinline', true)
self.element.addEventListener(METADATA_LOADED, metadataLoaded, false)
self.element.addEventListener(ERROR, loadError, false)
self.width = vars.width || 640
self.height = vars.height || 480
self.parent = vars.parent
self.hud = new VideoHud(self)
self.hud.disable()
self.playerID = 'player' + VideoPlayer.getNextPlayerID()
var alwaysMuted = vars.alwaysMuted
var showUnmuteBtn = true
var unmuteBtn = new Button()
unmuteBtn.x = 20
unmuteBtn.y = 20
unmuteBtn.zIndex = 10
unmuteBtn.borderRadius = 2
unmuteBtn.backgroundColor = 'white'
unmuteBtn.text = 'TAP TO UNMUTE'
unmuteBtn.display = 'none'
unmuteBtn.element.style.padding = '3px 6px'
self.unmuteBtn = unmuteBtn
self.unmuteClick = function() {
self.hud.unmute()
self.hud.enable()
unmuteBtn.display = 'none'
unmuteBtn.removeEventListener('click', self.unmuteClick)
alwaysMuted = false
}
unmuteBtn.addEventListener('click', self.unmuteClick)
self.unmuteBtn = unmuteBtn
self.parent.addChild(unmuteBtn)
self.disableUnmuteButton = function() {
showUnmuteBtn = false
unmuteBtn.display = 'none'
}
self.play = function(){
var promisePlay = self.element.play()
if(promisePlay !== undefined) {
promisePlay
.then(function() {
// Autoplay started!
self.paused = false
if(alwaysMuted) {
self.element.muted = true
} else if(stage.userInteraction) {
unmuteBtn.display = 'none'
if(self.hud) {
self.hud.unmute()
} else {
self.element.muted = false
}
}
self.dispatchEvent(PLAY)
// stage.addEventListener(KEY_DOWN, checkSpaceBar)
})
.catch(function() {
// Autoplay was prevented.
// Show a "Play" button so that user can start playback.
//
// add mute button for user
if(self) {
if(self.hud) {
self.hud.mute()
} else {
self.element.muted = true
}
if(showUnmuteBtn) unmuteBtn.display = 'block'
self.element.play()
self.paused = false
self.dispatchEvent(PLAY)
// stage.addEventListener(KEY_DOWN, checkSpaceBar)
}
})
}
}
self.pause = function(){
self.element.pause()
self.paused = true
self.dispatchEvent(PAUSED)
}
self.togglePlay = function(){
if(self.element.paused) {
self.play()
} else {
self.pause()
}
}
self.setSize = function(w, h, updateSpeed) {
if(self) {
if(updateSpeed === 0) {
self.width = w
self.height = h
} else {
Tween(self, updateSpeed, {width:w, height:h})
}
}
}
function metadataLoaded(e) {
self.dispatchEvent(METADATA_LOADED, e)
if(autoplayOnMetaData) self.play()
}
function loadError(e) {
self.dispatchEvent(ERROR, e)
}
self.setSource = function(value, autoplay) {
if(autoplay) self.element.setAttribute('autoplay', true)
if(typeSupported('video/mp4', 'avc1.42E01E, mp4a.40.2')) {
self.src = cdnMediaPath(value)
self.element.addEventListener('ended', ended)
if(autoplay) autoplayOnMetaData = true
} else if(fileExist(MEDIA_ORIGINAL + value.replace(getExt(value), 'webm'))) {
self.src = cdnMediaPath(value.replace(getExt(value), 'webm'))
self.element.addEventListener('ended', ended)
if(autoplay) autoplayOnMetaData = true
} else {
window.open(MEDIA_ORIGINAL + value)
}
}
self.destroy = function() {
if(self) {
self.element.removeEventListener('ended', ended)
self.removeKeyListener()
self.element.removeEventListener(METADATA_LOADED, metadataLoaded, false)
self = null
}
}
self.removeKeyListener = function() {
// stage.removeEventListener(KEY_DOWN, checkSpaceBar)
}
function typeSupported(vidType, codType) {
var isSupported = self.element.canPlayType(vidType + ';codecs="' + codType + '"')
if (isSupported === "") return false
return true
}
function ended() {
self.dispatchEvent('playbackEnd')
}
function checkSpaceBar(e) {
if(self && keyCode[e.keyCode] === SPACE_BAR) {
self.togglePlay()
}
}
return self
}
function VideoHud(video) { // eslint-disable-line
var hud = new Sprite(),
btnWidth = 50,
btnHeight = 50,
bgColor = 'rgba(0,0,0,0.65)',
playBtn,
fullscreenBtn,
muteBtn,
scrub,
curVideoWidth,
curVideoHeight,
scrubWidth,
showing = true
hud.setClass('no-invert')
function init() {
hud.height = 50
hud.width = video.width
hud.alpha = 0
hud.zIndex = 5
video.parent.addChild(hud)
var playIcon
if(video.element.paused) {
playIcon = svgPaths.pause
} else {
playIcon = svgPaths.play
}
playBtn = buildBtn(playIcon, togglePlay)
hud.addChild(playBtn)
fullscreenBtn = buildBtn(svgPaths.fullscreen, fullscreen(video.element))
hud.addChild(fullscreenBtn)
var volumePath = svgPaths.volume
var volumeFunc = toggleMute
if(USER_AGENT === TABLET) {
volumePath = ''
volumeFunc = function() {}
}
muteBtn = buildBtn(volumePath, volumeFunc)
hud.addChild(muteBtn)
buildScrubZone()
hud.interval = setInterval(updateProgress, 100)
video.element.addEventListener('ended', ended)
// stage.addEventListener(MOUSE_MOVE, videoHit)
}
var hideHudTimer
function videoHit(e) {
if(!isPod() && !isPad()) {
clearTimeout(hideHudTimer)
var x = getX(e)
// y = getY(e)
var y = STATE.siteView.unifiedPageScroll() || /unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior) ? e.pageY : getY(e)
if(video.hitTestAbs(x, y)) {
show()
hideHudTimer = setTimeout(function(){
hide()
}, 3000)
} else {
hide()
}
}
}
function show() {
if(!showing) {
showing = true
hud.display = 'block'
Tween(hud, UPDATE_SPEED, {alpha:1})
}
}
function hide() {
if(showing) {
showing = false
Tween(hud, UPDATE_SPEED, {alpha:0, onComplete:function(){
hud.display = 'none'
showing = false
}})
}
}
hud.show = show
hud.hide = hide
hud.resize = function(updateSpeed, x, y, videoWidth, videoHeight) {
var hudX = x
var hudY = y
var hudWidth = videoWidth
var hudHeight = videoHeight
curVideoWidth = videoWidth
curVideoHeight = videoHeight
scrubWidth = hudWidth - (btnWidth * 3)
if(updateSpeed === 0) {
hud.width = hudWidth
hud.x = Mth.floor(hudX)
hud.y = Mth.floor(hudY + hudHeight - hud.height)
fullscreenBtn.x = hudWidth - fullscreenBtn.width
muteBtn.x = hudWidth - fullscreenBtn.width - muteBtn.width
scrub.x = btnWidth
scrub.width = scrubWidth
scrub.hit.width = scrubWidth
} else {
Tween(hud, updateSpeed, {width:hudWidth, x:hudX, y:hudY + videoHeight - hud.height})
Tween(fullscreenBtn, updateSpeed, {x:hudWidth - fullscreenBtn.width})
Tween(muteBtn, updateSpeed, {x:hudWidth - fullscreenBtn.width - muteBtn.width})
Tween(scrub, updateSpeed, {x:btnWidth, width:scrubWidth})
Tween(scrub.hit, updateSpeed, {width:scrubWidth})
}
updateProgress()
}
function buildBtn(path, action) {
var btn = new Sprite()
btn.width = btnWidth
btn.height = btnHeight
btn.backgroundColor = bgColor
var svg = new Svg()
svg.id = 'svg'
svg.width = 12
svg.height = 12
svg.left = Mth.round((btn.width - svg.width) * 0.5)
svg.top = Mth.round((btn.height - svg.height) * 0.5)
btn.addChild(svg)
var icon = new Path()
icon.id = 'icon'
icon.d = path
icon.fill = '#FFFFFF'
icon.alpha = 0.65
svg.addChild(icon)
var hit = new Sprite()
hit.width = btn.width
hit.height = btn.height
btn.addChild(hit)
btn.hit = hit
btn.icon = icon
btn.svg = svg
hit.icon = icon
hit.bg = btn
hit.addEventListener(CLICK, action)
hit.addEventListener(MOUSE_OVER, function(){
Tween(this.bg, UPDATE_SPEED, {backgroundColor:'rgba(0,0,0,0.85)'})
Tween(this.icon, UPDATE_SPEED, {alpha:1})
})
hit.addEventListener(MOUSE_OUT, function(){
Tween(this.bg, UPDATE_SPEED, {backgroundColor:bgColor})
Tween(this.icon, UPDATE_SPEED, {alpha:0.65})
})
return btn
}
function buildScrubZone() {
scrub = new Sprite()
scrub.zIndex = -1
scrub.backgroundColor = bgColor
scrub.height = btnHeight
hud.addChild(scrub)
scrub.buffer = new Sprite()
scrub.buffer.backgroundColor = '#FFFFFF'
scrub.buffer.alpha = 0.12
scrub.buffer.width = 1
scrub.buffer.height = hud.height
scrub.addChild(scrub.buffer)
scrub.progress = new Sprite()
scrub.progress.backgroundColor = '#FFFFFF'
scrub.progress.alpha = 0.25
scrub.progress.width = 1
scrub.progress.height = hud.height
scrub.addChild(scrub.progress)
scrub.time = new Sprite()
scrub.time.fontFamily = "Arial, Helvetia, sans-serif"
scrub.time.fontColor = '#FFF'
scrub.time.fontSize = 10
scrub.time.text = "00:00 / 00:00"
scrub.time.alpha = 1
scrub.addChild(scrub.time)
scrub.time.x = 10
scrub.time.y = 20
scrub.head = new Sprite()
scrub.head.backgroundColor = '#FFFFFF'
scrub.head.alpha = 0
scrub.head.x = 30
scrub.head.width = 1
scrub.head.height = hud.height
scrub.addChild(scrub.head)
scrub.headTime = new Sprite()
scrub.headTime.fontFamily = "Arial, Helvetia, sans-serif"
scrub.headTime.fontColor = '#FFFFFF'
scrub.headTime.fontSize = 10
scrub.headTime.alpha = 0
scrub.headTime.text = "00:00"
scrub.headTime.x = 30
scrub.headTime.y = -15
scrub.addChild(scrub.headTime)
scrub.hit = new Sprite()
scrub.hit.height = hud.height
scrub.addChild(scrub.hit)
if(!isPod() && !isPad()) {
scrub.hit.addEventListener(MOUSE_OVER, function(){
Tween(scrub.buffer, UPDATE_SPEED, {alpha:0.2})
Tween(scrub.progress, UPDATE_SPEED, {alpha:0.4})
Tween(scrub.time, UPDATE_SPEED, {alpha:1})
Tween(scrub.head, UPDATE_SPEED, {alpha:1})
Tween(scrub.headTime, UPDATE_SPEED, {alpha:1})
Tween(scrub, UPDATE_SPEED, {backgroundColor:'rgba(0,0,0,0.85)'})
})
scrub.hit.addEventListener(MOUSE_OUT, function(){
Tween(scrub.buffer, UPDATE_SPEED, {alpha:0.12})
Tween(scrub.progress, UPDATE_SPEED, {alpha:0.25})
Tween(scrub.time, UPDATE_SPEED, {alpha:0.5})
Tween(scrub.head, UPDATE_SPEED, {alpha:0})
Tween(scrub.headTime, UPDATE_SPEED, {alpha:0})
Tween(scrub, UPDATE_SPEED, {backgroundColor:bgColor})
})
scrub.hit.addEventListener(MOUSE_MOVE, scrubMove)
}
scrub.hit.addEventListener(CLICK, scrubSeek)
}
function scrubMove(e) {
var pointX = getScrubPoint(e)
scrub.head.transition = 0
scrub.head.x = pointX
scrub.headTime.transition = 0
scrub.headTime.x = pointX
scrub.headTime.text = secondsToTime((pointX / scrubWidth) * video.element.duration)
}
function scrubSeek(e) {
var pointX = getScrubPoint(e)
scrub.head.x = pointX
scrub.headTime.x = pointX
var dropInPoint = (pointX / scrubWidth) * video.element.duration
video.element.currentTime = dropInPoint
scrub.headTime.text = secondsToTime(dropInPoint)
updateProgress(video)
}
function updateProgress() {
if(video.element.buffered.length > 0) {
bufferedPercent = video.element.buffered.end(0) / video.element.duration
scrub.buffer.transition = 0
scrub.buffer.width = bufferedPercent * scrubWidth
playedPercent = video.element.currentTime / video.element.duration
scrub.progress.transition = 0
scrub.progress.width = playedPercent * scrubWidth
scrub.time.text = secondsToTime(video.element.currentTime) + " / " + secondsToTime(video.element.duration)
}
}
function ended() {
clearInterval(hud.interval)
}
function togglePlay() {
if(video.element.paused) {
video.play()
playBtn.icon.d = svgPaths.pause
hud.interval = setInterval(updateProgress, 50)
} else {
video.pause()
playBtn.icon.d = svgPaths.play
/*clearInterval(hud.interval);*/
}
}
function toggleMute() {
if(video.element.muted) {
hud.unmute()
} else {
hud.mute()
}
}
hud.mute = function mute() {
video.element.muted = true
muteBtn.icon.d = svgPaths.mute
}
hud.unmute = function unmute() {
video.element.muted = false
muteBtn.icon.d = svgPaths.volume
}
hud.disable = function() {
// hide it and remove hittest stuff
hide()
if(!isPod() && !isPad()) {
stage.removeEventListener(MOUSE_MOVE, videoHit)
}
}
hud.enable = function() {
show()
if(!isPod() && !isPad()) {
stage.addEventListener(MOUSE_MOVE, videoHit)
}
}
function getScrubPoint(e) {
if(TOUCH_DEVICE && e.touches) {
return e.touches[0].offsetX - btnWidth - scrub.x
} else {
return e.offsetX
}
}
function secondsToTime(seconds) {
minutes = Math.floor(seconds / 60)
seconds = Math.floor(seconds - (minutes * 60))
minutes = minutes < 10 ? "0" + minutes : minutes
seconds = seconds < 10 ? "0" + seconds : seconds
return minutes + ":" + seconds
}
init.call(hud)
return hud
}
VideoPlayer.playerID = 0
VideoPlayer.getNextPlayerID = function() {
return VideoPlayer.playerID++
}
function VimeoPlayer(vars) {
vars = vars || {}
vars.type = 'iframe'
vars.className = 'VimeoPlayer'
var self = new Sprite(vars)
var currentPlayer
var targetOrigin = '*'
var source
var isAutoPlay
var initialVolumeChange = false
self.parent = vars.parent
self.style.pointerEvents = 'auto'
// mobile ios hack for iframe to allow tap-to-unmute button to show up
// not sure why this works
// if(isPod() && vars.thumbBuild) self.style.position = 'fixed'
init()
self.setSource = function(value, autoplay) {
self.element.ownerDocument.defaultView.addEventListener("message", messaging(currentPlayer))
isAutoPlay = !!autoplay
// google chrome needs this defined before src for autoplay permissions delegation
self.element.setAttribute('allow', 'autoplay')
try {
source = 'https://player.vimeo.com/video/' + value.split("vimeo:")[1]
var autoplayString = autoplay ? '&autoplay=1' : ''
if(STATE.overrides.videoLoop) {
self.src = source + '?api=1&autopause=0&loop=1&wmode=opaque' + autoplayString + '&player_id=' + currentPlayer
} else {
self.src = source + '?api=1&autopause=0&wmode=opaque' + autoplayString + '&player_id=' + currentPlayer
}
var selfWidth = self.width || vars.width || 640
var selfHeight = self.height || vars.height || 480
self.element.setAttribute('width', selfWidth)
self.element.setAttribute('height', selfHeight)
self.width = selfWidth
self.height = selfHeight
if(autoplay) {
if(stage.userInteraction) {
if(self.unmuteBtn) {
self.unmuteBtn.display = 'none'
self.unmuteBtn.removeEventListener('click', self.unmuteClick)
}
self.element.setAttribute('allow', 'autoplay')
self.element.contentWindow.postMessage(JSON.stringify({
"method": "setMuted",
"value": false
}), targetOrigin)
} else if(self.unmuteBtn) {
self.unmuteBtn.display = 'block'
self.unmuteBtn.addEventListener('click', self.unmuteClick)
} else if(!self.unmuteBtn) {
buildUnmuteBtn(self)
}
}
self.element.setAttribute('frameborder', 0)
self.element.setAttribute('webkitallowfullscreen', true)
self.element.setAttribute('mozallowfullscreen', true)
self.element.setAttribute('allowfullscreen', true)
} catch(e) {
console.log('there may have been a vimeo api error: ', e)
}
}
self.togglePlay = function() {
if(self.paused) {
self.play()
} else {
self.pause()
}
}
self.setLoop = function(value) {
if(self && self.loaded && self.element.contentWindow) {
// window.addEventListener("message", messaging, false)
self.element.contentWindow.postMessage(JSON.stringify({
"method": "loop",
"value": value
}), targetOrigin)
}
}
function buildUnmuteBtn(self) {
var unmuteBtn = new Button()
unmuteBtn.x = 20
unmuteBtn.y = 20
unmuteBtn.zIndex = 10
unmuteBtn.borderRadius = 2
unmuteBtn.backgroundColor = 'white'
unmuteBtn.text = 'TAP TO UNMUTE'
unmuteBtn.display = 'block'
unmuteBtn.element.style.padding = '3px 6px'
self.unmuteBtn = unmuteBtn
self.unmuteClick = function() {
unmuteBtn.display = 'none'
unmuteBtn.removeEventListener('click', self.unmuteClick)
self.element.contentWindow.postMessage(JSON.stringify({
"method": "setMuted",
"value": false
}), targetOrigin)
}
unmuteBtn.addEventListener('click', self.unmuteClick)
self.unmuteBtn = unmuteBtn
self.addEventListener('load', function() {
setTimeout(function(){
self.parent.addChild(unmuteBtn)
}, 1000)
})
self.disableUnmuteButton = function() {
unmuteBtn.display = 'none'
}
return unmuteBtn
}
self.play = function() {
self.ended = false
// have to check for user interaction before play
if(stage.userInteraction) {
if(self.unmuteBtn) {
self.unmuteBtn.display = 'none'
self.unmuteBtn.removeEventListener('click', self.unmuteClick)
}
self.element.contentWindow.postMessage(JSON.stringify({
"method": "setMuted",
"value": false
}), targetOrigin)
} else if(self.unmuteBtn) {
self.unmuteBtn.display = 'block'
self.unmuteBtn.addEventListener('click', self.unmuteClick)
} else if(!self.unmuteBtn) {
buildUnmuteBtn(self)
}
if(self && self.element.contentWindow) {
if(self.loaded) {
self.element.contentWindow.postMessage(JSON.stringify({
"method": "play",
"value": ""
}), targetOrigin)
stage.addEventListener(KEY_DOWN, checkSpaceBar)
self.paused = false
self.dispatchEvent(PLAY)
} else {
self.element.addEventListener('load', function() {
self.loaded = true
self.element.contentWindow.postMessage(JSON.stringify({
"method": "play",
"value": ""
}), targetOrigin)
stage.addEventListener(KEY_DOWN, checkSpaceBar)
self.paused = false
self.dispatchEvent(PLAY)
})
}
}
}
self.pause = function() {
if(self && self.loaded && self.element.contentWindow) {
self.element.contentWindow.postMessage(JSON.stringify({
"method": "pause",
"value": ""
}), targetOrigin)
self.paused = true
}
}
self.setSize = function(w, h) {
if(self) {
self.transition = 0
self.width = w
self.height = h
}
}
self.align = function(x, y) {
if(self) {
self.transition = 0
self.style.left = x + "px"
self.style.top = y + "px"
}
}
self.destroy = function() {
self.element.ownerDocument.defaultView.removeEventListener("message", messaging)
self.removeKeyListener()
self = null
}
function ended() {
if(!self.ended) self.dispatchEvent('playbackEnd')
self.ended = true
// console.log('playbackEnd')
}
function init() {
currentPlayer = 'player' + VimeoPlayer.getNextPlayerID()
self.playerID = currentPlayer
self.element.id = currentPlayer
self.element.setAttribute('frameborder', '0')
self.element.setAttribute('webkitAllowFullScreen', '')
self.element.setAttribute('mozallowfullscreen', '')
self.element.setAttribute('allowFullScreen', '')
self.element.style['user-select'] = 'none'
}
function messaging(playerId) {
return function(e) {
var data
try {
data = JSON.parse(e.data)
} catch(err) {
console.log('vimeo messaging error', err)
data = {}
}
if(!data.player_id && data.event === 'play') console.warn('vimeo message play event with no player_id')
if(data.player_id === self.playerID) {
if(data.event === 'ready') {
// fix for "Unhandled Promise Rejection"
// remove when vimeo fixes?
setTimeout(function(){ onReady(data) }, 10)
}
if(data.event === 'error') {
console.log('vimeo messaging error', data)
}
if(data.event === 'volumechange' && data.data.volume > 0) {
if(initialVolumeChange && self.unmuteBtn) {
stage.userInteraction = true
self.unmuteBtn.display = 'none'
self.unmuteBtn.removeEventListener('click', self.unmuteClick)
}
initialVolumeChange = true
}
if(data.method === 'getVideoWidth' && data.value) {
if(data.value !== self.videoWidth) {
if(!vars.thumbBuild) {
self.width = data.value
self.element.setAttribute('width', data.value)
}
self.videoWidth = data.value
if(self.videoHeight) {
self.dispatchEvent(VIMEO_METADATA_LOADED)
}
}
}
if(data.method === 'getVideoHeight' && data.value) {
if(data.value !== self.videoHeight) {
if(!vars.thumbBuild) {
self.height = data.value
self.element.setAttribute('height', data.value)
}
self.videoHeight = data.value
if(self.videoWidth) {
self.dispatchEvent(VIMEO_METADATA_LOADED)
}
}
}
switch(data.event) {
case 'finish':
ended()
break
case 'pause':
if(data.data.seconds >= data.data.duration - 1) {
ended()
} else {
self.dispatchEvent(PAUSED)
if(typeof self.onpause === 'function') self.onpause()
// removed this due to git issue
// video keeps playing in the background #1245
// window.removeEventListener("message", messaging, false)
self.paused = true
}
break
case 'play':
self.dispatchEvent(PLAY)
if(typeof self.onplay === 'function') self.onplay()
self.paused = false
break
}
}
}
}
function onReady(data) {
// occassionally... self is null because it was destroyed and onReady is called from a setTimeout
if(self) {
self.loaded = true
if(!stage.userInteraction && isAutoPlay) {
// need to implement tap-to-unmute button
self.element.contentWindow.postMessage(JSON.stringify({
"method": "setMuted",
"value": true
}), targetOrigin)
}
if(self && self.element.contentWindow) {
self.element.contentWindow.postMessage(JSON.stringify({
"method": "getVolume",
"value": currentPlayer
}), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": "getMuted",
"value": currentPlayer
}), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": "getVideoWidth",
"value": currentPlayer
}), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": "getVideoHeight",
"value": currentPlayer
}), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": 'addEventListener',
"value": 'volumechange'
}), targetOrigin)
// self.element.contentWindow.postMessage(JSON.stringify({
// "method": 'addEventListener',
// "value": 'mutedchange'
// }), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": 'addEventListener',
"value": 'finish'
}), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": 'addEventListener',
"value": 'pause'
}), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": 'addEventListener',
"value": 'play'
}), targetOrigin)
self.element.contentWindow.postMessage(JSON.stringify({
"method": 'addEventListener',
"value": 'error'
}), targetOrigin)
}
}
}
function checkSpaceBar(e) {
if(self && keyCode[e.keyCode] === SPACE_BAR) {
self.togglePlay()
}
}
self.removeKeyListener = function() {
stage.removeEventListener(KEY_DOWN, checkSpaceBar)
}
return self
}
VimeoPlayer.playerID = 0
VimeoPlayer.getNextPlayerID = function() {
return VimeoPlayer.playerID++
}
function SiteController(vars) {
var self = new ControllerProxy({events:new EventSandbox()})
var siteInit = true
var state
var passwd
var downloadOverlay
var search
var windowScrollTimer
var windowScrolling = false
var _captionLocal = {}
var unresizedOrientationChange = false
var scrollTimer
vars.parent = self
vars.siteControllerEvents = self.events
self.siteView = new SiteView(vars)
if(USER_AGENT === MOBILE && STATE.overrides.menuDisplaceMobile) {
// dont add siteView to stage
} else if(USER_AGENT === TABLET && STATE.overrides.menuDisplaceTablet) {
// dont add siteView to stage
} else {
stage.addChild(self.siteView)
}
function init() {
if(!LAYOUT_MODEL.siteDisplayBehavior && !STATE.siteView.unifiedPageScroll()) {
LAYOUT_MODEL.siteDisplayBehavior = 'none' // none = legacy
}
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
LAYOUT_MODEL.siteDisplayBehavior = 'none'
}
// set navCursorType for legacy
if(/disabled/.test(LAYOUT_MODEL.cursorIconStyle)) {
LAYOUT_MODEL.navCursorType = LAYOUT_MODEL.cursorIconStyle
} else {
LAYOUT_MODEL.navCursorType = LAYOUT_MODEL.navCursorType ? LAYOUT_MODEL.navCursorType : "cursor"
}
stage.backgroundColor = LAYOUT_MODEL.siteBackgroundColor
// hack due to fullscreen issue on android browsers
if(isAndroidMobile()) LAYOUT_MODEL.mobileAutoPlay = false
self.siteView.updateStyle()
// webkitFontOptions()
vars.parentView = self.siteView
vars.parentController = self
vars.events = self.events
vars.siteControllerEvents = self.events
self.sectionController = new vars.SectionController(vars)
self.menuController = new vars.MenuController(vars)
vars.menuController = self.menuController
if(!(USER_AGENT === MOBILE || (USER_AGENT === TABLET && LAYOUT_MODEL.footerOnMenuTablet))) {
self.footerController = new vars.FooterController(vars)
}
self.logoController = new vars.LogoController(vars)
self.navbarController = new vars.NavbarController(vars)
self.caption = new Caption()
self.siteView.addChild(self.caption.container)
self.addressController = new vars.AddressController(vars)
if(LAYOUT_MODEL.navCursorType === 'cursor' && !isPod() && !isPad()) {
self.cursor = new vars.Cursor(vars)
self.siteView.addChild(self.cursor)
}
self.tooltip = new vars.Tooltip(vars)
self.service = new vars.SiteService(vars)
self.addressController.service = self.service
if(isLogin) {
if(SETTINGS_MODEL.adminLockout) {
alert('ADMIN LOCKED FOR MAINTENANCE.
Please try again later.
If problem persists, contact support.')
} else if(!isSupportedBrowserForAdmin(BROWSER_NAME, BROWSER_VERSION)) {
alert('Admin not supported for this browser [' + BROWSER_NAME + ' ' + BROWSER_VERSION + ']. Please use latest version of Chrome, Firefox, Safari or MS Edge.')
} else {
self.login = new Login(vars)
}
}
self.events.dispatchEvent(LAYOUT_MODEL_CHANGE, {id:'layoutModelInit'})
self.events.addEventListener(NAVBAR_OVERLAY_BTN_CLICK, navbarOverlayBtnClick)
self.events.addEventListener(NAVBAR_NAV_CLICK, navbarNavClick)
self.events.addEventListener(NAVBAR_FULLSCREEN, navbarFullscreen)
self.events.addEventListener(MENU_CLICK, menuClick)
self.events.addEventListener(FOOTER_CLICK, footerClick)
self.events.addEventListener(LOGO_CLICK, logoClick)
self.events.addEventListener(THUMB_CLICK, thumbClick)
self.events.addEventListener(ADDRESS_URI_CHANGE, addressChange)
self.events.addEventListener('ADDRESS_URI_CHANGE_PASSIVE', addressChangePassive)
self.events.addEventListener(ADMIN_LOADED, adminEventListeners)
self.events.addEventListener(CONTACT_FORM_SUBMIT, contactFormSubmit)
self.events.addEventListener(SHARE_FORM_SUBMIT, shareFormSubmit)
self.events.addEventListener(INQUIRY_FORM_SUBMIT, inquiryFormSubmit)
self.events.addEventListener(POP_UP, onPopup)
self.events.addEventListener('OVER_LOGO', checkMenuLogoOverlap)
self.events.addEventListener('privateGalleryAuthCheck', privateGalleryAuthCheck)
self.events.addEventListener('passwordViewUpdate', passwordUpdate)
self.events.addEventListener('updateAssetId', checkCaptionOnScrollStop)
self.events.addEventListener('UPDATE_CONTENT_HEIGHT', function() {
clearTimeout(scrollTimer)
scrollTimer = setTimeout(function() {
self.siteView.updatePosition()
}, 50)
})
self.events.addEventListener(PAGE_LOADED, loadCustomJs)
self.events.addEventListener('siteAnchorCaptionUpdate', updateCaption)
self.events.addEventListener('SEARCH_SUBMIT', searchSubmit)
self.events.addEventListener('lightboxDownloadOverlayOpen', lightboxDownloadOverlayOpen)
self.events.addEventListener('lightboxUpdateItem', lightboxUpdateItem)
self.events.addEventListener('lightboxDownloadPdf', lightboxDownloadPdf)
self.events.addEventListener('lightboxDownloadZip', lightboxDownloadZip)
self.events.addEventListener('attachmentDownload', attachmentDownload)
self.events.addEventListener('MENU_DOCK_TOGGLE', setMobileLogoVisibility)
stage.addEventListener(RESIZE_END, resize)
stage.addEventListener(GESTURE_END, gestureEnd)
stage.addEventListener(ORIENTATION_CHANGE, orientationChange)
stage.addEventListener(KEY_DOWN, keyDown)
if(isPod() || isPad()) {
window.addEventListener("scroll", function(){
if(!windowScrollTimer) {
// scroll start stuff here
}
clearTimeout(windowScrollTimer)
// active scrolling stuff here
windowScrolling = true
windowScrollTimer = setTimeout(function() {
// scroll stop stuff here
windowScrollTimer = null
windowScrolling = false
if(checkMobileResize()) { // iphone orientation resize issues #1328 #1338
self.events.dispatchEvent(RESIZE_END)
unresizedOrientationChange = false
}
}, 200)
})
}
if(stage.zoom > 1) {
self.events.dispatchEvent(RESIZE_END)
} else {
// run cb to set isMenuOverlayStateChange on init
resize()
}
self.events.addEventListener('cursorAxisUpdate', cursorAxisUpdate)
ORIENTATION = Math.abs(window.orientation) === 90 ? 'horizontal' : 'vertical'
if(window.isStaging) {
var unstageBtn = buildUnstageBtn()
self.siteView.addChild(unstageBtn)
}
STATE.cacheLightboxSection()
}
function adminEventListeners() {
dx.admin.events.addEventListener(ACCOUNT_MODEL_CHANGE, accountModelChange)
dx.admin.events.addEventListener(FONTS_MODEL_CHANGE, fontsModelChange)
dx.admin.events.addEventListener(FILES_MODEL_CHANGE, filesModelChange)
dx.admin.events.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange)
dx.admin.events.addEventListener(MEDIA_MODEL_CHANGE, mediaModelChange)
dx.admin.events.addEventListener(NAVBAR_MODEL_CHANGE, navbarModelChange)
dx.admin.events.addEventListener(PDF_MODEL_CHANGE, pdfModelChange)
dx.admin.events.addEventListener(SETTINGS_MODEL_CHANGE, settingsModelChange)
dx.admin.events.addEventListener(SECTIONS_MODEL_CHANGE, sectionsModelChange)
dx.admin.events.addEventListener(ADMIN_MOUSE_DOWN, adminMouseDown)
dx.admin.events.addEventListener(ADMIN_MOUSE_UP, adminMouseUp)
self.events.addEventListener('adminPageviewImageSizes', function(pageImageSizes) {
dx.admin.events.dispatchEvent('adminPageviewImageSizes', pageImageSizes)
})
}
function loadCustomJs() {
self.events.dispatchEvent(SITE_SERVICE_GET_FILE, {name:'js'})
}
function adminMouseDown() {
self.events.dispatchEvent(ADMIN_MOUSE_DOWN)
}
function adminMouseUp() {
self.events.dispatchEvent(ADMIN_MOUSE_UP)
}
function gestureEnd() {
if(stage.zoom <= 1) {
// resize()
}
}
function checkMobileResize() {
return (isPod() || isPad()) && unresizedOrientationChange && window.innerHeight === document.documentElement.clientHeight
}
function resize(e) {
if(/responsive/.test(LAYOUT_MODEL.menuAlignHorizontal)) {
// new setting to allow for faux @media size with a default of 800
var pixelRatio = 1
if(isPod()) pixelRatio = window.devicePixelRatio || 1
var width = (LAYOUT_MODEL.screenWidthBreakpoint || 800) * pixelRatio
var prevResponsiveOverlay = layoutCalcs.isMenuResponsiveOverlay
layoutCalcs.isMenuResponsiveOverlay = USER_AGENT !== MOBILE && stage.width < width
layoutCalcs.isMenuOverlayStateChange = prevResponsiveOverlay !== layoutCalcs.isMenuResponsiveOverlay
} else {
layoutCalcs.isMenuResponsiveOverlay = false
layoutCalcs.isMenuOverlayStateChange = false
}
if(isPod() || isPad()) {
ORIENTATION = Math.abs(window.orientation) === 90 ? 'horizontal' : 'vertical'
if(stage.zoom <= 1) { // prevent resize for zoom
if(!windowScrolling) { // prevent resize for scroll
self.events.dispatchEvent(RESIZE_END)
self.siteView.updatePosition(e)
updateCaptionStyle()
}
setTimeout(function() { // iphone orientation resize issues #1328 #1338
if(checkMobileResize()) {
self.events.dispatchEvent(RESIZE_END)
unresizedOrientationChange = false
}
}, 1000)
}
} else {
// desktop
self.events.dispatchEvent(RESIZE_END)
self.siteView.updatePosition(e)
updateCaptionStyle()
}
if(search) search.updatePosition()
if(passwd) passwd.updatePosition()
}
function orientationChange() {
ORIENTATION = Math.abs(window.orientation) === 90 ? 'horizontal' : 'vertical'
self.events.dispatchEvent(ORIENTATION_CHANGE)
setTimeout(function() { // iphone orientation resize issues #1328 #1338
self.events.dispatchEvent(RESIZE_END)
}, 50)
}
function onPopup(e) {
popup = new vars.Popup(vars, e)
}
function navbarOverlayBtnClick(e) {
self.events.dispatchEvent(ADDRESS_OVERLAY_CHANGE, e)
}
function navbarNavClick(e) {
self.events.dispatchEvent(ADDRESS_ASSET_CHANGE, e)
}
function navbarFullscreen() {
self.events.dispatchEvent(FULLSCREEN_TOGGLE)
}
function footerClick(e) {
self.events.dispatchEvent(ADDRESS_SECTION_CHANGE, e)
}
function menuClick(e) {
if(e.section && e.section.isSearch) {
if(search) {
search.setTags(state.searchTags)
search.open(e.section)
} else {
search = searchInput({navEvent:e, section:e.section, events:self.events, tags:state.searchTags})
}
if(STATE.menuView.placement() === 'overlay' && self.menuController.menuView.dock.toggleState()) {
self.menuController.menuView.closeDock()
}
} else {
self.events.dispatchEvent(ADDRESS_SECTION_CHANGE, e)
}
}
function thumbClick(e) {
self.events.dispatchEvent(ADDRESS_SECTION_CHANGE, e)
}
function logoClick(e) {
self.events.dispatchEvent(ADDRESS_SECTION_CHANGE, e)
}
function keyDown(e) {
if((e.keyCode === keyName.LEFT_ARROW || e.keyCode === keyName.UP_ARROW || e.keyCode === keyName.RIGHT_ARROW || e.keyCode === keyName.DOWN_ARROW) && !stage.disableKeyNavigation) {
var navDir
switch(e.keyCode) {
case keyName.LEFT_ARROW:
navDir = 'prev'
break
case keyName.UP_ARROW:
navDir = 'prev'
break
case keyName.RIGHT_ARROW:
navDir = 'next'
break
case keyName.DOWN_ARROW:
navDir = 'next'
break
}
if(navDir) self.events.dispatchEvent(ADDRESS_ASSET_CHANGE, {navDir:navDir})
}
}
function buildIntro(e) {
self.savedUriInfo = e
self.events.addEventListener(INTRO_COMPLETE, introComplete)
self.introView = new vars.IntroView(vars)
if(USER_AGENT === MOBILE && STATE.overrides.menuDisplaceMobile) {
stage.addChild(self.introView)
} else if(USER_AGENT === TABLET && STATE.overrides.menuDisplaceTablet) {
stage.addChild(self.introView)
} else {
self.siteView.addChild(self.introView)
}
self.events.addEventListener(RESIZE_END, self.introView.updatePosition)
}
stage.addEventListener(KEY_DOWN, function(e) {
if(keyCode[e.keyCode] === SPACE_BAR) {
self.events.dispatchEvent('spacebarPlay', state)
}
})
function addressChange(e) {
state = e
STATE.section(e.section)
// update overflow ^^^^ need to set section first
self.siteView.setOverflow()
self.events.dispatchEvent('autoplayTarget', e)
safariPulsingTextHack()
/*check for valid media. append it to the event object before dispatch*/
cursorThumbsUpdate(e)
// added check for pdf file extension - site won't load if client puts a pdf file in the introFile
if(!e.info.isDeepLink && (!e.path || e.info.isIntroGallery) && siteInit && (STATE.introFile || LAYOUT_MODEL.introFile)) {
buildIntro(e)
} else if(STATE.lightboxSection) { // check for lightbox section media
buildLightbox(e)
} else {
self.events.dispatchEvent(SITE_URI_CHANGE, e)
}
siteInit = false
if(e.section.isSearch && !e.section.mediaItems.length && !e.section.media.length) {
if(search) {
search.setTags(e.searchTags)
search.open(e.section)
} else {
search = searchInput({navEvent:e, section:e.section, events:self.events, tags:e.searchTags})
}
search.blur()
search.setMessage('No results found')
} else if(e.section.isSearch && search){
search.close()
}
if(passwd) removePasswordView(0.35)
var isSlideshowCaption = isSlideshowGallery(state.section) && LAYOUT_MODEL.slideshowCaptions
if(!isSlideshowCaption) updateCaption()
setLegacyOverflow()
self.siteView.updatePosition()
setMobileLogoVisibility()
}
function setMobileLogoVisibility() {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
if(self.menuController.menuView.dock.toggleState()) {
// when the menu is open _ show the logo
self.logoController.show()
} else {
if(LAYOUT_MODEL.mobileLogoPlacement === 'site') {
self.logoController.show()
} else if(LAYOUT_MODEL.mobileLogoPlacement === 'thumbs' && /thumbs/.test(layoutCalcs._uriState.mode)) {
self.logoController.show()
} else {
// should this hide for tablet sites ... similar to chris straley for mobile
self.logoController.hide()
}
}
}
}
function confirmEnableLightbox(e) {
if(e.section.isUserEnableLightbox && !STATE.userEnabledLightbox) {
confirm('Lightbox has no content. Would you like to enable lightbox on this site?', {
onConfirm: function() {
STATE.userEnabledLightbox = true
self.events.dispatchEvent(SITE_URI_CHANGE, e)
},
onCancel: function() {
self.events.dispatchEvent(SITE_URI_CHANGE, e)
}
})
} else {
alert('Lightbox has no content. You can add content to your lightbox from other galleries.', {
onClose: function() {
self.events.dispatchEvent(SITE_URI_CHANGE, e)
}
})
}
}
function buildLightbox(e) {
var noMediaInLightboxSection = STATE.lightboxSection && !STATE.lightboxSection.media.length
var isGetLocalHashMedia = STATE.lightboxHash && noMediaInLightboxSection
var currentSectionIsLightbox = e.section.key === STATE.lightboxSection.key
if(isGetLocalHashMedia) {
self.service.getLightboxMedia(STATE.lightboxHash)
.then(function(response) {
// asyncronously get media for lightbox, do the following lines when the media ids return
STATE.lightboxSection.media = response.media
.filter(function(id) {
return MEDIA_MODEL[id] && !MEDIA_MODEL[id].disableLightbox
})
STATE.lightboxSection.mediaItems = STATE.lightboxSection.media
})
.catch(function(response) {
// lightbox section has no media
localStorage.removeItem('lightboxHash')
console.log('Lightbox has no content', response)
})
.then(function() {
if(currentSectionIsLightbox) {
confirmEnableLightbox(e)
} else {
self.events.dispatchEvent(SITE_URI_CHANGE, e)
}
})
} else if(currentSectionIsLightbox && noMediaInLightboxSection) {
confirmEnableLightbox(e)
} else {
self.events.dispatchEvent(SITE_URI_CHANGE, e)
}
}
function addressChangePassive(e) {
state = e
// self.events.dispatchEvent(PAUSE_MEDIA)
cursorThumbsUpdate(e)
self.events.dispatchEvent('SITE_URI_CHANGE_PASSIVE', e)
self.events.dispatchEvent('autoplayTarget', e)
siteInit = false
if(passwd) removePasswordView(0.35)
var isSlideshowCaption = isSlideshowGallery(state.section) && LAYOUT_MODEL.slideshowCaptions
if(!isSlideshowCaption) updateCaption()
// unifiedPageScrolling()
}
function checkCaptionOnScrollStop(e) {
if(USER_AGENT !== MOBILE) {
var mediaToRender = removeLinksFromMedia(state.section.mediaItems)
var mediaItem = getMediaById(mediaToRender[e.id])
var captionText = getCaptionText(mediaItem)
_captionLocal = mediaItem.overrides || {}
var anchorTo = firstValid(mediaItem && mediaItem.overrides.captionAnchorTo, STATE.overrides.captionAnchorTo)
var isSlideshowCaption = isSlideshowGallery(state.section) && LAYOUT_MODEL.slideshowCaptions
if((isSlideshowCaption || state.mode.indexOf('caption') > -1) && captionText && anchorTo === 'site') {
self.caption.text = plainTextToHtml(captionText)
self.caption.show(updateCaptionStyle)
} else {
self.caption.text = ''
self.caption.hide()
if(self.caption.scroll) self.caption.scroll.destroy()
}
}
}
function updateCaption(mediaItem) {
if(state && state.asset && self.caption) {
var mediaItem = mediaItem || state.asset
if(!mediaItem.overrides) mediaItem.overrides = {}
_captionLocal = mediaItem.overrides || {}
self.caption.text = plainTextToHtml(getCaptionText(mediaItem))
var isSlideshowCaption = isSlideshowGallery(state.section) && LAYOUT_MODEL.slideshowCaptions
var anchorTo = firstValid(USER_AGENT === MOBILE && !LAYOUT_MODEL.captionMobileOverrides && !isSlideshowCaption ? 'site' : undefined, mediaItem.overrides.captionAnchorTo, STATE.overrides.captionAnchorTo)
if(anchorTo === 'site' && (isSlideshowCaption || state.mode.indexOf('caption') > -1)) {
self.caption.show(updateCaptionStyle)
} else {
self.caption.text = ''
self.caption.hide()
if(self.caption.scroll) self.caption.scroll.destroy()
}
} else if(self.caption) {
self.caption.text = ''
self.caption.hide()
if(self.caption.scroll) self.caption.scroll.destroy()
}
}
function updateCaptionStyle() {
if(USER_AGENT !== MOBILE) self.caption.container.position = 'fixed'
self.caption.container.transition = 0
self.caption.container.zIndex = STATE.captionView.zIndex()
if(firstValid(_captionLocal.captionCloseButton, STATE.overrides.captionCloseButton)) {
self.caption.showCloseButton()
} else {
self.caption.hideCloseButton()
}
var alignVars = {
onInit:function() {
if(self.caption.scroll) {
self.caption.scroll.hide()
}
},
onComplete:function() {
if(self.caption.scroll) {
self.caption.scroll.show()
self.caption.scroll.resize()
}
}
}
var isLegacyMobileCaptions = USER_AGENT === MOBILE && !LAYOUT_MODEL.captionMobileOverrides
var bgColor = firstValid(_captionLocal.captionBackgroundRectColor, STATE.overrides.captionBackgroundRectColor)
var bgAlpha = firstValid(isLegacyMobileCaptions ? LAYOUT_MODEL.overlayAlpha : undefined, _captionLocal.captionBackgroundAlpha, STATE.overrides.captionBackgroundAlpha)
self.caption.backgroundColor = toRgba(bgColor, bgAlpha)
self.caption.fontFamily = _captionLocal.captionFont || STATE.overrides.captionFont
self.caption.fontSize = stage.width < LAYOUT_MODEL.screenWidthBreakpoint ?
(_captionLocal.captionFontSizeBreakpoint || STATE.overrides.captionFontSizeBreakpoint || _captionLocal.captionFontSize || STATE.overrides.captionFontSize) :
(_captionLocal.captionFontSize || STATE.overrides.captionFontSize)
self.caption.fontColor = _captionLocal.captionFontColor || STATE.overrides.captionFontColor
self.caption.width = firstValid(isLegacyMobileCaptions ? stage.width : undefined, _captionLocal.captionWidth, STATE.overrides.captionWidth)
self.caption.height = firstValid(isLegacyMobileCaptions ? stage.height : undefined, _captionLocal.captionHeight, STATE.overrides.captionHeight)
alignVars.width = firstValid(_captionLocal.captionWidth, STATE.overrides.captionWidth)
alignVars.height = firstValid(_captionLocal.captionHeight, STATE.overrides.captionHeight)
alignVars.hOrigin = 0
alignVars.vOrigin = 0
alignVars.hRange = stage.width
alignVars.vRange = stage.height
alignVars.hAlign = _captionLocal.captionAlignHorizontal || STATE.overrides.captionAlignHorizontal
alignVars.vAlign = _captionLocal.captionAlignVertical || STATE.overrides.captionAlignVertical
alignVars.hOffset = firstValid(_captionLocal.captionOffsetX, STATE.overrides.captionOffsetX)
alignVars.vOffset = firstValid(_captionLocal.captionOffsetY, STATE.overrides.captionOffsetY)
self.caption.textAlign = _captionLocal.captionTextAlign || STATE.overrides.captionTextAlign
self.caption.paddingTop = firstValid(_captionLocal.captionPaddingTop, STATE.overrides.captionPaddingTop)
self.caption.paddingRight = firstValid(_captionLocal.captionPaddingRight, STATE.overrides.captionPaddingRight)
self.caption.paddingBottom = firstValid(_captionLocal.captionPaddingBottom, STATE.overrides.captionPaddingBottom)
self.caption.paddingLeft = firstValid(_captionLocal.captionPaddingLeft, STATE.overrides.captionPaddingLeft)
setTimeout(function() {
self.caption.buildScroll({
color:_captionLocal.captionScrollbarColor || STATE.overrides.captionScrollbarColor,
hover:_captionLocal.captionScrollbarHover || STATE.overrides.captionScrollbarHover,
align: firstValid(isLegacyMobileCaptions ? 'top' : undefined, _captionLocal.captionTextAlignVertical, STATE.overrides.captionTextAlignVertical),
side:_captionLocal.captionScrollbarAlignment || STATE.overrides.captionScrollbarAlignment,
alpha:firstValid(_captionLocal.captionScrollbarBgAlpha, STATE.overrides.captionScrollbarBgAlpha),
width:firstValid(_captionLocal.captionScrollbarWidth, STATE.overrides.captionScrollbarWidth),
offsetX:firstValid(_captionLocal.captionScrollbarHorizontalOffset, STATE.overrides.captionScrollbarHorizontalOffset),
offsetY:firstValid(_captionLocal.captionScrollbarVerticalOffset, STATE.overrides.captionScrollbarVerticalOffset)
})
}, 0)
setTimeout(function() {
// put this setTimeout in for initial load due to:
// caption text placement on initial load is off #1156
// https://github.com/photofolio/designx/issues/1156
// need to find a better solution
self.caption.buildScroll({
color:_captionLocal.captionScrollbarColor || STATE.overrides.captionScrollbarColor,
hover:_captionLocal.captionScrollbarHover || STATE.overrides.captionScrollbarHover,
align: firstValid(isLegacyMobileCaptions ? 'top' : undefined, _captionLocal.captionTextAlignVertical, STATE.overrides.captionTextAlignVertical),
side:_captionLocal.captionScrollbarAlignment || STATE.overrides.captionScrollbarAlignment,
alpha:firstValid(_captionLocal.captionScrollbarBgAlpha, STATE.overrides.captionScrollbarBgAlpha),
width:firstValid(_captionLocal.captionScrollbarWidth, STATE.overrides.captionScrollbarWidth),
offsetX:firstValid(_captionLocal.captionScrollbarHorizontalOffset, STATE.overrides.captionScrollbarHorizontalOffset),
offsetY:firstValid(_captionLocal.captionScrollbarVerticalOffset, STATE.overrides.captionScrollbarVerticalOffset)
})
}, 500)
if(isLegacyMobileCaptions) {
self.caption.mask.y = 40
self.caption.mask.width = stage.width
self.caption.mask.height = stage.height - 40
self.caption.container.x = 0
self.caption.container.y = 0
self.caption.paddingTop = 10
self.caption.paddingRight = 10
self.caption.paddingBottom = 10
self.caption.paddingLeft = 10
} else {
Align(self.caption.container, self.updateSpeed, alignVars)
}
}
function safariPulsingTextHack() {
if(isFillSite() && layoutCalcs.isLandingMedia) {
self.events.dispatchEvent('fillSiteMode')
} else {
self.events.dispatchEvent('nonFillSiteMode')
}
}
function introComplete() {
self.events.removeEventListener(INTRO_COMPLETE, introComplete)
self.events.removeEventListener(RESIZE_END, self.introView.updatePosition)
if(self.introView) self.siteView.removeChild(self.introView)
self.events.dispatchEvent(SITE_URI_CHANGE, self.savedUriInfo)
delete self.savedUriInfo
}
function searchSubmit(submission) {
self.events.dispatchEvent(ADDRESS_SECTION_CHANGE, submission)
}
function lightboxDownloadOverlayOpen() {
if(!downloadOverlay) {
downloadOverlay = lightboxDownloadOverlay({events:self.events})
downloadOverlay.open()
} else {
downloadOverlay.open()
}
}
function updateLightboxSectionMedia(id, action) {
var idx = STATE.lightboxSection.media.indexOf(id)
if(action === 'remove') {
STATE.lightboxSection.media = STATE.lightboxSection.media
.filter(function(_id) {
return _id !== id && MEDIA_MODEL[id] && !MEDIA_MODEL[id].disableLightbox
})
STATE.lightboxSection.mediaItems = STATE.lightboxSection.media
} else {
STATE.lightboxSection.media =
STATE.lightboxSection.media.concat(id)
.filter(function(id) {
return MEDIA_MODEL[id] && !MEDIA_MODEL[id].disableLightbox
})
STATE.lightboxSection.mediaItems = STATE.lightboxSection.media
}
}
function isValidLightboxHash(str) {
return !!str && str.length === 24
}
function lightboxUpdateItem(data) {
var localLightboxHash = STATE.lightboxHash
if(!isValidLightboxHash(localLightboxHash)) {
var media = [data.id]
if(STATE.lightboxSection) {
media = STATE.lightboxSection.media.concat(data.id)
.filter(function(id) {
return MEDIA_MODEL[id] && !MEDIA_MODEL[id].disableLightbox
})
// came in on lightbox deep link but does not have local lightbox hash
// create a new lightbox from the deep linked lightbox
}
self.service.createLightbox(media)
.then(function(response) {
localStorage.setItem('lightboxHash', response.hash)
updateLightboxSectionMedia(data.id, data.action)
})
.catch(function(response) {
console.log('Error creating lightbox', response)
})
} else {
updateLightboxSectionMedia(data.id, data.action)
self.service.updateLightbox(localLightboxHash, STATE.lightboxSection.media)
.then(function(response) {
// console.log('Lightbox updated', response)
})
.catch(function(response) {
console.log('Error updating lightbox', response)
})
}
}
function download(url, name) {
var link = document.createElement("a")
// Set link's href to point to the Blob URL
link.href = url
link.download = name
link.target = '_blank'
// Append link to the body
document.body.appendChild(link)
// Dispatch click event on the link
// This is necessary as link.click() does not work on the latest firefox
link.dispatchEvent(new MouseEvent('click', {
bubbles: true,
cancelable: true,
view: window
}))
// Remove link from body
document.body.removeChild(link)
}
function downloadForceClick(blob, name) {
// Convert your blob into a Blob URL (a special url that points to an object in the browser's memory)
var blobUrl = URL.createObjectURL(blob)
download(blobUrl, name)
setTimeout(function() {
URL.revokeObjectURL(link.href)
}, 250)
}
function getScript(src) {
return new Promise(function(resolve, reject) {
var scriptEl = document.createElement('script')
scriptEl.onload = resolve
scriptEl.onerror = reject
document.head.append(scriptEl)
scriptEl.src = src
})
}
function buildPdf(mediaIds) {
return new Promise(function(resolve, reject) {
var doc = new PDFDocument({
size:[PDF_MODEL.pdfDocPageWidth, PDF_MODEL.pdfDocPageHeight],
margins: {
top:0,
right:0,
bottom:0,
left:0
}
})
// pipe the document to a blob
var stream = doc.pipe(blobStream())
// add your content to the document here, as usual
var imageData = mediaIds
.map(function(id) {
return MEDIA_MODEL[id]
})
var lineHeight = 58
var points = PDF_MODEL.pdfDocPageHeight / 72
if(PDF_MODEL.pdfDocCoverImage) {
imageData.unshift({
content:PDF_MODEL.pdfDocCoverImage
})
} else if(PDF_MODEL.pdfDocCoverText) {
doc.rect(0, 0, PDF_MODEL.pdfDocPageWidth, PDF_MODEL.pdfDocPageHeight)
.fill(PDF_MODEL.pdfDocCoverBgColor)
doc.font('Helvetica', lineHeight)
.moveDown(Math.round(points / 2))
.fill(PDF_MODEL.pdfDocCoverTextColor)
.text(PDF_MODEL.pdfDocCoverText, {
align:'center'
})
.addPage({
size:[PDF_MODEL.pdfDocPageWidth, PDF_MODEL.pdfDocPageHeight],
margins: {
top:0,
right:0,
bottom:0,
left:0
}
})
}
Promise.all(imageData
.map(function(data) {
return fetch(SETTINGS_MODEL.cdnSslUri + '/' + data.content)
.then(function(response) {
return response.arrayBuffer()
})
}))
.then(function(arrayBuffers) {
arrayBuffers
.forEach(function(buffer, idx) {
try {
if(idx > 0) {
doc.addPage({
size:[PDF_MODEL.pdfDocPageWidth, PDF_MODEL.pdfDocPageHeight],
margins: {
top:0,
right:0,
bottom:0,
left:0
}
})
}
doc.rect(0, 0, PDF_MODEL.pdfDocPageWidth, PDF_MODEL.pdfDocPageHeight)
.fill(PDF_MODEL.pdfDocPageBgColor)
.image(buffer, {
fit:[PDF_MODEL.pdfDocPageWidth, PDF_MODEL.pdfDocPageHeight],
align:'center',
valign:'center'
})
} catch(e) {
console.log('problem with this pdf file', e)
}
})
doc.end()
})
// get a blob when you're done
stream.on('finish', function() {
// get a blob you can do whatever you like with
resolve(stream.toBlob('application/pdf'))
})
stream.on('error', reject)
})
}
function lightboxDownloadPdf() {
var list = STATE.lightboxSection.media
if(window.PDFDocument && window.blobStream) {
// console.log('PDFDocument and blobStream exist - build pdf')
} else {
Promise.all([
getScript(CDN_PF_SSL_URI + '/scripts/blob-stream.js'),
getScript(CDN_PF_SSL_URI + '/scripts/pdfkit.standalone.js'),
self.service.getPdfModel()
])
.then(function(results) {
var model = results[2]
// console.log('results:', results)
if(model.status === 'fail') {
console.log('failed to get pdf model')
} else {
PDF_MODEL = DX_MODEL.pdf = model
// console.log('downloaded PDFDocument, blobStream, PDF_MODEL')
var customName = PDF_MODEL.pdfDocCustomName ? PDF_MODEL.pdfDocCustomName : window.location.host + '-lightbox'
customName = customName.split('.').pop() === 'pdf' ? customName : customName + '.pdf'
buildPdf(list)
.then(function(blob) {
downloadForceClick(blob, customName)
})
.catch(function(e) {
console.log('Error downloading pdf:', e)
})
}
})
.catch(function(e) {
console.log('Error:', e)
})
}
}
function lightboxDownloadZip() {
var filename = window.location.host + '-lightbox.zip'
Promise.all([
getScript(CDN_PF_SSL_URI + '/scripts/runtime1.min.js'),
getScript(CDN_PF_SSL_URI + '/scripts/client-zip-2.js')
])
.then(function(result) {
var pImages = STATE.lightboxSection.media
.map(function(id) {
return fetch(SETTINGS_MODEL.cdnSslUri + '/' + MEDIA_MODEL[id].content)
})
return downloadZip(pImages)
})
.then(function(result) {
return result.blob()
})
.then(function(blob) {
return downloadForceClick(blob, filename)
})
}
function requestAttachmentDownloadUrl(filename, cb) {
var xhr = new XMLHttpRequest()
xhr.addEventListener("load", function(e) {
var response = JSON.parse(e.target.response)
if(response.url && response.status === 'pass') {
cb(response.url)
} else {
alert('could not get upload authorization, check your connection')
}
}, false)
xhr.open("POST", "/dx/service/attachment/downloadurl")
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(JSON.stringify({filename:webSafeChars(filename)}))
}
function attachmentDownload(filename) {
requestAttachmentDownloadUrl(filename, function(url) {
download(url, filename)
})
}
function privateGalleryAuthCheck(e) {
if(!passwd) {
passwd = passwordInput({section:e.section, events:self.events})
self.events.dispatchEvent(PAUSE_MEDIA)
} else {
passwd.setMessage('PASSWORD')
passwd.open(e.section)
}
if(STATE.menuView.placement() === 'overlay' && self.menuController.menuView.dock.toggleState()) {
self.menuController.menuView.closeDock()
}
}
function passwordUpdate(passed) {
if(passed) {
removePasswordView()
} else {
passwd.setMessage('INCORRECT PASSWORD')
setTimeout(function(){
passwd.setMessage('')
}, 1000)
}
}
function removePasswordView() {
if(passwd) passwd.close()
}
function accountModelChange(e) {
self.events.dispatchEvent(ACCOUNT_MODEL_CHANGE, e)
}
function fontsModelChange(e) {
self.events.dispatchEvent(FONTS_MODEL_CHANGE, e)
}
function filesModelChange() {
}
function layoutModelChange(e) {
if(e && /site/.test(e.id)) self.siteView.updateStyle()
// webkitFontOptions()
self.events.dispatchEvent(LAYOUT_MODEL_CHANGE, e)
updateCaption()
setLegacyOverflow()
self.siteView.updatePosition()
if(/navCursorType/.test(e.id) && e.value === 'cursor') {
if(!self.cursor) {
self.cursor = new vars.Cursor(vars)
self.cursor.dispatchEvent('cursorAxisUpdate', getCursorAxis(STATE.overrides.transitionType))
self.siteView.addChild(self.cursor)
} else {
self.cursor.enabled = true
}
} else if(/navCursorType/.test(e.id)) {
if(self.cursor) self.cursor.enabled = false
}
if(self.cursor && /cursorBlendMode/.test(e.id)) self.cursor.dispatchEvent('cursorBlendMode', e)
if(search) {
stage.removeChild(search.overlay.background)
search = searchInput({navEvent:state, section:state.section, events:self.events, tags:state.searchTags})
} else if(passwd) {
stage.removeChild(passwd.overlay.background)
passwd = passwordInput({section:state.section, events:self.events})
}
}
function webkitFontOptions() {
if(BROWSER_NAME == 'Safari' || BROWSER_NAME == 'Chrome') {
if(LAYOUT_MODEL && LAYOUT_MODEL.fontRenderingOptions && LAYOUT_MODEL.fontRenderingOptions.enable) {
self.siteView.style.webkitFontSmoothing = LAYOUT_MODEL.fontRenderingOptions.webkitFontSmoothing
self.siteView.style.webkitTextStrokeWidth = LAYOUT_MODEL.fontRenderingOptions.webkitTextStrokeWidth + 'px'
} else {
self.siteView.style.webkitFontSmoothing = ''
self.siteView.style.webkitTextStrokeWidth = ''
}
}
}
function setLegacyOverflow() {
document.body.style.overflowY = STATE.overrides.siteDisplayBehavior === 'none' ? 'hidden' : 'auto'
}
function mediaModelChange(e) {
self.addressController.setTitle()
self.addressController.setMetaDescription()
self.events.dispatchEvent(MEDIA_MODEL_CHANGE, e)
if(exists(state, 'asset.id') === e.id) state.asset = e
updateCaption()
}
function navbarModelChange(e) {
self.events.dispatchEvent(NAVBAR_MODEL_CHANGE, e)
}
function pdfModelChange(e) {
self.events.dispatchEvent(PDF_MODEL_CHANGE, e)
}
function settingsModelChange(e) {
self.addressController.setTitle()
self.addressController.setMetaDescription()
self.events.dispatchEvent(SETTINGS_MODEL_CHANGE, e)
}
function sectionsModelChange(e) {
if(exists(state, 'section.id') === e.id) {
var section = getSectionById(e.id)
STATE.section(section)
}
self.addressController.setTitle()
self.addressController.setMetaDescription()
STATE.cacheLightboxSection()
self.events.dispatchEvent(SECTIONS_MODEL_CHANGE, e)
updateCaption()
}
function contactFormSubmit(e) {
self.events.dispatchEvent(SITE_SERVICE_CONTACT_FORM_SUBMIT, e)
}
function shareFormSubmit(e) {
self.events.dispatchEvent(SITE_SERVICE_SHARE_FORM_SUBMIT, e)
}
function inquiryFormSubmit(e) {
self.events.dispatchEvent(SITE_SERVICE_INQUIRY_FORM_SUBMIT, e)
}
function checkMenuLogoOverlap() {
stage.addEventListener(MOUSE_MOVE, menuLogoHitTest)
}
// function endCheckMenuLogoOverlap() {
// self.logoController.logoView.element.style.pointerEvents = 'auto'
// }
function menuLogoHitTest(e) {
if(self.menuController.menuView.menuText.hitTestPoint(e.pageX, e.pageY)) {
self.logoController.logoView.element.style.pointerEvents = 'none'
} else {
self.logoController.logoView.element.style.pointerEvents = 'auto'
}
}
function cursorAxisUpdate(e) {
if(self.cursor) self.cursor.dispatchEvent('cursorAxisUpdate', e)
}
function cursorThumbsUpdate(e) {
STATE.section(e.section)
var isThumbIcon = STATE.overrides.thumbnailType === 'none' || LAYOUT_MODEL.cursorIconStyle === 'none' ? false : true
if(self.cursor) self.cursor.dispatchEvent('cursorThumbsUpdate', isThumbIcon)
}
function buildUnstageBtn() {
var unstageIcon = new Button()
unstageIcon.position = 'fixed'
unstageIcon.element.style.display = 'block'
unstageIcon.element.style.zIndex = 500
unstageIcon.text = 'VIEW LIVE SITE'
unstageIcon.fontColor = '#FFF'
unstageIcon.backgroundColor = '#51CC47'
unstageIcon.width = 111
unstageIcon.height = 22
unstageIcon.right = 5
unstageIcon.bottom = 5
unstageIcon.borderRadius = 2
unstageIcon.alpha = 0.8
unstageIcon.addEventListener('mouseover', function() {
unstageIcon.alpha = 1
})
unstageIcon.addEventListener('mouseout', function() {
unstageIcon.alpha = 0.8
})
unstageIcon.addEventListener(CLICK, function() {
confirm('Switching to LIVE SITE, the page will refresh.', {
onConfirm: function() {
location.assign('/unstage')
},
onCancel: function() {
}
})
})
return unstageIcon
}
init.call(self)
return self
}
stage.addEventListener(LOAD, function() {
dx.address = Address
dx.site = new SiteController({
Sprite:Sprite,
TextField:TextField,
Bitmap:Bitmap,
Tile:Tile,
FooterController:FooterController,
FooterView:FooterView,
LogoController:LogoController,
LogoView:LogoView,
SectionController:SectionController,
MediaModule:MediaModule,
MenuController:MenuController,
MenuView:MenuView,
NavbarController:NavbarController,
NavbarView:NavbarView,
AddressController:AddressController,
OverlayController:OverlayController,
OverlayView:OverlayView,
ImageView:ImageView,
VideoView:VideoView,
PageView:PageView,
ContactView:ContactView,
VideoPlayer:VideoPlayer,
VimeoPlayer:VimeoPlayer,
LoadingIndicator:LoadingIndicator,
ThumbsModule:ThumbsModule,
Cursor:Cursor,
StaticNav:StaticNav,
Tooltip:Tooltip,
passwordInput:passwordInput,
searchInput:searchInput,
IntroView:IntroView,
SiteService:SiteService,
Popup:Popup,
TouchNav:TouchNav
})
})
function SiteView(vars) { // eslint-disable-line
var self = new ViewProxy({events:vars.siteControllerEvents})
self.zIndex = 0
self.position = STATE.siteView.unifiedPageScroll() ? 'relative' : 'absolute'
self.setOverflow = function() {
if(!(USER_AGENT === TABLET && LAYOUT_MODEL.menuDisplaceTablet !== false)) {
if(USER_AGENT !== MOBILE && /none/.test(STATE.overrides.siteDisplayBehavior)) {
self.element.style.overflow = 'hidden'
} else if(!/^unified/.test(STATE.overrides.siteDisplayBehavior)) {
// v16 cursor arrows cause site to overflow width(scroll horizontally) when + offset
self.element.style.overflowX = 'hidden'
self.element.style.overflowY = 'auto'
// } else if(/^unified/.test(STATE.overrides.siteDisplayBehavior) || STATE.siteView.unifiedPageScroll()) {
// self.element.style.overflowX = 'hidden'
// self.element.style.overflowY = 'auto'
} else {
self.element.style.overflow = 'hidden'
}
} else {
self.element.style.overflow = 'visible'
}
}
self.setOverflow()
self.element.setAttribute('class', 'SiteView')
self.name = 'SiteView'
if(BROWSER_NAME === 'Chrome') {
self.selectable = true
}
self.addEventListener(CHILD_ADDED, function() {
self.updatePosition()
})
var updatePosTimer
self.updatePosition = function() {
// clearTimeout(updatePosTimer)
// updatePosTimer = setTimeout(function() {
self.position = STATE.siteView.unifiedPageScroll() ? 'relative' : 'absolute'
self.width = STATE.siteView.width()
// self.height = STATE.siteView.height() || stage.height
// if(STATE.overrides.siteDisplayBehavior !== 'overlay' || isClosedGalleryOnlyOverlay()) {
// self.height = STATE.siteView.height() || stage.height
// }
if(layoutCalcs.mediaOverlayState !== 'open') {
self.height = STATE.siteView.height() || stage.height
}
if(window.fullScreen || document.webkitCurrentFullScreenElement) {
// hack added for bug #1563
self.height = stage.height
self.overflowY = 'scroll'
}
if(USER_AGENT === MOBILE && STATE.overrides.menuDisplaceMobile) {
self.x = stage.width
} else if(USER_AGENT === TABLET && STATE.overrides.menuDisplaceTablet) {
self.x = layoutCalcs.menuView.width()
}
// #1376 - a 200ms delay here was causing differing results for siteview height across multiple machines.
// siteDisplayBehavior was not getting result on mediaOverlayClose to get the correct siteview height for the main site.
// this was preventing scroll events since the siteview was stage.height
// }, 200)
}
self.updateStyle = function() {
self.backgroundColor = LAYOUT_MODEL.siteBackgroundColor
}
return self
}
/* global formatMediaType, percentToPixels, USER_AGENT, MOBILE, TABLET, stage, LAYOUT_MODEL, firstValid, getFontData, menuBullet, isPod, isPad, isSlideshowGallery, TOUCH_DEVICE, isFillSite, THUMB_SIZES*/
var passedSections = []
var layoutCalcs = {
_logoWidth:0, _logoHeight:0,
_footerWidth:0, _footerHeight:0,
_fotomotoWidth:0, _fotomotoHeight:0,
_navbarHeight:0,
_section:undefined,
_thumbContentHeight:0,
_mediaContentHeight:0,
_maskView:{},
_uriState:{},
mobileFooterPadding:5,
mediaOverlayState:'closed',
isLandingMedia: false,
isMenuResponsiveOverlay: false,
_activeMediaType: undefined,
_mediaMarginPrefix: undefined,
_sectionStates: Object.keys(SECTIONS_MODEL)
.reduce(function(acc, key) {
if(key === 'ROOT_SECTION') {
acc['/'] = {}
} else {
acc[key] = {
id: SECTIONS_MODEL[key].id,
key: SECTIONS_MODEL[key].key,
height: stage.height,
zoneHeight: stage.height,
assetId: 0,
mode: ''
}
}
return acc
}, {landingMedia:{key: 'landingMedia', zoneHeight: stage.height, height: stage.height, assetId: 0, mode: ''}}),
get _thumbsVisible() {
return this._section && this._section.key && this._sectionStates[this._section.key] && /thumbs/.test(this._sectionStates[this._section.key].mode)
},
set activeMediaType(value) {
this._mediaMarginPrefix = formatMediaType(value)
this._activeMediaType = value
},
updateSectionState: function(key, sectionState) {
var ths = this
ths._sectionStates[key] =
[sectionState].reduce(function(acc, newState) {
return Object.keys(newState)
.reduce(function(obj, prop) {
obj[prop] = newState[prop]
return obj
}, acc)
}, ths._sectionStates[key] || {})
},
resetSectionState: function() {
this._sectionStates =
Object.keys(SECTIONS_MODEL)
.reduce(function(acc, key) {
if(key === 'ROOT_SECTION') {
acc['/'] = {}
} else {
acc[key] = {
id: SECTIONS_MODEL[key].id,
key: SECTIONS_MODEL[key].key,
height: stage.height,
zoneHeight: stage.height,
assetId: 0,
mode: ''
}
}
return acc
}, {landingMedia:{key: 'landingMedia', zoneHeight: stage.height, height: stage.height, assetId: 0, mode: ''}})
},
getSectionState: function(key) {
return typeof key === 'string' && this._sectionStates[key]
},
getMaxScrollSectionHeight: function(mediaView) {
var length = mediaView.maxScroll.length
var position = mediaView.maxScroll.position
var isFixedMenu = STATE.menuView.menuPositionFixed()
var marginOverlap = getMarginOverlap() || 0
var menuSize = percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height)
var sitePaddingTop = percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height)
var sitePaddingBtm = percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.height)
var sectionHeight = stage.height
var isTopMenu = /top/.test(STATE.menuView.placement())
var isBottomMenu = /bottom/.test(STATE.menuView.placement())
var displaceTopBottomMenu = !LAYOUT_MODEL.isMenuScrollReveal && (isTopMenu || isBottomMenu)
var menuNetHeight = 0
if(isFillSiteSlideshow(mediaView.section)) {
sectionHeight = stage.height
} else if(length > 1 && position === 0) {
// first
if(displaceTopBottomMenu) {
if(isFixedMenu) {
if(isTopMenu) {
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight
} else {
menuNetHeight = sitePaddingBtm + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight - sitePaddingTop
}
} else {
if(isTopMenu) {
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight
} else {
sectionHeight = stage.height - sitePaddingTop
}
}
} else {
sectionHeight = stage.height - sitePaddingTop
}
} else if(position === length - 1) {
// last
if(displaceTopBottomMenu) {
if(isFixedMenu) {
if(isTopMenu) {
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight - sitePaddingBtm
} else {
menuNetHeight = sitePaddingBtm + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight
}
} else {
if(isTopMenu) {
sectionHeight = stage.height - sitePaddingBtm
} else {
menuNetHeight = sitePaddingBtm + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight
}
}
} else {
sectionHeight = stage.height - sitePaddingBtm
}
} else if(length === 1) {
// first and only
if(displaceTopBottomMenu) {
if(isFixedMenu) {
if(isTopMenu) {
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight - sitePaddingBtm
} else {
menuNetHeight = sitePaddingBtm + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight - sitePaddingTop
}
} else {
if(isTopMenu) {
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight - sitePaddingBtm
} else {
menuNetHeight = sitePaddingBtm + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight - sitePaddingTop
}
}
} else {
sectionHeight = stage.height - sitePaddingTop - sitePaddingBtm
}
} else {
// middles
if(displaceTopBottomMenu) {
if(isFixedMenu) {
if(isTopMenu) {
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight
} else {
menuNetHeight = sitePaddingBtm + menuSize - marginOverlap
sectionHeight = stage.height - menuNetHeight
}
} else {
sectionHeight = stage.height
}
} else {
sectionHeight = stage.height
}
}
return sectionHeight
},
navbarView:{
x:function(_navbarWidth) {
var offsetX = percentToPixels(LAYOUT_MODEL.navbarOffsetX, stage.width)
if(USER_AGENT === MOBILE) {
// stage width * 2 is to allow for the menu width and fixed position on mobile
var menuDisplaceMobile = LAYOUT_MODEL.menuDisplaceMobile === '' || LAYOUT_MODEL.menuDisplaceMobile === undefined || LAYOUT_MODEL.menuDisplaceMobile
var left = menuDisplaceMobile ? stage.width * 2 : stage.width
return left - _navbarWidth - 15
} else {
switch(LAYOUT_MODEL.navbarAlignHorizontal) {
case 'left':
return offsetX
case 'center':
if(USER_AGENT === TABLET) return ((stage.width - _navbarWidth) * 0.5)
return ((stage.width - _navbarWidth) * 0.5) + offsetX
case 'right':
return stage.width - _navbarWidth + offsetX
default:
return offsetX
}
// } else if(USER_AGENT === MOBILE && STATE.menuView.placement() === 'right') {
// return 10
}
},
y:function(_navbarHeight) {
_navbarHeight = _navbarHeight || layoutCalcs._navbarHeight
layoutCalcs._navbarHeight = _navbarHeight
var offsetY = percentToPixels(LAYOUT_MODEL.navbarOffsetY, stage.height)
if(USER_AGENT !== MOBILE) {
switch(LAYOUT_MODEL.navbarAlignVertical) {
case 'top':
return offsetY
case 'center':
return ((stage.height - _navbarHeight) * 0.5) + offsetY
case 'bottom':
var stageHeight = LAYOUT_MODEL.navbarPositionFixed ? window.innerHeight : STATE.siteView.height()
if(USER_AGENT === TABLET && layoutCalcs.isDisplace() && STATE.overrides.thumbnailSide === 'bottom' && LAYOUT_MODEL.navbarLayout === 'horizontal') {
return stage.height - 22
}
return stageHeight - _navbarHeight + offsetY
}
}
return 15
}
},
footerView:{
x:function(_footerWidth) {
_footerWidth = _footerWidth || layoutCalcs._footerWidth
layoutCalcs._footerWidth = _footerWidth
var offsetX = percentToPixels(LAYOUT_MODEL.copyrightOffsetX, stage.width)
if(USER_AGENT !== MOBILE) {
switch(LAYOUT_MODEL.copyrightAlignHorizontal) {
case 'left':
return offsetX
case 'center':
if(USER_AGENT === TABLET) return ((stage.width - _footerWidth) * 0.5) + offsetX
return ((stage.width - _footerWidth) * 0.5) + offsetX
case 'right':
if(USER_AGENT === TABLET) return stage.width - _footerWidth + offsetX
return stage.width - _footerWidth + offsetX
}
} else if(USER_AGENT === MOBILE) {
return layoutCalcs.mobileFooterPadding
}
return 0
},
y:function(_footerHeight) {
_footerHeight = _footerHeight || layoutCalcs._footerHeight
layoutCalcs._footerHeight = _footerHeight
var offsetY = percentToPixels(LAYOUT_MODEL.copyrightOffsetY, stage.height)
if(USER_AGENT !== MOBILE) {
switch(LAYOUT_MODEL.copyrightAlignVertical) {
case 'top':
return offsetY
case 'center':
return ((stage.height - _footerHeight) * 0.5) + offsetY
case 'bottom':
var stageHeight = LAYOUT_MODEL.copyrightPositionFixed ? window.innerHeight : STATE.siteView.height()
if(USER_AGENT === TABLET && layoutCalcs.isDisplace() && STATE.overrides.thumbnailSide === 'bottom') {
return stage.height - 22
}
return stageHeight - _footerHeight + offsetY
}
} else if(USER_AGENT === MOBILE) {
return stage.height - _footerHeight - layoutCalcs.mobileFooterPadding
}
return 0
}
},
logoView:{
x:function(_logoWidth) {
_logoWidth = _logoWidth || layoutCalcs._logoWidth
layoutCalcs._logoWidth = _logoWidth
var offsetX = 0
var halign = 'left'
if(USER_AGENT === MOBILE) {
offsetX = percentToPixels(LAYOUT_MODEL.mobileLogoOffsetX, stage.width)
halign = LAYOUT_MODEL.mobileLogoAlignHorizontal || 'left'
} else if(USER_AGENT === TABLET) {
var menuDisplaceTablet = LAYOUT_MODEL.menuDisplaceTablet === '' || LAYOUT_MODEL.menuDisplaceTablet === undefined || LAYOUT_MODEL.menuDisplaceTablet
if(menuDisplaceTablet) {
offsetX = percentToPixels(firstValid(LAYOUT_MODEL.tabletLogoOffsetX, LAYOUT_MODEL.logoOffsetX), stage.width) - layoutCalcs.menuView.width()
} else {
offsetX = percentToPixels(firstValid(LAYOUT_MODEL.tabletLogoOffsetX, LAYOUT_MODEL.logoOffsetX), stage.width)
}
halign = LAYOUT_MODEL.tabletLogoAlignHorizontal || LAYOUT_MODEL.logoAlignHorizontal
} else if(isPod()) {
offsetX = percentToPixels(firstValid(LAYOUT_MODEL.mobileLogoOffsetX, LAYOUT_MODEL.logoOffsetX, 0), stage.width)
halign = firstValid(LAYOUT_MODEL.mobileLogoAlignHorizontal, LAYOUT_MODEL.logoAlignHorizontal, 'left')
} else if(isPad()) {
offsetX = percentToPixels(firstValid(LAYOUT_MODEL.tabletLogoOffsetX, LAYOUT_MODEL.logoOffsetX, 0), stage.width)
halign = firstValid(LAYOUT_MODEL.tabletLogoAlignHorizontal, LAYOUT_MODEL.logoAlignHorizontal, 'left')
} else {
offsetX = percentToPixels(LAYOUT_MODEL.logoOffsetX, stage.width)
halign = LAYOUT_MODEL.logoAlignHorizontal
}
switch(halign) {
case 'left':
return offsetX || 0
case 'center':
return ((stage.width - _logoWidth) * 0.5) + offsetX
case 'right':
return stage.width - _logoWidth - offsetX
}
return 0
},
y:function(_logoHeight) {
_logoHeight = _logoHeight || layoutCalcs._logoHeight
layoutCalcs._logoHeight = _logoHeight
var offsetY = 0
if(USER_AGENT === MOBILE) {
return percentToPixels(LAYOUT_MODEL.mobileLogoOffsetY || 0, stage.height)
} else if(USER_AGENT === TABLET) {
offsetY = percentToPixels(firstValid(LAYOUT_MODEL.tabletLogoOffsetY, LAYOUT_MODEL.logoOffsetY), stage.height)
switch(LAYOUT_MODEL.tabletLogoAlignVertical || LAYOUT_MODEL.logoAlignVertical) {
case 'top':
return offsetY
case 'center':
return ((stage.height - _logoHeight) * 0.5) + offsetY
case 'bottom':
return stage.height - _logoHeight - offsetY
}
} else {
offsetY = isPod() ? percentToPixels(firstValid(LAYOUT_MODEL.mobileLogoOffsetY, LAYOUT_MODEL.logoOffsetY, 0), stage.height) :
isPad() ? percentToPixels(firstValid(LAYOUT_MODEL.tabletLogoOffsetY, LAYOUT_MODEL.logoOffsetY, 0), stage.height) :
percentToPixels(LAYOUT_MODEL.logoOffsetY, stage.height)
var valign = isPod() ? firstValid(LAYOUT_MODEL.mobileLogoAlignVertical, LAYOUT_MODEL.logoAlignVertical, 'top') :
isPad() ? firstValid(LAYOUT_MODEL.tabletLogoAlignVertical, LAYOUT_MODEL.logoAlignVertical, 'top') :
LAYOUT_MODEL.logoAlignVertical
switch(valign) {
case 'top':
return offsetY
case 'center':
return ((stage.height - _logoHeight) * 0.5) + offsetY
case 'bottom':
var stageHeight = LAYOUT_MODEL.logoPositionFixed ? window.innerHeight : STATE.siteView.height()
return stageHeight - _logoHeight - offsetY
}
}
return 0
}
},
menuBullet:{
updateSize: function(isSub) {
var fontData = getFontData(LAYOUT_MODEL.menuFont)
var testBuild = document.createElement('div')
var fontSize = isSub ? LAYOUT_MODEL.menuSubFontSize : LAYOUT_MODEL.menuFontSize
testBuild.innerHTML = menuBullet[LAYOUT_MODEL.menuBulletType]
testBuild.setAttribute('style', 'margin:0; padding:0; position:absolute; display:block; white-space:nowrap; opacity:0; font-family:' + fontData.family + '; font-weight:' + fontData.weight + '; font-size:' + fontSize + 'px')
document.body.appendChild(testBuild)
layoutCalcs.menuBullet.width = parseInt(window.getComputedStyle(testBuild, null).width, 10)
layoutCalcs.menuBullet.height = parseInt(window.getComputedStyle(testBuild, null).height, 10)
document.body.removeChild(testBuild)
testBuild = null
}
},
menuText:{
x:function(_menuTextWidth) {
_menuTextWidth = _menuTextWidth || layoutCalcs._menuTextWidth
layoutCalcs._menuTextWidth = _menuTextWidth
var hPadding = percentToPixels(STATE.menuView.menuTextPaddingHorizontal(), stage.width)
var justification = STATE.menuView.menuTextAlignHorizontal()
if(USER_AGENT === MOBILE) {
return 0
} else if(USER_AGENT === TABLET) {
hPadding = firstValid(percentToPixels(LAYOUT_MODEL.menuTextPaddingHorizontalTablet, stage.width), 10)
justification = LAYOUT_MODEL.menuTextAlignHorizontalTablet || STATE.menuView.menuTextAlignHorizontal()
if(/top|bottom/.test(STATE.menuView.placement())) {
justification = LAYOUT_MODEL.menuTextAlignHorizontalTablet || 'left'
}
}
switch(justification) {
case 'left':
return hPadding
case 'center':
return ((layoutCalcs.menuView.width() - _menuTextWidth) * 0.5)
case 'right':
return layoutCalcs.menuView.width() - _menuTextWidth - hPadding
}
},
y:function(_menuTextHeight) {
if(USER_AGENT === MOBILE) {
return layoutCalcs.logoView.y() + layoutCalcs._logoHeight + percentToPixels(firstValid(LAYOUT_MODEL.menuTextPaddingVerticalMobile, 10), stage.height)
} else {
var vTextPos = USER_AGENT === TABLET ? LAYOUT_MODEL.menuTextAlignVerticalTablet || STATE.menuView.menuTextAlignVertical() : STATE.menuView.menuTextAlignVertical()
var vPad = USER_AGENT === TABLET ? percentToPixels(firstValid(LAYOUT_MODEL.menuTextPaddingVerticalTablet, STATE.menuView.menuTextPaddingVertical()), stage.height) : percentToPixels(STATE.menuView.menuTextPaddingVertical(), stage.height)
switch(vTextPos) {
case 'top':
return vPad
case 'center':
if(_menuTextHeight > layoutCalcs.menuView.height()) {
return 0
}
return ((layoutCalcs.menuView.height() - _menuTextHeight) * 0.5) + vPad
case 'bottom':
return layoutCalcs.menuView.height() - _menuTextHeight - vPad
}
return 0
}
}
},
menuView:{
x:function() {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET || STATE.menuView.placement() === 'overlay') {
return 0
}
if(/top|bottom/.test(STATE.menuView.placement())) {
return percentToPixels(LAYOUT_MODEL.sitePaddingLeft, stage.width) + percentToPixels(LAYOUT_MODEL.menuOffsetY, stage.width)
} else if(STATE.menuView.placement() === 'right') {
// right aligned menu
return percentToPixels(LAYOUT_MODEL.sitePaddingRight, stage.width) - (getMarginOverlap() || 0)
}
// left aligned menu
return percentToPixels(LAYOUT_MODEL.sitePaddingLeft, stage.height) - (getMarginOverlap() || 0)
},
y:function() {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET || STATE.menuView.placement() === 'overlay') {
return 0
}
if(/left|right/.test(STATE.menuView.placement())) {
return percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height) + percentToPixels(LAYOUT_MODEL.menuOffsetY, stage.height)
} else if(STATE.menuView.placement() === 'bottom') {
// bottom aligned menu
return percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.width) - (getMarginOverlap() || 0)
}
// top aligned menu
return percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.width) - (getMarginOverlap() || 0)
},
width:function() {
if(USER_AGENT === MOBILE || STATE.menuView.placement() === 'overlay') {
return stage.width
}
var defaultWidth = !layoutCalcs._menuTextWidth || layoutCalcs._menuTextWidth < 150 ? 150 : layoutCalcs._menuTextWidth
if(USER_AGENT === TABLET && percentToPixels(LAYOUT_MODEL.menuWidthMobile, stage.width)) {
return percentToPixels(LAYOUT_MODEL.menuWidthMobile, stage.width) ? percentToPixels(LAYOUT_MODEL.menuWidthMobile, stage.width) : defaultWidth
} else if(USER_AGENT === TABLET && /top|bottom/.test(STATE.menuView.placement())) {
return firstValid(LAYOUT_MODEL.menuWidthMobile, defaultWidth)
}
if(/left|right/.test(STATE.menuView.placement())) {
return percentToPixels(LAYOUT_MODEL.menuWidth, stage.width)
}
return (stage.width - (percentToPixels(LAYOUT_MODEL.sitePaddingLeft, stage.width) + percentToPixels(LAYOUT_MODEL.sitePaddingRight, stage.width)) - percentToPixels(LAYOUT_MODEL.menuOffsetY, stage.width))
},
height:function() {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET || STATE.menuView.placement() === 'overlay') {
return stage.height
}
if(/top|bottom/.test(STATE.menuView.placement())) {
return percentToPixels(LAYOUT_MODEL.menuWidth, stage.height)
}
// if(STATE.siteView.unifiedPageScroll()) {
// return (STATE.siteView.height() - (percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height) + percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.height)) - percentToPixels(LAYOUT_MODEL.menuOffsetY, stage.height))
// }
return (stage.height - (percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height) + percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.height)) - percentToPixels(LAYOUT_MODEL.menuOffsetY, stage.height))
}
},
mediaView:{
x:function() {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET || isInMediaOverlay()) {
return 0
}
// marginOverlap affects left|right menus for x axis
var marginOverlap = /left/.test(STATE.menuView.placement()) ? (-getMarginOverlap() || 0) : 0
if(STATE.menuView.placement() === 'left') {
return percentToPixels(LAYOUT_MODEL.sitePaddingLeft, stage.width) + percentToPixels(LAYOUT_MODEL.menuWidth, stage.width) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.width) + marginOverlap
}
return percentToPixels(LAYOUT_MODEL.sitePaddingLeft, stage.width) + marginOverlap
},
y:function(key) {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET || isInMediaOverlay()) {
return 0
}
// marginOverlap affects top|bottom menus for y axis
var marginOverlap = /top/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal ? (-getMarginOverlap() || 0) : 0
if(STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' && layoutCalcs.sectionDisplayMode === 'multiple') {
if(!LAYOUT_MODEL.isMenuScrollReveal && STATE.menuView.menuPositionFixed() && /top/.test(STATE.menuView.placement())) {
return percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height) + marginOverlap
} else {
return 0
}
} else if(/top/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal) {
return percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height) + percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height) + marginOverlap
}
return percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height) + marginOverlap
},
width:function(thumbHMargin) {
var margin = thumbHMargin || 0
if(USER_AGENT === MOBILE || USER_AGENT === TABLET || isInMediaOverlay()) {
return stage.width
} else if(/left|right/.test(STATE.menuView.placement())) {
// marginOverlap affects left|right menus for width
var marginOverlap = (getMarginOverlap() || 0)
return (stage.width - (percentToPixels(LAYOUT_MODEL.sitePaddingLeft, stage.width) + percentToPixels(LAYOUT_MODEL.sitePaddingRight, stage.width) + percentToPixels(LAYOUT_MODEL.menuWidth, stage.width) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.width) + margin)) + marginOverlap
}
return (stage.width - (percentToPixels(LAYOUT_MODEL.sitePaddingLeft, stage.width) + percentToPixels(LAYOUT_MODEL.sitePaddingRight, stage.width)))
},
height:function(key, isZone) {
var sectionState = layoutCalcs.getSectionState(key)
var stageHeight = STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' || ((STATE.siteView.unifiedPageScroll() || /unified/.test(LAYOUT_MODEL.siteDisplayBehavior)) && /overlay/.test(STATE.overrides.siteDisplayBehavior) && STATE.overrides.siteDisplayGalleryOnlyOverlay && /thumbs/.test(sectionState.mode)) ?
(isZone ? STATE.getSectionZoneHeight(key) : STATE.getSectionHeight(key)) :
stage.height
var isFullTextHeight = sectionState ? sectionState.isFullTextHeight : false
// marginOverlap affects top|bottom menus for height
var marginOverlap = /top|bottom/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal ? (getMarginOverlap() || 0) : 0
var height = 0
var menuSize = percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height)
var siteMarginSize = percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height) + percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.height)
if(!isZone && !/unifiedSiteScrollVertical/.test(STATE.overrides.siteDisplayBehavior) && STATE.siteView.unifiedPageScroll()) {
// kent added this to allow unified page scroll to get total gallery height
if(/vScroll/.test(STATE.overrides.transitionType)) {
if(/top|bottom/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal) {
stageHeight = STATE.getSectionHeight(key) + (menuSize + siteMarginSize) > stage.height ? STATE.getSectionHeight(key) : stage.height
} else {
stageHeight = STATE.getSectionHeight(key) > stage.height ? STATE.getSectionHeight(key) : stage.height
}
} else {
stageHeight = stage.height
}
}
if(USER_AGENT === TABLET && LAYOUT_MODEL.navbarAlignVertical === 'bottom' && layoutCalcs.isDisplace() && STATE.overrides.thumbnailSide === 'bottom') {
return stageHeight - 30
}
if(USER_AGENT === MOBILE || USER_AGENT === TABLET || STATE.overrides.siteDisplayBehavior === 'overlay') {
return stageHeight
}
if(STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' && layoutCalcs.sectionDisplayMode === 'multiple') {
if(!LAYOUT_MODEL.isMenuScrollReveal && STATE.menuView.menuPositionFixed() && /top|bottom/.test(STATE.menuView.placement()) && stageHeight >= (stage.height - menuSize) && !isFullTextHeight && !isZone) {
// console.log('1', key, isZone, stageHeight, stage.height, menuSize)
height = stageHeight - menuSize
} else {
// console.log('2', key, isZone, stageHeight >= (stage.height - menuSize))
height = stageHeight
}
} else if(STATE.siteView.unifiedPageScroll() && /vScroll/.test(STATE.overrides.transitionType)) {
if(stageHeight === stage.height && /top|bottom/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal) {
height = stageHeight - (menuSize + siteMarginSize)
} else {
height = stageHeight
}
} else if(/top|bottom/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal) {
height = stageHeight - (menuSize + siteMarginSize)
} else {
height = stageHeight - siteMarginSize
}
return height + marginOverlap
},
size:{
x: function() {
if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
return 0
} else {
return layoutCalcs.mediaView.x()
}
},
y: function(key) {
if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
return 0
} else {
return layoutCalcs.mediaView.y(key)
}
},
width: function() {
return layoutCalcs.mediaView.width()
},
height: function(key) {
return layoutCalcs.mediaView.height(key)
}
}
},
landingMediaView:{
x:function() {
return 0
},
y:function() {
return 0
},
width:function() {
return stage.width
},
height:function() {
return stage.height
}
},
mediaMask: {
x:function() {
if(layoutCalcs._mediaMarginPrefix === 'contact') {
return 0
}
return percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginLeft'], stage.width)
},
y:function(key) {
if(layoutCalcs._mediaMarginPrefix === 'contact') {
return 0
}
return percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginTop'], stage.height)
},
width:function(mediaItemWidth) {
if(layoutCalcs._mediaMarginPrefix === 'contact') {
return layoutCalcs.mediaView.width()
}
return (mediaItemWidth || layoutCalcs.mediaView.width()) - (percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginLeft'], stage.width) + percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginRight'], stage.width))
},
height:function(mediaItemHeight, key) {
if(layoutCalcs._mediaMarginPrefix === 'contact') {
return layoutCalcs.mediaView.height(key)
}
return (mediaItemHeight || layoutCalcs.mediaView.height(key)) - (percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginTop'], stage.height) + percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginBottom'], stage.height))
}
},
captionView:{
size: function(captionText, padding) {
layoutCalcs.captionView.currentText = captionText || layoutCalcs.captionView.currentText
var testBuild = document.createElement('span')
var fontData = getFontData(LAYOUT_MODEL.captionFont)
testBuild.innerHTML = layoutCalcs.captionView.currentText
var padStyle = 'padding:' + (padding || 0) + 'px'
testBuild.setAttribute('style', 'position:absolute; display:block; white-space:nowrap; opacity:1; font-family:' + fontData.family + '; font-weight:' + fontData.weight + '; font-size:' + LAYOUT_MODEL.captionFontSize + 'px;' + padStyle)
document.body.appendChild(testBuild)
var leftMargin = percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginLeft'], stage.height)
var rightMargin = percentToPixels(STATE.overrides[layoutCalcs._mediaMarginPrefix + 'MarginRight'], stage.height)
var width = STATE.mediaView.width() - (leftMargin + rightMargin) - (padding * 2)
if(testBuild.offsetWidth > width) {
layoutCalcs.captionView.width = width + (padding * 2)
testBuild.style.width = width + (padding * 2) + 'px'
testBuild.style.whiteSpace = 'normal'
layoutCalcs.captionView.height = testBuild.offsetHeight
} else {
layoutCalcs.captionView.width = testBuild.offsetWidth
layoutCalcs.captionView.height = testBuild.offsetHeight
}
document.body.removeChild(testBuild)
testBuild = null
}
},
isDisplace:function() {
return USER_AGENT !== MOBILE &&
layoutCalcs._section &&
layoutCalcs._thumbsVisible ?
layoutCalcs._section.thumb && STATE.overrides.thumbnailType === 'strip' && STATE.overrides.thumbnailDock === 'displace' :
false
}
}
function touchDeviceTransition() {
if(isPod() && LAYOUT_MODEL.transitionTypeMobile) {
return LAYOUT_MODEL.transitionTypeMobile
} else if(isPad() && LAYOUT_MODEL.transitionTypeTablet) {
return LAYOUT_MODEL.transitionTypeTablet
}
}
function updateCustomThumbSize(width, height) {
return {
custom: {width:width || 300, height:height || 200},
small: {width: 100, height: 66},
medium: {width: 200, height: 133},
large: {width: 300, height: 200},
xLarge: {width: 400, height: 266},
xxLarge: {width: 500, height: 333},
small_sq: {width: 100, height: 100},
medium_sq: {width: 200, height: 200},
large_sq: {width: 300, height: 300},
xLarge_sq: {width: 400, height: 400},
xxLarge_sq: {width: 500, height: 500},
small_v: {width: 66, height: 100},
medium_v: {width: 133, height: 200},
large_v: {width: 200, height: 300},
xLarge_v: {width: 266, height: 400},
xxLarge_v: {width: 333, height: 500}
}
}
var STATE = {
get lightboxHash() {
return localStorage.getItem('lightboxHash')
},
cacheLightboxSection: function() {
var lightboxSection = Object.keys(SECTIONS_MODEL)
.map(function(key) {
return SECTIONS_MODEL[key]
})
.filter(function(section) {
return section.isLightbox
})[0]
STATE.lightboxSection = lightboxSection
if(!lightboxSection) localStorage.removeItem('lightboxHash')
},
lightboxButtonsEnabled: function() {
// STATE.userEnabledLightbox is true when user has visited lightboxSection
return STATE.lightboxSection && ((STATE.lightboxSection.isUserEnableLightbox && (STATE.userEnabledLightbox || STATE.lightboxSection.media.length)) || !STATE.lightboxSection.isUserEnableLightbox)
},
setSectionHeight: function(key, height) {
layoutCalcs.updateSectionState(key, {height: height})
},
getSectionHeight: function(key) {
var state = layoutCalcs.getSectionState(key)
return key && state && (STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' || STATE.siteView.unifiedPageScroll()) ? state.height : stage.height
},
getSectionZoneHeight: function(key) {
var state = layoutCalcs.getSectionState(key)
return key && state && STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' ? state.zoneHeight : stage.height
},
overrides: {
logoZIndex: LAYOUT_MODEL.logoZIndex,
containerColor: LAYOUT_MODEL.containerColor,
transitionType: touchDeviceTransition() || LAYOUT_MODEL.transitionType,
transitionDuration: LAYOUT_MODEL.transitionDuration,
imageAlignHorizontal: LAYOUT_MODEL.imageAlignHorizontal,
imageAlignVertical: LAYOUT_MODEL.imageAlignVertical,
imageScaleType: LAYOUT_MODEL.imageScaleType,
videoScaleType: LAYOUT_MODEL.videoScaleType,
videoAutoPlay: LAYOUT_MODEL.videoAutoPlay,
mobileAutoPlay: LAYOUT_MODEL.mobileAutoPlay,
vimeoDefault: LAYOUT_MODEL.vimeoDefault,
videoLoop: LAYOUT_MODEL.videoLoop,
imageVideoMarginTop: LAYOUT_MODEL.imageVideoMarginTop,
imageVideoMarginRight: LAYOUT_MODEL.imageVideoMarginRight,
imageVideoMarginBottom: LAYOUT_MODEL.imageVideoMarginBottom,
imageVideoMarginLeft: LAYOUT_MODEL.imageVideoMarginLeft,
imageVideoInactiveAlpha: LAYOUT_MODEL.imageVideoInactiveAlpha,
// imageVideoBgColor: LAYOUT_MODEL.imageVideoBgColor,
// imageVideoBgAlpha: LAYOUT_MODEL.imageVideoBgAlpha,
imageVideoLoaderType: LAYOUT_MODEL.imageVideoLoaderType,
imageVideoScrollType: LAYOUT_MODEL.imageVideoScrollType,
imageVideoScrollbarRounded: LAYOUT_MODEL.imageVideoScrollbarRounded,
imageVideoScrollbarVisibility: LAYOUT_MODEL.imageVideoScrollbarVisibility,
imageVideoScrollbarAlignment: LAYOUT_MODEL.imageVideoScrollbarAlignment,
imageVideoScrollbarHorizontalOffset: LAYOUT_MODEL.imageVideoScrollbarHorizontalOffset,
imageVideoScrollbarVerticalOffset: LAYOUT_MODEL.imageVideoScrollbarVerticalOffset,
imageVideoScrollbarColor: LAYOUT_MODEL.imageVideoScrollbarColor,
imageVideoScrollbarHover: LAYOUT_MODEL.imageVideoScrollbarHover,
imageVideoScrollbarBgTransparency: LAYOUT_MODEL.imageVideoScrollbarBgTransparency,
imageVideoScrollbarWidth: LAYOUT_MODEL.imageVideoScrollbarWidth,
menuDisplaceMobile: LAYOUT_MODEL.menuDisplaceMobile === '' || LAYOUT_MODEL.menuDisplaceMobile === undefined || LAYOUT_MODEL.menuDisplaceMobile,
menuDisplaceTablet: LAYOUT_MODEL.menuDisplaceTablet === '' || LAYOUT_MODEL.menuDisplaceTablet === undefined || LAYOUT_MODEL.menuDisplaceTablet,
pageMarginTop: LAYOUT_MODEL.pageMarginTop,
pageMarginRight: LAYOUT_MODEL.pageMarginRight,
pageMarginBottom: LAYOUT_MODEL.pageMarginBottom,
pageMarginLeft: LAYOUT_MODEL.pageMarginLeft,
pageMaxWidth: LAYOUT_MODEL.pageMaxWidth,
pageMaxAlign: LAYOUT_MODEL.pageMaxAlign,
pageScrollVerticalMargin: LAYOUT_MODEL.pageScrollVerticalMargin,
pageTextFont: LAYOUT_MODEL.pageTextFont,
pageTextKerning: LAYOUT_MODEL.pageTextKerning,
pageTextFontSize: LAYOUT_MODEL.pageTextFontSize,
pageTextFontColor: LAYOUT_MODEL.pageTextFontColor,
pageTitle: LAYOUT_MODEL.pageTitle,
pageTitleFont: LAYOUT_MODEL.pageTitleFont,
pageTitleKerning: LAYOUT_MODEL.pageTitleKerning,
pageTitleFontSize: LAYOUT_MODEL.pageTitleFontSize,
pageTitleFontColor: LAYOUT_MODEL.pageTitleFontColor,
pageScrollType: LAYOUT_MODEL.pageScrollType,
pageScrollbarVisibility: LAYOUT_MODEL.pageScrollbarVisibility,
pageScrollbarRounded: LAYOUT_MODEL.pageScrollbarRounded,
pageScrollbarAlignment: LAYOUT_MODEL.pageScrollbarAlignment,
pageScrollbarHorizontalOffset: LAYOUT_MODEL.pageScrollbarHorizontalOffset,
pageScrollbarVerticalOffset: LAYOUT_MODEL.pageScrollbarVerticalOffset,
pageScrollbarColor: LAYOUT_MODEL.pageScrollbarColor,
pageScrollbarHover: LAYOUT_MODEL.pageScrollbarHover,
pageScrollbarBgAlpha: LAYOUT_MODEL.pageScrollbarBgAlpha,
pageScrollbarWidth: LAYOUT_MODEL.pageScrollbarWidth,
thumbnailOnly: LAYOUT_MODEL.thumbnailOnly,
thumbnailFullRes: LAYOUT_MODEL.thumbnailFullRes,
thumbnailDefaultOn: LAYOUT_MODEL.thumbnailDefaultOn,
thumbnailPositionFixed: LAYOUT_MODEL.thumbnailPositionFixed,
thumbnailMasonryType: LAYOUT_MODEL.thumbnailMasonryType,
// thumbnailMasonry and thumbnailMasonryEvenRowHeight are being replaced
// by thumbnailMasonryType
thumbnailMasonry: LAYOUT_MODEL.thumbnailMasonry,
thumbnailMasonryEvenRowHeight: LAYOUT_MODEL.thumbnailMasonryEvenRowHeight,
thumbnailMasonryFill: LAYOUT_MODEL.thumbnailMasonryFill,
thumbnailMasonryMaintainOrder: LAYOUT_MODEL.thumbnailMasonryMaintainOrder,
thumbnailMaxCols: LAYOUT_MODEL.thumbnailMaxCols,
thumbnailMinCols: LAYOUT_MODEL.thumbnailMinCols,
thumbnailMaxColsMobile: LAYOUT_MODEL.thumbnailMaxColsMobile,
thumbnailMinColsMobile: LAYOUT_MODEL.thumbnailMinColsMobile,
thumbnailGap: Number(LAYOUT_MODEL.thumbnailGap),
thumbnailGapVertical: Number(LAYOUT_MODEL.thumbnailGapVertical),
thumbnailDock: LAYOUT_MODEL.thumbnailDock,
thumbnailType: LAYOUT_MODEL.thumbnailType,
thumbnailSize: LAYOUT_MODEL.thumbnailSize,
thumbnailRandomize: LAYOUT_MODEL.thumbnailRandomize,
thumbnailRandomInterval: LAYOUT_MODEL.thumbnailRandomInterval,
thumbnailCustomWidth: LAYOUT_MODEL.thumbnailCustomWidth,
thumbnailCustomHeight: LAYOUT_MODEL.thumbnailCustomHeight,
thumbnailSide: LAYOUT_MODEL.thumbnailSide,
thumbnailHorizontalMargin: LAYOUT_MODEL.thumbnailHorizontalMargin,
thumbnailVerticalMargin: LAYOUT_MODEL.thumbnailVerticalMargin,
thumbnailAlignHorizontal: LAYOUT_MODEL.thumbnailAlignHorizontal,
thumbnailAlignVertical: LAYOUT_MODEL.thumbnailAlignVertical,
thumbnailCornerRadius: LAYOUT_MODEL.thumbnailCornerRadius,
thumbnailShadow: LAYOUT_MODEL.thumbnailShadow,
thumbnailOverlayColor: LAYOUT_MODEL.overlayColor,
thumbnailOverlayAlpha: LAYOUT_MODEL.overlayAlpha,
thumbnailGridColor: LAYOUT_MODEL.thumbnailGridColor,
thumbnailGridTransparency: LAYOUT_MODEL.thumbnailGridTransparency,
thumbnailHoverAlpha: LAYOUT_MODEL.thumbnailHoverAlpha,
thumbnailHoverAlphaMobile: LAYOUT_MODEL.thumbnailHoverAlphaMobile,
thumbnailHoverAlphaTablet: LAYOUT_MODEL.thumbnailHoverAlphaTablet,
thumbnailHoverColor: LAYOUT_MODEL.thumbnailHoverColor,
thumbnailLoaderType: LAYOUT_MODEL.thumbnailLoaderType,
thumbnailTitleFont: LAYOUT_MODEL.thumbnailTitleFont,
thumbnailTitleFontSize: LAYOUT_MODEL.thumbnailTitleFontSize,
thumbnailTitleFontColor: LAYOUT_MODEL.thumbnailTitleFontColor,
thumbnailLabelVerticalOffset: LAYOUT_MODEL.thumbnailLabelVerticalOffset,
thumbnailLabelColorMobile: LAYOUT_MODEL.thumbnailLabelColorMobile,
thumbnailLabelColorTablet: LAYOUT_MODEL.thumbnailLabelColorTablet,
thumbnailLabelPosition: LAYOUT_MODEL.thumbnailLabelPosition,
thumbnailLabelJustification: LAYOUT_MODEL.thumbnailLabelJustification,
thumbnailLabelPositionMobile: LAYOUT_MODEL.thumbnailLabelPositionMobile,
thumbnailLabelPositionTablet: LAYOUT_MODEL.thumbnailLabelPositionTablet,
thumbnailStdLabelPosition: LAYOUT_MODEL.thumbnailStdLabelPosition,
thumbnailStdLabelPositionMobile: LAYOUT_MODEL.thumbnailStdLabelPositionMobile,
thumbnailStdLabelPositionTablet: LAYOUT_MODEL.thumbnailStdLabelPositionTablet,
thumbnailVideoPlayIcon: LAYOUT_MODEL.thumbnailVideoPlayIcon !== false,
thumbnailScrollbarAlignment: LAYOUT_MODEL.thumbnailScrollbarAlignment,
thumbnailScrollbarColor: LAYOUT_MODEL.thumbnailScrollbarColor,
thumbnailScrollbarHover: LAYOUT_MODEL.thumbnailScrollbarHover,
thumbnailSelectedColor: LAYOUT_MODEL.thumbnailSelectedColor,
thumbnailSelectedAlpha: LAYOUT_MODEL.thumbnailSelectedAlpha,
thumbnailScrollbarHorizontalOffset: LAYOUT_MODEL.thumbnailScrollbarHorizontalOffset,
thumbnailScrollbarVerticalOffset: LAYOUT_MODEL.thumbnailScrollbarVerticalOffset,
thumbnailScrollType: LAYOUT_MODEL.thumbnailScrollType,
thumbnailScrollbarBgAlpha: LAYOUT_MODEL.thumbnailScrollbarBgAlpha,
thumbnailScrollbarWidth: LAYOUT_MODEL.thumbnailScrollbarWidth,
thumbnailScrollbarVisibility: LAYOUT_MODEL.thumbnailScrollbarVisibility,
thumbnailScrollbarRounded: LAYOUT_MODEL.thumbnailScrollbarRounded,
captionAutoPosition: LAYOUT_MODEL.captionAutoPosition,
captionDefault: LAYOUT_MODEL.captionDefault,
captionUseTitle: LAYOUT_MODEL.captionUseTitle,
captionCloseButton: LAYOUT_MODEL.captionCloseButton,
captionBackgroundAlpha: LAYOUT_MODEL.captionBackgroundAlpha,
captionBackgroundRectColor: LAYOUT_MODEL.captionBackgroundRectColor,
captionFont: LAYOUT_MODEL.captionFont,
captionFontColor: LAYOUT_MODEL.captionFontColor,
captionFontSize: LAYOUT_MODEL.captionFontSize,
captionFontSizeBreakpoint: LAYOUT_MODEL.captionFontSizeBreakpoint,
captionWidth: LAYOUT_MODEL.captionWidth,
captionHeight: LAYOUT_MODEL.captionHeight,
captionAlignHorizontal: LAYOUT_MODEL.captionAlignHorizontal,
captionAlignVertical: LAYOUT_MODEL.captionAlignVertical,
captionOffsetX: LAYOUT_MODEL.captionOffsetX,
captionOffsetY: LAYOUT_MODEL.captionOffsetY,
captionTextAlign: LAYOUT_MODEL.captionTextAlign,
captionTextAlignVertical: LAYOUT_MODEL.captionTextAlignVertical,
captionPaddingTop: LAYOUT_MODEL.captionPaddingTop,
captionPaddingRight: LAYOUT_MODEL.captionPaddingRight,
captionPaddingBottom: LAYOUT_MODEL.captionPaddingBottom,
captionPaddingLeft: LAYOUT_MODEL.captionPaddingLeft,
captionScrollType: LAYOUT_MODEL.captionScrollType,
captionScrollbarWidth: LAYOUT_MODEL.captionScrollbarWidth,
captionScrollbarAlignment: LAYOUT_MODEL.captionScrollbarAlignment,
captionScrollbarColor: LAYOUT_MODEL.captionScrollbarColor,
captionScrollbarHover: LAYOUT_MODEL.captionScrollbarHover,
captionScrollbarHorizontalOffset: LAYOUT_MODEL.captionScrollbarHorizontalOffset,
captionScrollbarVerticalOffset: LAYOUT_MODEL.captionScrollbarVerticalOffset,
captionScrollbarBgAlpha: LAYOUT_MODEL.captionScrollbarBgAlpha,
captionAnchorTo: LAYOUT_MODEL.captionAnchorTo,
slideshowRandomize: LAYOUT_MODEL.landingMediaRandomize,
slideshowTransitionType: LAYOUT_MODEL.landingMediaTransitionType,
slideshowSpeed: LAYOUT_MODEL.landingMediaSpeed,
slideshowTransitionDuration: LAYOUT_MODEL.landingMediaTransitionDuration,
slideshowAlignHorizontal: LAYOUT_MODEL.landingMediaAlignHorizontal,
slideshowAlignVertical: LAYOUT_MODEL.landingMediaAlignVertical,
slideshowScaleType: LAYOUT_MODEL.landingMediaScaleType,
slideshowScrollDownIcon: LAYOUT_MODEL.slideshowScrollDownIcon,
siteDisplayBehavior: LAYOUT_MODEL.siteDisplayBehavior,
siteDisplayGalleryOnlyOverlay: LAYOUT_MODEL.siteDisplayGalleryOnlyOverlay
},
section: function(section) {
if(!section) return false
var sectionOverrides = section.overrides || {}
var thumbnail = section.thumb || {}
layoutCalcs.isLandingMedia = isSlideshowGallery(section)
layoutCalcs._section = section
STATE.overrides = {
get containerColor() {
return firstValid(sectionOverrides.containerColor, LAYOUT_MODEL.containerColor)
},
get transitionType() {
if(layoutCalcs.isLandingMedia) return firstValid(sectionOverrides.transitionType, LAYOUT_MODEL.landingMediaTransitionType)
var transitionType = firstValid(touchDeviceTransition(), sectionOverrides.transitionType, LAYOUT_MODEL.transitionType)
if((isPod() || isPad()) && !/vScroll/.test(transitionType)) transitionType = 'mSlide'
if(TOUCH_DEVICE && transitionType === 'hSlide') transitionType = 'mSlide'
// force vScroll for single text pages #1297
if(isSingleTextPage(section)) {
transitionType = 'vScrollStatic'
}
return transitionType
},
get transitionDuration() {
return firstValid(sectionOverrides.transitionDuration, LAYOUT_MODEL.transitionDuration)
},
get imageAlignHorizontal() {
return firstValid(sectionOverrides.imageAlignHorizontal, LAYOUT_MODEL.imageAlignHorizontal)
},
get imageAlignVertical() { return firstValid(sectionOverrides.imageAlignVertical, LAYOUT_MODEL.imageAlignVertical) },
get imageScaleType() { return firstValid(sectionOverrides.imageScaleType, LAYOUT_MODEL.imageScaleType) },
get videoScaleType() { return firstValid(sectionOverrides.videoScaleType, LAYOUT_MODEL.videoScaleType) },
get mobileAutoPlay() {
// if(BROWSER_NAME === 'Mobile Safari') return false
// this is being used for 1-Click Play behavior now
return LAYOUT_MODEL.mobileAutoPlay
},
get videoAutoPlay() {
if(layoutCalcs.isLandingMedia) {
return true
} else {
// if(isPod()) return false
// if(isPad()) return false
return firstValid(sectionOverrides.videoAutoPlay, LAYOUT_MODEL.videoAutoPlay)
}
},
get vimeoDefault() {
// if(BROWSER_NAME === 'Mobile Safari') return false
var vimeoDefault = LAYOUT_MODEL.vimeoDefault === '' || LAYOUT_MODEL.vimeoDefault === undefined || LAYOUT_MODEL.vimeoDefault
var vimeoDefaultMobile = /*LAYOUT_MODEL.vimeoDefaultMobile === '' || LAYOUT_MODEL.vimeoDefaultMobile === undefined ||*/ LAYOUT_MODEL.vimeoDefaultMobile
var vimeoDefaultTablet = /*LAYOUT_MODEL.vimeoDefaultTablet === '' || LAYOUT_MODEL.vimeoDefaultTablet === undefined ||*/ LAYOUT_MODEL.vimeoDefaultTablet
if(isPod()) {
return firstValid(vimeoDefaultMobile, vimeoDefault)
} else if(isPad()) {
return firstValid(vimeoDefaultTablet, vimeoDefault)
}
return vimeoDefault
},
get videoLoop() { return firstValid(sectionOverrides.videoLoop, LAYOUT_MODEL.videoLoop) },
get imageVideoMarginTop() {
if(USER_AGENT === MOBILE && !/vScroll/.test(STATE.overrides.transitionType)) return 0
return firstValid(sectionOverrides.imageVideoMarginTop, LAYOUT_MODEL.imageVideoMarginTop)
},
get imageVideoMarginRight() {
if(USER_AGENT === MOBILE) return 0
return firstValid(sectionOverrides.imageVideoMarginRight, LAYOUT_MODEL.imageVideoMarginRight)
},
get imageVideoMarginBottom() {
if(USER_AGENT === MOBILE && !/vScroll/.test(STATE.overrides.transitionType)) return 0
return firstValid(sectionOverrides.imageVideoMarginBottom, LAYOUT_MODEL.imageVideoMarginBottom)
},
get imageVideoMarginLeft() {
if(USER_AGENT === MOBILE) return 0
return firstValid(sectionOverrides.imageVideoMarginLeft, LAYOUT_MODEL.imageVideoMarginLeft)
},
get pageMarginTop() {
var pageMarginTop = firstValid(sectionOverrides.pageMarginTop, LAYOUT_MODEL.pageMarginTop)
if(USER_AGENT === MOBILE) return firstValid(LAYOUT_MODEL.pageMarginTopMobile, 50)
if(isPod()) return firstValid(LAYOUT_MODEL.pageMarginTopMobile, pageMarginTop)
return pageMarginTop
},
get pageMarginRight() {
var pageMarginRight = firstValid(sectionOverrides.pageMarginRight, LAYOUT_MODEL.pageMarginRight)
if(USER_AGENT === MOBILE) return firstValid(LAYOUT_MODEL.pageMarginRightMobile, 0)
if(isPod()) return firstValid(LAYOUT_MODEL.pageMarginRightMobile, pageMarginRight)
return pageMarginRight
},
get pageMarginBottom() {
var pageMarginBottom = firstValid(sectionOverrides.pageMarginBottom, LAYOUT_MODEL.pageMarginBottom)
if(USER_AGENT === MOBILE) return firstValid(LAYOUT_MODEL.pageMarginBottomMobile, 0)
if(isPod()) return firstValid(LAYOUT_MODEL.pageMarginBottomMobile, pageMarginBottom)
return pageMarginBottom
},
get pageMarginLeft() {
var pageMarginLeft = firstValid(sectionOverrides.pageMarginLeft, LAYOUT_MODEL.pageMarginLeft)
if(USER_AGENT === MOBILE) return firstValid(LAYOUT_MODEL.pageMarginLeftMobile, 0)
if(isPod()) return firstValid(LAYOUT_MODEL.pageMarginLeftMobile, pageMarginLeft)
return pageMarginLeft
},
get pageMaxWidth() { return percentToPixels(firstValid(sectionOverrides.pageMaxWidth, LAYOUT_MODEL.pageMaxWidth), stage.width) },
get pageMaxAlign() { return firstValid(sectionOverrides.pageMaxAlign, LAYOUT_MODEL.pageMaxAlign) },
get pageScrollVerticalMargin() { return firstValid(sectionOverrides.pageScrollVerticalMargin, LAYOUT_MODEL.pageScrollVerticalMargin) },
get pageTextFont() { return firstValid(sectionOverrides.pageTextFont, LAYOUT_MODEL.pageTextFont) },
get pageTextKerning() { return firstValid(sectionOverrides.pageTextKerning, LAYOUT_MODEL.pageTextKerning) },
get pageTextFontSize() { return sectionOverrides.pageTextFontSize || LAYOUT_MODEL.pageTextFontSize },
get pageTextFontColor() { return firstValid(sectionOverrides.pageTextFontColor, LAYOUT_MODEL.pageTextFontColor) },
get pageTitle() { return firstValid(sectionOverrides.pageTitle, LAYOUT_MODEL.pageTitle) },
get pageTitleFont() { return firstValid(sectionOverrides.pageTitleFont, LAYOUT_MODEL.pageTitleFont) },
get pageTitleKerning() { return firstValid(sectionOverrides.pageTitleKerning, LAYOUT_MODEL.pageTitleKerning) },
get pageTitleFontSize() { return sectionOverrides.pageTitleFontSize || LAYOUT_MODEL.pageTitleFontSize },
get pageTitleFontColor() { return firstValid(sectionOverrides.pageTitleFontColor, LAYOUT_MODEL.pageTitleFontColor) },
get pageScrollType() { return firstValid(sectionOverrides.pageScrollType, LAYOUT_MODEL.pageScrollType) },
get pageScrollbarVisibility() { return firstValid(sectionOverrides.pageScrollbarVisibility, LAYOUT_MODEL.pageScrollbarVisibility) },
get pageScrollbarRounded() { return firstValid(sectionOverrides.pageScrollbarRounded, LAYOUT_MODEL.pageScrollbarRounded) },
get pageScrollbarAlignment() { return firstValid(sectionOverrides.pageScrollbarAlignment, LAYOUT_MODEL.pageScrollbarAlignment) },
get pageScrollbarHorizontalOffset() { return firstValid(sectionOverrides.pageScrollbarHorizontalOffset, LAYOUT_MODEL.pageScrollbarHorizontalOffset) },
get pageScrollbarVerticalOffset() { return firstValid(sectionOverrides.pageScrollbarVerticalOffset, LAYOUT_MODEL.pageScrollbarVerticalOffset) },
get pageScrollbarColor() { return firstValid(sectionOverrides.pageScrollbarColor, LAYOUT_MODEL.pageScrollbarColor) },
get pageScrollbarHover() { return firstValid(sectionOverrides.pageScrollbarHover, LAYOUT_MODEL.pageScrollbarHover) },
get pageScrollbarBgAlpha() { return firstValid(sectionOverrides.pageScrollbarBgAlpha, LAYOUT_MODEL.pageScrollbarBgAlpha) },
get pageScrollbarWidth() { return firstValid(sectionOverrides.pageScrollbarWidth, LAYOUT_MODEL.pageScrollbarWidth) },
get imageVideoScrollType() {
var scrollType = sectionOverrides.imageVideoScrollType === '' ? 'scrollbar' : sectionOverrides.imageVideoScrollType
return firstValid(scrollType, LAYOUT_MODEL.imageVideoScrollType)
},
get imageVideoScrollbarRounded() { return firstValid(sectionOverrides.imageVideoScrollbarRounded, LAYOUT_MODEL.imageVideoScrollbarRounded) },
get imageVideoScrollbarVisibility() { return firstValid(sectionOverrides.imageVideoScrollbarVisibility, LAYOUT_MODEL.imageVideoScrollbarVisibility) },
get imageVideoInactiveAlpha() { return firstValid(sectionOverrides.imageVideoInactiveAlpha, LAYOUT_MODEL.imageVideoInactiveAlpha) },
// get imageVideoBgColor() { return firstValid(sectionOverrides.imageVideoBgColor, LAYOUT_MODEL.imageVideoBgColor) },
// get imageVideoBgAlpha() { return firstValid(sectionOverrides.imageVideoBgAlpha, LAYOUT_MODEL.imageVideoBgAlpha) },
get imageVideoLoaderType() { return firstValid(sectionOverrides.imageVideoLoaderType, LAYOUT_MODEL.imageVideoLoaderType) },
get imageVideoScrollbarAlignment() { return firstValid(sectionOverrides.imageVideoScrollbarAlignment, LAYOUT_MODEL.imageVideoScrollbarAlignment) },
get imageVideoScrollbarHorizontalOffset() { return firstValid(sectionOverrides.imageVideoScrollbarHorizontalOffset, LAYOUT_MODEL.imageVideoScrollbarHorizontalOffset) },
get imageVideoScrollbarVerticalOffset() { return firstValid(sectionOverrides.imageVideoScrollbarVerticalOffset, LAYOUT_MODEL.imageVideoScrollbarVerticalOffset) },
get imageVideoScrollbarColor() { return firstValid(sectionOverrides.imageVideoScrollbarColor, LAYOUT_MODEL.imageVideoScrollbarColor) },
get imageVideoScrollbarHover() { return firstValid(sectionOverrides.imageVideoScrollbarHover, LAYOUT_MODEL.imageVideoScrollbarHover) },
get imageVideoScrollbarBgTransparency() { return firstValid(sectionOverrides.imageVideoScrollbarBgTransparency, LAYOUT_MODEL.imageVideoScrollbarBgTransparency) },
get imageVideoScrollbarWidth() { return firstValid(sectionOverrides.imageVideoScrollbarWidth, LAYOUT_MODEL.imageVideoScrollbarWidth) },
get menuDisplaceMobile() { return LAYOUT_MODEL.menuDisplaceMobile === '' || LAYOUT_MODEL.menuDisplaceMobile === undefined || LAYOUT_MODEL.menuDisplaceMobile },
get menuDisplaceTablet() { return LAYOUT_MODEL.menuDisplaceTablet === '' || LAYOUT_MODEL.menuDisplaceTablet === undefined || LAYOUT_MODEL.menuDisplaceTablet },
get overlayTitleFont() { return firstValid(LAYOUT_MODEL.overlayTitleFont, LAYOUT_MODEL.thumbnailTitleFont) },
get overlayTitleFontSize() { return LAYOUT_MODEL.overlayTitleFontSize || LAYOUT_MODEL.thumbnailTitleFontSize },
get overlayTitleFontColor() { return firstValid(LAYOUT_MODEL.overlayTitleFontColor, LAYOUT_MODEL.thumbnailTitleFontColor) },
get thumbnailOnly() {
// if(isIndexSection(section)) {
// return false
// } else {
return firstValid(thumbnail.only, LAYOUT_MODEL.thumbnailOnly)
// }
},
get thumbnailFullRes() {
return firstValid(thumbnail.fullRes, LAYOUT_MODEL.thumbnailFullRes)
},
get thumbnailDefaultOn() {
if(USER_AGENT === MOBILE) {
return thumbnail.only || LAYOUT_MODEL.thumbnailOnly || firstValid(LAYOUT_MODEL.thumbnailDefaultOnMobile, thumbnail.defaultOn, LAYOUT_MODEL.thumbnailDefaultOn)
} else {
return thumbnail.only || LAYOUT_MODEL.thumbnailOnly || firstValid(thumbnail.defaultOn, LAYOUT_MODEL.thumbnailDefaultOn)
}
},
get thumbnailPositionFixed() {
if(USER_AGENT === MOBILE) {
return false
} else {
return firstValid(thumbnail.positionFixed, LAYOUT_MODEL.thumbnailPositionFixed)
}
},
// thumbnailMasonry and thumbnailMasonryEvenRowHeight are being replaced
// by thumbnailMasonryType
get thumbnailMasonry() {
if(USER_AGENT === MOBILE) {
return true
} else {
var masonryType = firstValid(thumbnail.type, LAYOUT_MODEL.thumbnailType)
switch(masonryType) {
case 'vMasonry':
return true
case 'hMasonry':
return true
default:
return false
}
}
},
get thumbnailMasonryType() {
return firstValid(thumbnail.masonryType, LAYOUT_MODEL.thumbnailMasonryType)
},
get thumbnailMasonryFill() {
if(USER_AGENT === MOBILE) {
return true
} else {
var hasMinCols = !!STATE.overrides.thumbnailMinCols
var masonryFill = firstValid(thumbnail.masonryFill, LAYOUT_MODEL.thumbnailMasonryFill)
var masonryType = firstValid(thumbnail.type, LAYOUT_MODEL.thumbnailType)
if(masonryType !== undefined) {
switch(masonryType) {
case 'vMasonry':
return hasMinCols || masonryFill
case 'hMasonry':
return masonryFill
default:
return false
}
} else {
return masonryFill
}
}
},
get thumbnailMasonryEvenRowHeight() {
if(USER_AGENT === MOBILE) {
// because we are setting mobile thumbnailType to vMasonry
return false
} else {
var masonryType = firstValid(thumbnail.type, LAYOUT_MODEL.thumbnailType)
switch(masonryType) {
case 'vMasonry':
return false
case 'hMasonry':
return true
default:
return false
}
}
},
get thumbnailMasonryMaintainOrder() {
return firstValid(thumbnail.masonryMaintainOrder, LAYOUT_MODEL.thumbnailMasonryMaintainOrder)
},
get thumbnailMaxCols() {
var thumbnailType = firstValid(thumbnail.type, LAYOUT_MODEL.thumbnailType)
if(thumbnailType === 'hMasonryHScroll') return 5000
if(USER_AGENT === MOBILE) {
return firstValid(thumbnail.maxColsMobile, LAYOUT_MODEL.thumbnailMaxColsMobile, 3)
} else if(isPod()) {
return firstValid(thumbnail.maxColsMobile, LAYOUT_MODEL.thumbnailMaxColsMobile, thumbnail.maxCols, LAYOUT_MODEL.thumbnailMaxCols)
} else {
return firstValid(thumbnail.maxCols, LAYOUT_MODEL.thumbnailMaxCols)
}
},
get thumbnailMinCols() {
var result
if(USER_AGENT === MOBILE) {
result = firstValid(thumbnail.minColsMobile, LAYOUT_MODEL.thumbnailMinColsMobile, 1)
} else if(isPod()) {
result = firstValid(thumbnail.minColsMobile, LAYOUT_MODEL.thumbnailMinColsMobile, thumbnail.minCols, LAYOUT_MODEL.thumbnailMinCols)
} else {
result = firstValid(thumbnail.minCols, LAYOUT_MODEL.thumbnailMinCols)
}
return Math.min(result, STATE.overrides.thumbnailMaxCols)
},
get thumbnailGap() {
if(USER_AGENT === MOBILE) {
return percentToPixels(LAYOUT_MODEL.thumbnailGapMobile || 0, stage.width)
} else if(isPod()) {
return percentToPixels(firstValid(LAYOUT_MODEL.thumbnailGapMobile, thumbnail.gap, LAYOUT_MODEL.thumbnailGap), stage.width)
} else {
return percentToPixels(firstValid(thumbnail.gap, LAYOUT_MODEL.thumbnailGap), stage.width)
}
},
get thumbnailGapVertical() {
if(USER_AGENT === MOBILE) {
return percentToPixels(LAYOUT_MODEL.thumbnailGapVerticalMobile || 0, stage.height)
} else if(isPod()) {
return percentToPixels(firstValid(LAYOUT_MODEL.thumbnailGapVerticalMobile, thumbnail.gapVertical, LAYOUT_MODEL.thumbnailGapVertical), stage.height)
} else {
return percentToPixels(firstValid(thumbnail.gapVertical, LAYOUT_MODEL.thumbnailGapVertical), stage.height)
}
},
get thumbnailDock() { return firstValid(thumbnail.dock, LAYOUT_MODEL.thumbnailDock) },
get thumbnailType() {
// if(STATE.overrides.siteDisplayBehavior === 'overlay')
// return 'none'
if(USER_AGENT === MOBILE) {
return firstValid(thumbnail.type, LAYOUT_MODEL.thumbnailType) === 'none' ? 'none' : 'vMasonry'
} else {
var masonry = firstValid(thumbnail.masonry, LAYOUT_MODEL.thumbnailMasonry)
var thumbType = !thumbnail.type || thumbnail.type === 'default' ? LAYOUT_MODEL.thumbnailType : firstValid(thumbnail.type, LAYOUT_MODEL.thumbnailType)
var type = thumbType === 'fill' && masonry ? 'vMasonry' : thumbType
// 'fill' + masonry:true for old settings masonry interpretation
return type
}
},
get thumbnailRandomize() {
return firstValid(thumbnail.randomize, LAYOUT_MODEL.thumbnailRandomize)
},
get thumbnailRandomInterval() {
return firstValid(thumbnail.randomizeInterval, LAYOUT_MODEL.thumbnailRandomInterval, 24)
},
get thumbnailSize() {
if(USER_AGENT === MOBILE) {
THUMB_SIZES = updateCustomThumbSize(LAYOUT_MODEL.thumbnailCustomWidthMobile, LAYOUT_MODEL.thumbnailCustomHeightMobile)
return LAYOUT_MODEL.thumbnailSizeMobile || 'xLarge'
} else if(isPod()) {
THUMB_SIZES = updateCustomThumbSize(
firstValid(LAYOUT_MODEL.thumbnailCustomWidthMobile, thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(LAYOUT_MODEL.thumbnailCustomHeightMobile, thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
return firstValid(LAYOUT_MODEL.thumbnailSizeMobile, thumbnail.size, LAYOUT_MODEL.thumbnailSize)
} else if(isPad()) {
THUMB_SIZES = updateCustomThumbSize(
firstValid(LAYOUT_MODEL.thumbnailCustomWidthTablet, thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(LAYOUT_MODEL.thumbnailCustomHeightTablet, thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
return firstValid(LAYOUT_MODEL.thumbnailSizeTablet, thumbnail.size, LAYOUT_MODEL.thumbnailSize)
} else {
THUMB_SIZES = updateCustomThumbSize(
firstValid(thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
return firstValid(thumbnail.size, LAYOUT_MODEL.thumbnailSize)
}
},
get thumbnailCustomWidth() {
if(isPod()) {
THUMB_SIZES = updateCustomThumbSize(
firstValid(LAYOUT_MODEL.thumbnailCustomWidthMobile, thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(LAYOUT_MODEL.thumbnailCustomHeightMobile, thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
} else if(isPad()) {
THUMB_SIZES = updateCustomThumbSize(
firstValid(LAYOUT_MODEL.thumbnailCustomWidthTablet, thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(LAYOUT_MODEL.thumbnailCustomHeightTablet, thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
} else {
THUMB_SIZES = updateCustomThumbSize(
firstValid(thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
}
return THUMB_SIZES.custom.width
},
get thumbnailCustomHeight() {
if(isPod()) {
THUMB_SIZES = updateCustomThumbSize(
firstValid(LAYOUT_MODEL.thumbnailCustomWidthMobile, thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(LAYOUT_MODEL.thumbnailCustomHeightMobile, thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
} else if(isPad()) {
THUMB_SIZES = updateCustomThumbSize(
firstValid(LAYOUT_MODEL.thumbnailCustomWidthTablet, thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(LAYOUT_MODEL.thumbnailCustomHeightTablet, thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
} else {
THUMB_SIZES = updateCustomThumbSize(
firstValid(thumbnail.customWidth, LAYOUT_MODEL.thumbnailCustomWidth),
firstValid(thumbnail.customHeight, LAYOUT_MODEL.thumbnailCustomHeight)
)
}
return THUMB_SIZES.custom.height
},
get thumbnailSide() { return firstValid(thumbnail.side, LAYOUT_MODEL.thumbnailSide) },
get thumbnailHorizontalMargin() {
if(USER_AGENT === MOBILE) {
return LAYOUT_MODEL.thumbnailHorizontalMarginMobile || 0
} else if(isPod()) {
return firstValid(LAYOUT_MODEL.thumbnailHorizontalMarginMobile, thumbnail.horizontalMargin, LAYOUT_MODEL.thumbnailHorizontalMargin)
} else {
return firstValid(thumbnail.horizontalMargin, LAYOUT_MODEL.thumbnailHorizontalMargin)
}
},
get thumbnailVerticalMargin() {
if(USER_AGENT === MOBILE) {
return LAYOUT_MODEL.thumbnailVerticalMarginMobile || 0
} else if(isPod()) {
return firstValid(LAYOUT_MODEL.thumbnailVerticalMarginMobile, thumbnail.verticalMargin, LAYOUT_MODEL.thumbnailVerticalMargin)
} else {
return firstValid(thumbnail.verticalMargin, LAYOUT_MODEL.thumbnailVerticalMargin)
}
},
get thumbnailAlignHorizontal() {
return firstValid(thumbnail.alignHorizontal, LAYOUT_MODEL.thumbnailAlignHorizontal)
},
get thumbnailAlignVertical() {
return firstValid(thumbnail.alignVertical, LAYOUT_MODEL.thumbnailAlignVertical)
},
get thumbnailCornerRadius() {
return firstValid(thumbnail.cornerRadius, LAYOUT_MODEL.thumbnailCornerRadius) || 0
},
get thumbnailShadow() {
return firstValid(thumbnail.shadow, LAYOUT_MODEL.thumbnailShadow) || ''
},
get thumbnailOverlayColor() { return firstValid(thumbnail.overlayColor, LAYOUT_MODEL.overlayColor) },
get thumbnailOverlayAlpha() { return firstValid(thumbnail.overlayAlpha, LAYOUT_MODEL.overlayAlpha) },
get thumbnailGridColor() { return firstValid(thumbnail.gridColor, LAYOUT_MODEL.thumbnailGridColor) },
get thumbnailGridTransparency() { return firstValid(thumbnail.gridTransparency, LAYOUT_MODEL.thumbnailGridTransparency) },
get thumbnailHoverAlpha() { return firstValid(thumbnail.hoverAlpha, LAYOUT_MODEL.thumbnailHoverAlpha) },
get thumbnailHoverAlphaMobile() { return LAYOUT_MODEL.thumbnailHoverAlphaMobile },
get thumbnailHoverAlphaTablet() { return LAYOUT_MODEL.thumbnailHoverAlphaTablet },
get thumbnailHoverColor() { return firstValid(thumbnail.hoverColor, LAYOUT_MODEL.thumbnailHoverColor) },
get thumbnailLoaderType() { return firstValid(thumbnail.loaderType, LAYOUT_MODEL.thumbnailLoaderType, 'spinner') },
get thumbnailTitleFont() {
if(isPod()) {
return firstValid(LAYOUT_MODEL.thumbnailTitleFontMobile, LAYOUT_MODEL.thumbnailTitleFont)
} else if(isPad()) {
return firstValid(LAYOUT_MODEL.thumbnailTitleFontTablet, LAYOUT_MODEL.thumbnailTitleFont)
} else {
return firstValid(thumbnail.titleFont, LAYOUT_MODEL.thumbnailTitleFont)
}
},
get thumbnailTitleFontSize() {
if(isPod()) {
return LAYOUT_MODEL.thumbnailTitleFontSizeMobile || thumbnail.titleFontSize || LAYOUT_MODEL.thumbnailTitleFontSize
} else if(isPad()) {
return LAYOUT_MODEL.thumbnailTitleFontSizeTablet || thumbnail.titleFontSize || LAYOUT_MODEL.thumbnailTitleFontSize
} else {
return thumbnail.titleFontSize || LAYOUT_MODEL.thumbnailTitleFontSize
}
},
get thumbnailTitleFontColor() {
if(isPod()) {
return firstValid(LAYOUT_MODEL.thumbnailTitleFontColorMobile, LAYOUT_MODEL.thumbnailLabelColorMobile, thumbnail.titleFontColor, LAYOUT_MODEL.thumbnailTitleFontColor)
} else if(isPad()) {
return firstValid(LAYOUT_MODEL.thumbnailTitleFontColorTablet, LAYOUT_MODEL.thumbnailLabelColorTablet, thumbnail.titleFontColor, LAYOUT_MODEL.thumbnailTitleFontColor)
} else {
return firstValid(thumbnail.titleFontColor, LAYOUT_MODEL.thumbnailTitleFontColor)
}
},
get thumbnailLabelVerticalOffset() { return firstValid(thumbnail.labelVerticalOffset, LAYOUT_MODEL.thumbnailLabelVerticalOffset) },
get thumbnailLabelColorMobile() { return LAYOUT_MODEL.thumbnailLabelColorMobile },
get thumbnailLabelColorTablet() { return LAYOUT_MODEL.thumbnailLabelColorTablet },
get thumbnailLabelPosition() {
return firstValid(thumbnail.labelPosition, LAYOUT_MODEL.thumbnailLabelPosition)
},
get thumbnailLabelJustification() {
return firstValid(thumbnail.labelJustification, LAYOUT_MODEL.thumbnailLabelJustification)
},
get thumbnailStdLabelPosition() {
// return firstValid(thumbnail.stdLabelPosition, LAYOUT_MODEL.thumbnailStdLabelPosition)
return thumbnail.stdLabelPosition
},
get thumbnailStdLabelJustification() {
// return firstValid(thumbnail.stdLabelPosition, LAYOUT_MODEL.thumbnailStdLabelPosition)
return thumbnail.stdLabelJustification
},
get thumbnailLabelPositionMobile() {
/*
see >>> admin/media/panel/ThumbsOverridesPanel.js for comments about this
*/
// var pos = firstValid(LAYOUT_MODEL.thumbnailLabelPositionMobile, LAYOUT_MODEL.thumbnailLabelPosition)
var overrideLabelPosition = /^hover/.test(thumbnail.labelPosition) ? 'bottom' : thumbnail.labelPosition
var globalLabelPosition = /^hover/.test(LAYOUT_MODEL.thumbnailLabelPosition) ? 'bottom' : LAYOUT_MODEL.thumbnailLabelPosition
return firstValid(LAYOUT_MODEL.thumbnailLabelPositionMobile, overrideLabelPosition, globalLabelPosition, undefined)
},
get thumbnailStdLabelPositionMobile() {
/*
see >>> admin/media/panel/ThumbsOverridesPanel.js for comments about this
*/
// var pos = firstValid(LAYOUT_MODEL.thumbnailStdLabelPositionMobile, LAYOUT_MODEL.thumbnailStdLabelPosition)
// return thumbnail.stdLabelPosition === 'hover' ? 'bottom' : firstValid(thumbnail.stdLabelPosition, pos)
// var position = firstValid(thumbnail.stdLabelPositionMobile, LAYOUT_MODEL.thumbnailStdLabelPositionMobile)
// return position === 'hover' ? 'over' : position
// return thumbnail.stdLabelPositionMobile
var overrideLabelPosition = /^hover/.test(thumbnail.stdLabelPositionMobile) ? 'over' : thumbnail.stdLabelPositionMobile
var globalLabelPosition = /^hover/.test(LAYOUT_MODEL.thumbnailStdLabelPositionMobile) ? 'over' : LAYOUT_MODEL.thumbnailStdLabelPositionMobile
return firstValid(overrideLabelPosition, globalLabelPosition, undefined)
},
get thumbnailLabelPositionTablet() {
/*
see >>> admin/media/panel/ThumbsOverridesPanel.js for comments about this
*/
// var pos = firstValid(LAYOUT_MODEL.thumbnailLabelPositionTablet, LAYOUT_MODEL.thumbnailLabelPosition)
// return thumbnail.labelPosition === 'hover' ? 'bottom' : firstValid(thumbnail.labelPosition, pos)
// return firstValid(LAYOUT_MODEL.thumbnailLabelPositionTablet, thumbnail.labelPosition, LAYOUT_MODEL.thumbnailLabelPosition, 'bottom')
var overrideLabelPosition = /^hover/.test(thumbnail.labelPosition) ? 'bottom' : thumbnail.labelPosition
var globalLabelPosition = /^hover/.test(LAYOUT_MODEL.thumbnailLabelPosition) ? 'bottom' : LAYOUT_MODEL.thumbnailLabelPosition
return firstValid(LAYOUT_MODEL.thumbnailLabelPositionTablet, overrideLabelPosition, globalLabelPosition, undefined)
},
get thumbnailStdLabelPositionTablet() {
/*
see >>> admin/media/panel/ThumbsOverridesPanel.js for comments about this
*/
// var pos = firstValid(LAYOUT_MODEL.thumbnailStdLabelPositionTablet, LAYOUT_MODEL.thumbnailStdLabelPosition)
// return thumbnail.stdLabelPosition === 'hover' ? 'bottom' : firstValid(thumbnail.stdLabelPosition, pos)
// var position = firstValid(thumbnail.stdLabelPositionTablet, LAYOUT_MODEL.thumbnailStdLabelPositionTablet)
// return position === 'hover' ? 'over' : position
// return thumbnail.stdLabelPositionTablet
var overrideLabelPosition = /^hover/.test(thumbnail.stdLabelPositionTablet) ? 'over' : thumbnail.stdLabelPositionTablet
var globalLabelPosition = /^hover/.test(LAYOUT_MODEL.thumbnailStdLabelPositionTablet) ? 'over' : LAYOUT_MODEL.thumbnailStdLabelPositionTablet
return firstValid(overrideLabelPosition, globalLabelPosition, undefined)
},
get thumbnailVideoPlayIcon() {
return firstValid(thumbnail.videoPlayIcon, LAYOUT_MODEL.thumbnailVideoPlayIcon !== false)
},
get thumbnailScrollbarAlignment() { return firstValid(thumbnail.scrollbarAlignment, LAYOUT_MODEL.thumbnailScrollbarAlignment) },
get thumbnailScrollbarColor() { return firstValid(thumbnail.scrollbarColor, LAYOUT_MODEL.thumbnailScrollbarColor) },
get thumbnailScrollbarHover() { return firstValid(thumbnail.scrollbarHover, LAYOUT_MODEL.thumbnailScrollbarHover) },
get thumbnailSelectedColor() { return firstValid(thumbnail.selectedColor, LAYOUT_MODEL.thumbnailSelectedColor) },
get thumbnailSelectedAlpha() { return firstValid(thumbnail.selectedAlpha, LAYOUT_MODEL.thumbnailSelectedAlpha, LAYOUT_MODEL.thumbnailHoverAlpha) },
get thumbnailScrollbarHorizontalOffset() { return firstValid(thumbnail.scrollbarHorizontalOffset, LAYOUT_MODEL.thumbnailScrollbarHorizontalOffset) },
get thumbnailScrollbarVerticalOffset() { return firstValid(thumbnail.scrollbarVerticalOffset, LAYOUT_MODEL.thumbnailScrollbarVerticalOffset) },
get thumbnailScrollType() {
// var scrollType = thumbnail.scrollType === '' ? 'scrollbar' : thumbnail.scrollType
// return firstValid(scrollType, LAYOUT_MODEL.thumbnailScrollType)
// but dont want default empty string to mean custom overrides
var scrollType = firstValid(thumbnail.scrollType, LAYOUT_MODEL.thumbnailScrollType)
if(scrollType === 'mouse cursor') scrollType = 'nativeMacOs'
return scrollType
},
get thumbnailScrollbarBgAlpha() { return firstValid(thumbnail.scrollbarBgAlpha, LAYOUT_MODEL.thumbnailScrollbarBgAlpha) },
get thumbnailScrollbarWidth() { return firstValid(thumbnail.scrollbarWidth, LAYOUT_MODEL.thumbnailScrollbarWidth) },
get thumbnailScrollbarVisibility() { return firstValid(thumbnail.scrollbarVisibility, LAYOUT_MODEL.thumbnailScrollbarVisibility) },
get thumbnailScrollbarRounded() { return firstValid(thumbnail.scrollbarRounded, LAYOUT_MODEL.thumbnailScrollbarRounded) },
get thumbnailTitleBlockTopMargin() {
if(isPod()) {
return firstValid(LAYOUT_MODEL.thumbnailTitleBlockTopMarginMobile, LAYOUT_MODEL.thumbnailTitleBlockTopMargin) || 0
} else {
return LAYOUT_MODEL.thumbnailTitleBlockTopMargin || 0
}
},
get captionAutoPosition() { return (USER_AGENT === MOBILE && LAYOUT_MODEL.captionMobileOverrides) || firstValid(sectionOverrides.captionAutoPosition, LAYOUT_MODEL.captionAutoPosition) },
get captionDefault() { return firstValid(sectionOverrides.captionDefault, LAYOUT_MODEL.captionDefault) },
get captionUseTitle() { return firstValid(sectionOverrides.captionUseTitle, LAYOUT_MODEL.captionUseTitle) },
get captionCloseButton() { return firstValid(sectionOverrides.captionCloseButton, LAYOUT_MODEL.captionCloseButton) },
get captionBackgroundAlpha() { return firstValid(sectionOverrides.captionBackgroundAlpha, LAYOUT_MODEL.captionBackgroundAlpha) },
get captionBackgroundRectColor() { return firstValid(sectionOverrides.captionBackgroundRectColor, LAYOUT_MODEL.captionBackgroundRectColor) },
get captionFont() { return firstValid(sectionOverrides.captionFont, LAYOUT_MODEL.captionFont) },
get captionFontColor() { return firstValid(sectionOverrides.captionFontColor, LAYOUT_MODEL.captionFontColor) },
get captionFontSize() { return sectionOverrides.captionFontSize || LAYOUT_MODEL.captionFontSize },
get captionFontSizeBreakpoint() { return sectionOverrides.captionFontSizeBreakpoint || LAYOUT_MODEL.captionFontSizeBreakpoint || sectionOverrides.captionFontSize || LAYOUT_MODEL.captionFontSize },
get captionWidth() { return percentToPixels(firstValid(sectionOverrides.captionWidth, LAYOUT_MODEL.captionWidth), stage.width) },
get captionHeight() { return percentToPixels(firstValid(sectionOverrides.captionHeight, LAYOUT_MODEL.captionHeight), stage.height) },
get captionAlignHorizontal() { return firstValid(sectionOverrides.captionAlignHorizontal, LAYOUT_MODEL.captionAlignHorizontal) },
get captionAlignVertical() { return firstValid(sectionOverrides.captionAlignVertical, LAYOUT_MODEL.captionAlignVertical) },
get captionMobileOverrides() { return USER_AGENT === MOBILE && LAYOUT_MODEL.captionMobileOverrides },
get captionOffsetX() { return percentToPixels(firstValid(sectionOverrides.captionOffsetX, LAYOUT_MODEL.captionOffsetX), stage.width) },
get captionOffsetY() { return percentToPixels(firstValid(sectionOverrides.captionOffsetY, LAYOUT_MODEL.captionOffsetY), stage.height) },
get captionTextAlign() { return firstValid(sectionOverrides.captionTextAlign, LAYOUT_MODEL.captionTextAlign) },
get captionTextAlignVertical() { return firstValid(sectionOverrides.captionTextAlignVertical, LAYOUT_MODEL.captionTextAlignVertical) },
get captionPaddingTop() { return percentToPixels(firstValid(sectionOverrides.captionPaddingTop, LAYOUT_MODEL.captionPaddingTop), stage.height) },
get captionPaddingRight() { return percentToPixels(firstValid(sectionOverrides.captionPaddingRight, LAYOUT_MODEL.captionPaddingRight), stage.width) },
get captionPaddingBottom() { return percentToPixels(firstValid(sectionOverrides.captionPaddingBottom, LAYOUT_MODEL.captionPaddingBottom), stage.height) },
get captionPaddingLeft() { return percentToPixels(firstValid(sectionOverrides.captionPaddingLeft, LAYOUT_MODEL.captionPaddingLeft), stage.width) },
get captionScrollType() {
return firstValid(sectionOverrides.captionScrollType, LAYOUT_MODEL.captionScrollType)
},
get captionScrollbarWidth() { return firstValid(sectionOverrides.captionScrollbarWidth, LAYOUT_MODEL.captionScrollbarWidth) },
get captionScrollbarAlignment() { return firstValid(sectionOverrides.captionScrollbarAlignment, LAYOUT_MODEL.captionScrollbarAlignment) },
get captionScrollbarColor() { return firstValid(sectionOverrides.captionScrollbarColor, LAYOUT_MODEL.captionScrollbarColor) },
get captionScrollbarHover() { return firstValid(sectionOverrides.captionScrollbarHover, LAYOUT_MODEL.captionScrollbarHover) },
get captionScrollbarHorizontalOffset() { return firstValid(sectionOverrides.captionScrollbarHorizontalOffset, LAYOUT_MODEL.captionScrollbarHorizontalOffset) },
get captionScrollbarVerticalOffset() { return firstValid(sectionOverrides.captionScrollbarVerticalOffset, LAYOUT_MODEL.captionScrollbarVerticalOffset) },
get captionScrollbarBgAlpha() { return firstValid(sectionOverrides.captionScrollbarBgAlpha, LAYOUT_MODEL.captionScrollbarBgAlpha) },
get captionAnchorTo() { return firstValid(sectionOverrides.captionAnchorTo, LAYOUT_MODEL.captionAnchorTo) },
get slideshowRandomize() { return firstValid(sectionOverrides.slideshowRandomize, LAYOUT_MODEL.landingMediaRandomize) },
get slideshowTransitionType() { return firstValid(sectionOverrides.slideshowTransitionType, LAYOUT_MODEL.landingMediaTransitionType) },
get slideshowSpeed() { return firstValid(sectionOverrides.slideshowSpeed, LAYOUT_MODEL.landingMediaSpeed) },
get slideshowTransitionDuration() { return firstValid(sectionOverrides.slideshowTransitionDuration, LAYOUT_MODEL.landingMediaTransitionDuration) },
get slideshowAlignHorizontal() { return firstValid(sectionOverrides.slideshowAlignHorizontal, LAYOUT_MODEL.landingMediaAlignHorizontal) },
get slideshowAlignVertical() { return firstValid(sectionOverrides.slideshowAlignVertical, LAYOUT_MODEL.landingMediaAlignVertical) },
get slideshowScaleType() {
var desktopSlideshowScaleType = firstValid(sectionOverrides.slideshowScaleType, LAYOUT_MODEL.landingMediaScaleType)
if(isPod()) {
return firstValid(LAYOUT_MODEL.landingMediaScaleTypeMobile, 'fit')
} else if(isPad()) {
return firstValid(LAYOUT_MODEL.landingMediaScaleTypeTablet, desktopSlideshowScaleType)
} else {
return desktopSlideshowScaleType //firstValid(sectionOverrides.slideshowScaleType, LAYOUT_MODEL.landingMediaScaleType)
}
},
get slideshowScrollDownIcon() { return firstValid(section.scrollDownIcon, LAYOUT_MODEL.slideshowScrollDownIcon) },
get siteDisplayBehavior() {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
return 'none'
}
// Read this first !!!!!!
// Need to look in section controller to find out why there is nothing to build in the case of max scroll with index gallery
// clicking from parent index to overlay sub should build a new max scroll gallery with just one section
// clicking from there should bring up overlay with full size gallery images
var sectionState = layoutCalcs.getSectionState(section.key)
var sectionDisplayBehavior = (LAYOUT_MODEL.unifiedPageScrolling || /unified/.test(LAYOUT_MODEL.siteDisplayBehavior)) && /overlay/.test(section.displayBehavior) && STATE.overrides.siteDisplayGalleryOnlyOverlay && isThumbsFirst(section) && /thumbs/.test(sectionState.mode) /* && !isIndexSection(getParentSection(section)) */ ? LAYOUT_MODEL.siteDisplayBehavior : section.displayBehavior
return firstValid(sectionDisplayBehavior, LAYOUT_MODEL.siteDisplayBehavior, (LAYOUT_MODEL.unifiedPageScrolling ? 'unifiedPageScrolling' : 'none'))
},
get siteDisplayGalleryOnlyOverlay() {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
return false
}
return section.displayGalleryOnlyOverlay //firstValid(section.displayGalleryOnlyOverlay, LAYOUT_MODEL.siteDisplayGalleryOnlyOverlay)
},
get logoViewZIndex() {
if(USER_AGENT === MOBILE) {
return firstValid(LAYOUT_MODEL.mobileLogoZIndex, LAYOUT_MODEL.logoZIndex, (STATE.menuView.placement() === 'overlay' ? 5 : 8))
} else if(isPod()) {
return firstValid(sectionOverrides.logoZIndex, LAYOUT_MODEL.mobileLogoZIndex, LAYOUT_MODEL.logoZIndex, (STATE.menuView.placement() === 'overlay' ? 5 : 8))
} else {
return firstValid(sectionOverrides.logoZIndex, LAYOUT_MODEL.logoZIndex, (STATE.menuView.placement() === 'overlay' ? 5 : 8))
}
}
}
},
get backgroundImages() {
var imgs = []
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingBackgroundImages')) {
imgs = SETTINGS_MODEL.stagingBackgroundImages || imgs
} else {
imgs = SETTINGS_MODEL.backgroundImages.length ?
SETTINGS_MODEL.backgroundImages :
DX_MODEL.designSettings.backgroundImages || imgs
}
return imgs.filter(function(id) {
return getMediaById(id)
})
},
get socialLinks() {
var links = []
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingSocialLinks')) {
links = SETTINGS_MODEL.stagingSocialLinks || links
} else {
links = SETTINGS_MODEL.socialLinks.length ?
SETTINGS_MODEL.socialLinks :
DX_MODEL.designSettings.socialLinks || links
}
return links.filter(function(id) {
return getMediaById(id)
})
},
get podUseDesktop() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingPodUseDesktop')) {
return SETTINGS_MODEL.stagingPodUseDesktop || false
} else {
return firstValid(SETTINGS_MODEL.podUseDesktop, DX_MODEL.designSettings.podUseDesktop) || false
}
},
get padUseDesktop() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingPadUseDesktop')) {
return SETTINGS_MODEL.stagingPadUseDesktop || false
} else {
return firstValid(SETTINGS_MODEL.padUseDesktop, DX_MODEL.designSettings.padUseDesktop) || false
}
},
get copyright() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingCopyright')) {
return SETTINGS_MODEL.stagingCopyright || ''
} else {
return firstValid(SETTINGS_MODEL.copyright, DX_MODEL.designSettings.copyright) || ''
}
},
get logoFile() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingLogoFile')) {
return SETTINGS_MODEL.stagingLogoFile || ''
} else {
return firstValid(SETTINGS_MODEL.logoFile, DX_MODEL.designSettings.logoFile) || ''
}
},
get logoHtml() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingLogoHtml')) {
return SETTINGS_MODEL.stagingLogoHtml || ''
} else {
return firstValid(SETTINGS_MODEL.logoHtml, DX_MODEL.designSettings.logoHtml) || ''
}
},
get logoText() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingLogoText')) {
return SETTINGS_MODEL.stagingLogoText || ''
} else {
return firstValid(SETTINGS_MODEL.logoText, DX_MODEL.designSettings.logoText) || ''
}
},
get introFile() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingIntroFile')) {
return SETTINGS_MODEL.stagingIntroFile || ''
} else {
return firstValid(SETTINGS_MODEL.introFile, DX_MODEL.designSettings.introFile) || ''
}
},
get blogSectionId() {
if(window.isStaging && SETTINGS_MODEL.hasOwnProperty('stagingBlogSectionId')) {
return SETTINGS_MODEL.stagingBlogSectionId || ''
} else {
return firstValid(SETTINGS_MODEL.blogSectionId, DX_MODEL.designSettings.blogSectionId) || ''
}
},
footerView: {
zIndex: function() { return LAYOUT_MODEL.copyrightZIndex ? LAYOUT_MODEL.copyrightZIndex : (STATE.menuView.placement() === 'overlay' ? 5 : 8) }
},
introView: {
zIndex: 500
},
mediaView: {
zIndex: 1,
zoneX: function() { return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.x() : layoutCalcs.mediaView.x() },
zoneY: function(key) { return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.y() : layoutCalcs.mediaView.y(key) },
zoneWidth: function() {
return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.width() : layoutCalcs.mediaView.width()
},
zoneHeight: function(key) {
if(STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' && layoutCalcs.sectionDisplayMode === 'multiple') {
return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.height() : layoutCalcs.mediaView.height(key, true /* isZone */)
} else {
return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.height() : layoutCalcs.mediaView.height(key)
}
},
contentHeight: function() {
if(STATE.siteView.unifiedPageScroll()) {
return layoutCalcs._mediaContentHeight > STATE.mediaView.height() ? layoutCalcs._mediaContentHeight : STATE.mediaView.height()
} else {
return STATE.mediaView.height()
}
},
x: function() {
// if(USER_AGENT === MOBILE) return stage.width
var x = isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.x() : layoutCalcs.mediaView.x()
if(layoutCalcs.isDisplace() && STATE.overrides.thumbnailSide === 'left') {
return x + percentToPixels(STATE.overrides.thumbnailHorizontalMargin, stage.width) + THUMB_SIZES[STATE.overrides.thumbnailSize].width
}
return x
},
y: function(key) {
var y = isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.y() : layoutCalcs.mediaView.y(key)
if(layoutCalcs.isDisplace() && STATE.overrides.thumbnailSide === 'top') {
return y + percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height) + THUMB_SIZES[STATE.overrides.thumbnailSize].height
}
return y
},
width: function() {
var width = isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.width() : layoutCalcs.mediaView.width()
if(layoutCalcs.isDisplace() && (STATE.overrides.thumbnailSide === 'left' || STATE.overrides.thumbnailSide === 'right')) {
return width - percentToPixels(STATE.overrides.thumbnailHorizontalMargin, stage.width) - THUMB_SIZES[STATE.overrides.thumbnailSize].width
}
return width
},
height: function(key) {
var height = isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.height() : layoutCalcs.mediaView.height(key)
var menuSize = (percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height))
var stageHeight = /unifiedSite/.test(STATE.overrides.siteDisplayBehavior) && /top|bottom/.test(STATE.menuView.placement()) ? stage.height - menuSize : stage.height
if((height >= stageHeight || !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) && layoutCalcs.isDisplace() && (STATE.overrides.thumbnailSide === 'top' || STATE.overrides.thumbnailSide === 'bottom')) {
return height - percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height) - THUMB_SIZES[STATE.overrides.thumbnailSize].height
}
return height
},
maskX: function() { return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.x() : layoutCalcs.mediaMask.x() },
maskY: function(key) { return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.y() : layoutCalcs.mediaMask.y(key) },
maskWidth: function(mediaItemWidth) {
return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.width() : layoutCalcs.mediaMask.width(mediaItemWidth)
},
maskHeight: function(mediaItemHeight, key) {
return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.height() : layoutCalcs.mediaMask.height(mediaItemHeight, key)
},
hAlign: function() {
if(USER_AGENT === MOBILE) {
return layoutCalcs.isLandingMedia ? firstValid(LAYOUT_MODEL.landingMediaAlignHorizontalMobile, STATE.overrides.slideshowAlignHorizontal) : STATE.overrides.imageAlignHorizontal
} else {
return layoutCalcs.isLandingMedia ? STATE.overrides.slideshowAlignHorizontal : STATE.overrides.imageAlignHorizontal
}
},
vAlign: function() {
if(USER_AGENT === MOBILE) {
return layoutCalcs.isLandingMedia ? firstValid(LAYOUT_MODEL.landingMediaAlignVerticalMobile, STATE.overrides.slideshowAlignVertical) : STATE.overrides.imageAlignVertical
} else {
return layoutCalcs.isLandingMedia ? STATE.overrides.slideshowAlignVertical : STATE.overrides.imageAlignVertical
}
},
transitionDuration: function(isSlideShow) { return isSlideShow ? STATE.overrides.slideshowTransitionDuration : STATE.overrides.transitionDuration },
imageScaleType: function() {
if(layoutCalcs.isLandingMedia) {
if(isPod()) {
// also see Resize fn in ImageView.js
return firstValid(LAYOUT_MODEL.landingMediaScaleTypeMobile, STATE.overrides.slideshowScaleType)
} else if(isPad()) {
// also see Resize fn in ImageView.js
return firstValid(LAYOUT_MODEL.landingMediaScaleTypeTablet, STATE.overrides.slideshowScaleType)
} else {
return STATE.overrides.slideshowScaleType
}
} else {
return STATE.overrides.imageScaleType
}
},
videoScaleType: function(isVimeo) {
if(layoutCalcs.isLandingMedia) {
if(isPod()) {
// also see Resize fns in VideoView.js
return firstValid(LAYOUT_MODEL.landingMediaScaleTypeMobile, STATE.overrides.slideshowScaleType)
} else if(isPad()) {
// also see Resize fns in VideoView.js
return firstValid(LAYOUT_MODEL.landingMediaScaleTypeTablet, STATE.overrides.slideshowScaleType)
} else {
return STATE.overrides.slideshowScaleType
}
} else {
if(isVimeo && STATE.overrides.videoScaleType === 'fill') {
return 'fit'
}
return STATE.overrides.videoScaleType
}
},
videoAutoPlay: function() {
// var vimeoDefaultMobile = LAYOUT_MODEL.vimeoDefaultMobile === '' || LAYOUT_MODEL.vimeoDefaultMobile === undefined || LAYOUT_MODEL.vimeoDefaultMobile
// var vimeoDefault = firstValid(vimeoDefaultMobile, LAYOUT_MODEL.vimeoDefault)
// return vimeoDefault ? false : STATE.overrides.videoAutoPlay
return STATE.overrides.videoAutoPlay
},
backgroundColor: function() {
if(isFillSite() && layoutCalcs.isLandingMedia) {
return LAYOUT_MODEL.siteBackgroundColor
}
return STATE.overrides.containerColor
}
},
menuView: {
placement: function() {
// isMenuResponsiveOverlay is set in SiteController on RESIZE_END
var output
switch(LAYOUT_MODEL.menuAlignHorizontal) {
case 'top-responsive':
output = layoutCalcs.isMenuResponsiveOverlay ? 'overlay' : 'top'
break
case 'right-responsive':
output = layoutCalcs.isMenuResponsiveOverlay ? 'overlay' : 'right'
break
case 'bottom-responsive':
output = layoutCalcs.isMenuResponsiveOverlay ? 'overlay' : 'bottom'
break
case 'left-responsive':
output = layoutCalcs.isMenuResponsiveOverlay ? 'overlay' : 'left'
break
default:
output = LAYOUT_MODEL.menuAlignHorizontal
break
}
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) return 'left'
return output
},
zIndex: 6,
menuPositionFixed: function() {
// bottom aligned menu must be fixed postion due to menu dock mask
return /bottom/.test(STATE.menuView.placement()) ? true : LAYOUT_MODEL.menuPositionFixed
},
menuFontSize: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayFontSize || LAYOUT_MODEL.menuFontSize
}
return LAYOUT_MODEL.menuFontSize
},
menuSubFontSize: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlaySubFontSize || LAYOUT_MODEL.menuSubFontSize
}
return LAYOUT_MODEL.menuSubFontSize
},
menuBgColor: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayBgColor || LAYOUT_MODEL.menuBgColor
}
return LAYOUT_MODEL.menuBgColor
},
menuBgAlpha: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayBgAlpha || LAYOUT_MODEL.menuBgAlpha
}
return LAYOUT_MODEL.menuBgAlpha
},
menuFontColor: function() {
var menuFontColor = LAYOUT_MODEL.menuFontColor
if(USER_AGENT === MOBILE) menuFontColor = LAYOUT_MODEL.menuFontColorMobile || menuFontColor
if(USER_AGENT === TABLET) menuFontColor = LAYOUT_MODEL.menuFontColorTablet || menuFontColor
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayFontColor || menuFontColor
}
return menuFontColor
},
menuFontColorHover: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayFontColorHover || LAYOUT_MODEL.menuFontColorHover
}
return LAYOUT_MODEL.menuFontColorHover
},
menuFontColorSelected: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayFontColorSelected || LAYOUT_MODEL.menuFontColorSelected
}
return LAYOUT_MODEL.menuFontColorSelected
},
menuTextAlignHorizontal: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayTextAlignHorizontal || LAYOUT_MODEL.menuTextAlignHorizontal
}
return LAYOUT_MODEL.menuTextAlignHorizontal
},
menuTextAlignVertical: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayTextAlignVertical || LAYOUT_MODEL.menuTextAlignVertical
}
return LAYOUT_MODEL.menuTextAlignVertical
},
menuTextPaddingHorizontal: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayTextPaddingHorizontal || LAYOUT_MODEL.menuTextPaddingHorizontal
}
return LAYOUT_MODEL.menuTextPaddingHorizontal
},
menuTextPaddingVertical: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayTextPaddingVertical || LAYOUT_MODEL.menuTextPaddingVertical
}
return LAYOUT_MODEL.menuTextPaddingVertical
},
menuTextGap: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlayTextGap || LAYOUT_MODEL.menuTextGap
}
return LAYOUT_MODEL.menuTextGap
},
menuSubTextAlignHorizontal: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlaySubTextAlignHorizontal || LAYOUT_MODEL.menuSubTextAlignHorizontal
}
return LAYOUT_MODEL.menuSubTextAlignHorizontal
},
menuSubTextGap: function() {
if(STATE.menuView.placement() === 'overlay') {
return LAYOUT_MODEL.menuOverlaySubTextGap || LAYOUT_MODEL.menuSubTextGap
}
return LAYOUT_MODEL.menuSubTextGap
},
menuIconOverlayColor: function() {
return LAYOUT_MODEL.menuIconOverlayColor || LAYOUT_MODEL.menuOverlayFontColor || '#333333'
}
},
navbarView: {
zIndex: function() {
if(/^overlay/.test(STATE.overrides.siteDisplayBehavior)) {
return 101 // MediaOverlay is at zIndex of 100
} else {
return USER_AGENT === MOBILE || STATE.menuView.placement() === 'overlay' ? 3 : 7
}
}
},
overlayView: {
x: function() {
// Max Scroll thumbs view (not centering) #1633
// need to set the overlay view x to mediaView x instead of 0 for max scroll
// not sure why we had the assumption that it should be 0
// if(/^unifiedSite|overlay/.test(STATE.overrides.siteDisplayBehavior) && /top|bottom/.test(STATE.menuView.placement())) {
// return 0
// } else {
return STATE.mediaView.zoneX()
// }
},
y: function(key) {
if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || isInMediaOverlay()) {
return 0
} else {
return STATE.mediaView.zoneY(key)
}
},
zoneWidth: function() {
if(isInMediaOverlay()) {
return stage.width
} else {
return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.width() : layoutCalcs.mediaView.width()
}
},
zoneHeight: function(key) {
if(isInMediaOverlay()) {
return stage.height
} else if(/unifiedPageScroll/.test(STATE.overrides.siteDisplayBehavior) && !(USER_AGENT === HTML && isPod()) && !(USER_AGENT === HTML && isPad()) && !/native/.test(STATE.overrides.thumbnailScrollType) && !LAYOUT_MODEL.globalSmoothScroll) {
return STATE.mediaView.zoneHeight()
} else if(STATE.siteView.unifiedPageScroll()) {
var zoneHeight = isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.height() : layoutCalcs.mediaView.height(key)
if(layoutCalcs._thumbsVisible && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)) {
return layoutCalcs._thumbContentHeight > zoneHeight ? layoutCalcs._thumbContentHeight : zoneHeight
} else {
return zoneHeight
}
} else {
return isFillSite() && layoutCalcs.isLandingMedia ? layoutCalcs.landingMediaView.height() : layoutCalcs.mediaView.height(key)
}
},
zIndex: 4,
size:{
x: function() {
if(isInMediaOverlay()) {
return 0
} else {
return STATE.overlayView.x()
}
},
y: function(key) {
if(isInMediaOverlay()) {
return 0
} else {
return STATE.overlayView.y(key)
}
},
width: function() {
return STATE.overlayView.zoneWidth()
},
height: function(key) {
return STATE.overlayView.zoneHeight(key)
}
}
},
captionView: {
zIndex: function() {
return USER_AGENT === MOBILE || STATE.menuView.placement() === 'overlay' ? 2 : 7
}
},
siteView: {
unifiedPageScroll: function() {
if(STATE.overrides.siteDisplayBehavior === 'overlay') {
return false
} else if(/none/.test(STATE.overrides.siteDisplayBehavior)) {
return false
} else if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
// removed vScroll check for v16 because seems to be an unneccessary restriction ported from v15 to fix #1297
// layoutCalcs.sectionDisplayMode === 'single' &&
return /^vScroll/.test(STATE.overrides.transitionType) ||
(layoutCalcs._thumbsVisible && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)) ||
isSingleTextPage(layoutCalcs._section)
} else if(/^unifiedPage/.test(STATE.overrides.siteDisplayBehavior)) {
return /^vScroll/.test(STATE.overrides.transitionType) ||
(layoutCalcs._thumbsVisible && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)) ||
isSingleTextPage(layoutCalcs._section)
} else {
return LAYOUT_MODEL.unifiedPageScrolling
}
},
width: function() {
return stage.width
},
height: function() {
if(layoutCalcs.sectionDisplayMode === 'single' && isFillSite() && layoutCalcs.isLandingMedia) {
return layoutCalcs.landingMediaView.height()
} else if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
return stage.height
} else if(STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' && layoutCalcs.sectionDisplayMode === 'multiple') {
var marginOverlap = getMarginOverlap() || 0
var sitePaddingTop = percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height)
var sitePaddingBtm = percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.height)
var firstModule = layoutCalcs.mediaModules && layoutCalcs.mediaModules[0]
var firstSection = firstModule && firstModule.controller.section
if(firstSection) {
STATE.section(firstSection)
} else {
// console.trace('no first section')
}
var menuNetHeight = 0
var menuSize = percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height)
if(firstSection && isFillSiteSlideshow(firstSection)) {
return layoutCalcs.mediaViewsHeight + sitePaddingBtm
} else if(/top/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal) {
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
return menuNetHeight + layoutCalcs.mediaViewsHeight + sitePaddingBtm
} else if(/bottom/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal) {
menuNetHeight = sitePaddingBtm + menuSize - marginOverlap
return sitePaddingTop + layoutCalcs.mediaViewsHeight + menuNetHeight
} else {
return sitePaddingTop + layoutCalcs.mediaViewsHeight + sitePaddingBtm
}
} else if(STATE.siteView.unifiedPageScroll() || /unified/.test(LAYOUT_MODEL.siteDisplayBehavior) && /overlay/.test(STATE.overrides.siteDisplayBehavior) && STATE.overrides.siteDisplayGalleryOnlyOverlay) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
// the menu height needs to be "menuNetHeight" calcs from above for unified page
//
var totalHeight = percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height)
var isTopMenu = /top/.test(STATE.menuView.placement())
var isBottomMenu = /bottom/.test(STATE.menuView.placement())
var displaceTopBottomMenu = !LAYOUT_MODEL.isMenuScrollReveal && (isTopMenu || isBottomMenu)
if(displaceTopBottomMenu) {
var marginOverlap = getMarginOverlap() || 0
var menuSize = percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height)
var sitePaddingTop = percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height)
var sitePaddingBtm = percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.height)
var sectionHeight = stage.height
var menuNetHeight = (menuSize - marginOverlap) || 0
totalHeight += menuNetHeight
}
var sectionState = layoutCalcs._section ? layoutCalcs.getSectionState(layoutCalcs._section.key) : {mode:''}
if(/thumbs/.test(sectionState.mode) && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType) && (isPod() || isPad() || /native/.test(STATE.overrides.thumbnailScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
// content height is the thumbs conent height
totalHeight += layoutCalcs._thumbContentHeight > STATE.mediaView.zoneHeight() ? layoutCalcs._thumbContentHeight : STATE.mediaView.zoneHeight()
} else {
// media view content height
// kent changed to getSectionHeight() instead of layoutCalcs._mediaContentHeight to get total height for unified page scroll
var localSection = layoutCalcs._section && layoutCalcs._section.key
totalHeight += STATE.mediaView.height(localSection) > STATE.mediaView.zoneHeight() ? STATE.mediaView.height(localSection) : STATE.mediaView.zoneHeight()
// totalHeight += layoutCalcs._mediaContentHeight > STATE.mediaView.zoneHeight() ? layoutCalcs._mediaContentHeight : STATE.mediaView.zoneHeight()
}
totalHeight += percentToPixels(LAYOUT_MODEL.sitePaddingBottom, stage.height)
return totalHeight
} else {
return stage.height
}
}
},
setPassedSection: function(sectionId) {
passedSections.push(sectionId)
},
getPassedSection: function(sectionId) {
return passedSections.indexOf(sectionId) > -1
}
}
layoutCalcs.sectionDisplayMode = /unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior) ? 'multiple' : 'single'
function SiteService(vars) { // eslint-disable-line
var self = new ControllerProxy({events:vars.events})
function init() {
self.events.addEventListener(SITE_SERVICE_CONTACT_FORM_SUBMIT, contactFormSubmit)
self.events.addEventListener(SITE_SERVICE_SHARE_FORM_SUBMIT, shareFormSubmit)
self.events.addEventListener(SITE_SERVICE_INQUIRY_FORM_SUBMIT, inquiryFormSubmit)
self.events.addEventListener(SITE_SERVICE_GET_FILE, getFile)
self.events.addEventListener('SITE_SERVICE_PASSWORD_CHECK', sectionPasswordCheck)
}
function sectionPasswordCheck(e) {
JSONXHR({
url: '/dx/siteservice/sectionpasswordcheck',
params:e,
callback:function(response) {
if(response.status === 'pass') {
STATE.setPassedSection(response.sectionId)
}
dx.site.events.dispatchEvent('SECTION_PASSWORD_AUTH', response)
}
})
}
function contactFormSubmit(e) {
JSONXHR({
url: '/dx/siteservice/email/contact',
params:e,
callback:function(response) {
if(response.status === 'pass') {
dx.site.events.dispatchEvent(CONTACT_FORM_SENT, response)
} else {
throw new Error('contact form failed')
}
}
})
}
function shareFormSubmit(e) {
console.log('share form data:', e)
JSONXHR({
url: '/dx/siteservice/email/share',
params:e,
callback:function(response) {
if(response.status === 'pass') {
dx.site.events.dispatchEvent(SHARE_FORM_SENT, response)
} else {
throw new Error('share form failed')
}
}
})
}
function inquiryFormSubmit(e) {
JSONXHR({
url: '/dx/siteservice/email/inquiry',
params:e,
callback:function(response) {
console.log('inquiry response object', response)
if(response.status === 'pass') {
dx.site.events.dispatchEvent(INQUIRY_FORM_SENT, response)
} else {
throw new Error('inquiry form failed')
}
}
})
}
self.inquiryResponse = function(response) {
if(response.status === 'pass') {
dx.site.events.dispatchEvent(INQUIRY_FORM_SENT, response)
} else {
throw new Error('inquiry form failed')
}
}
function getFile() {
self.customJsResponse({content:FILES_MODEL.js})
}
self.customJsResponse = function(response) {
if(response.content) {
var head = document.getElementsByTagName('head')[0]
var script = document.createElement('script')
script.type = 'text/javascript'
script.id = 'customJs'
script.innerHTML = response.content.replace(/\\/g, '')
var id = document.getElementById("customJs")
if(!id) {
head.appendChild(script)
}
}
}
self.createLightbox = function(ids) {
return new Promise(function(resolve, reject) {
JSONXHR({
url: '/dx/siteservice/lightbox/create',
params:{ids:ids},
callback:function(response) {
if(response.status === 'pass') {
resolve(response)
} else {
reject(response)
}
}
})
})
}
self.updateLightbox = function(hash, ids) {
return new Promise(function(resolve, reject) {
JSONXHR({
url: '/dx/siteservice/lightbox/update',
params:{hash:hash, ids:ids},
callback:function(response) {
if(response.status === 'pass') {
resolve(response)
} else {
reject(response)
}
}
})
})
}
self.getLightboxMedia = function(hash) {
return new Promise(function(resolve, reject) {
JSONXHR({
url: '/dx/siteservice/lightbox/media',
params:{hash:hash},
callback:function(response) {
if(response.status === 'pass') {
resolve(response)
} else {
reject(response)
}
}
})
})
}
self.downloadPdf = function(ids) {
return fetch('/dx/siteservice/lightbox/pdfbuild', {
method: 'POST',
body: JSON.stringify({ids:ids}),
headers: { 'Content-Type': 'application/json' },
})
.then(function(response) {
return response.blob()
})
.catch(function(err) {
console.error('An error occured while downloading pdf file', err)
})
}
self.getPdfModel = function() {
return fetch('/dx/siteservice/pdf/model')
.then(function(response) {
return response.json()
})
.catch(function(err) {
console.error('An error occured while downloading pdf model', err)
})
}
init.call(self)
return self
}
var Address = {
//url = protocol://domain/path/?query/#fragment
url: '',
path: '',
query: '',
fragment: '',
listeners: [],
onUriChange: function() { /*console.log('no onUriChange defined')*/ },
init: function() {
this.url = window.location.pathname + window.location.search
window.onpopstate = Address.fireListeners
window.onhashchange = Address.fireListeners
setTimeout(function() {
window.history.pushState({value:Address.url}, '', Address.url)
Address.fireListeners()
}, 0)
},
fireListeners: function(e, isPassive) {
if(e && e.state && e.state.value) Address.url = e.state.value
Address.onChange(decodeURIComponent(Address.url) || '/', isPassive)
Address.onUriChange(Address.url, isPassive)
},
setValue: function(url, passive, history) {
var self = this
clearTimeout(self.setValueTimer)
self.setValueTimer = setTimeout(function() {
if(url.indexOf("http") === 0) {
window.location = url
} else {
var urlData = url.split('?')
var historyMethod = history ? 'pushState' : 'replaceState'
self.path = self.addDashes(self.trim(urlData[0]))
self.query = urlData[1] ? '?' + urlData[1] : ''
var newUrl = '/' + self.path + self.query
if(newUrl !== self.url) {
self.url = '/' + self.path + self.query
window.history[historyMethod]({value:self.url}, '', self.url)
}
self.fireListeners({}, passive)
}
if(typeof window.ga === 'function' && !isAdmin) {
ga('send', {
hitType: 'pageview',
page: window.location.pathname
})
}
}, 60)
},
back: function() {
history.back()
},
setLocation: function(value) {
window.location = value
},
setMetaDescription: function(desc) {
var metaDescTag = document.head.querySelector("meta[name='description']")
if(desc && metaDescTag) metaDescTag.setAttribute('content', desc)
},
getMetaDescription: function() {
var metaDescTag = document.head.querySelector("meta[name='description']")
return metaDescTag ? metaDescTag.content : ''
},
getQuery: function() {
return window.location.search
},
setTitle: function(title) {
document.title = title
},
getTitle: function() {
return document.title
},
getHost: function() {
return window.location.host
},
addDashes: function(str) {
return str
.replace(/ /g, '-')
.replace(/%20/g, '-')
},
trim: function(str) {
return str
.replace(/^\s+|\s+$/g, '')
.replace(/^\/|\/$/g, '')
}
}
function AddressController(vars) { // eslint-disable-line
var self = new ControllerProxy({parentView:vars.parentView, parentController:vars.parentController, events:vars.siteControllerEvents})
var section = {}
var path = ''
var assetId = 0
var mediaTitle
var mode = ''
var lastUri
var curState
var prevState = {mode:''}
var isInit = true
var savedUri
var captionManualOverride
var flickSpeed
var isMobileVideoClick
var searchSubmit = false
var queryData = {}
var isPasswordSection = false
Address.onChange = uriChange
Address.init()
self.events.addEventListener(ADDRESS_SECTION_CHANGE, filterSectionChange)
self.events.addEventListener(ADDRESS_OVERLAY_CHANGE, overlayChange)
self.events.addEventListener(ADDRESS_ASSET_CHANGE, assetChange)
self.events.addEventListener('updateAssetId', updateAssetId)
self.events.addEventListener('SECTION_PASSWORD_AUTH', sectionPasswordAuth)
self.events.addEventListener('updateSectionPassive', updateSectionPassive)
self.events.addEventListener('mediaListResponse', mediaListResponse)
self.events.addEventListener('resetUriChange', function() {
// uriChange from MediaController
uriChange("")
})
self.events.addEventListener('clearFotomotoMode', overlayChange)
function sectionPasswordAuth(response) {
self.events.dispatchEvent('passwordViewUpdate', response.status === 'pass')
setTimeout(function() {
if(STATE.getPassedSection(response.sectionId)) {
isPasswordSection = true
uriChange(savedUri)
}
}, 350)
}
function uriChange(uri, isPassive) {
parseState(uri, function() {
// if(isInit && USER_AGENT === MOBILE && hasMode('caption', mode)) {
// removeMode('caption');
// Address.setValue(buildPath());
// }
var parentSection = getParentSection(section)
if(section && section.password.length > 0 && !STATE.getPassedSection(section.id)) {
savedUri = uri;
self.events.dispatchEvent('privateGalleryAuthCheck', {section:section});
} else if(parentSection && parentSection.password.length > 0 && !STATE.getPassedSection(parentSection.id)) {
savedUri = uri;
self.events.dispatchEvent('privateGalleryAuthCheck', {section:parentSection});
} else if(section) {
savedUri = undefined
var mediaViewState = getMediaViewState(section)
var parentSection = getParentSection(section)
var state = {
section:section,
searchTags: (queryData && queryData.search && queryData.search.split(',')) || [],
sortBy: queryData && queryData.sort || 'date-asc',
parentSection:parentSection,
mediaToRender:removeLinksFromMedia(section.mediaItems),
path:path,
assetId:assetId,
asset:getMediaById(section.mediaItems[assetId]),
mode:mode,
prevState: {
section: prevState.section,
mode: prevState.mode,
assetId: prevState.assetId
},
info:{
isInit: isInit,
isSectionChange: section !== exists(prevState, 'section') || searchSubmit,
isPasswordSection: isPasswordSection,
isSearchSubmit: searchSubmit,
isParentSectionChange: parentSection !== exists(prevState, 'parentSection'),
isAssetChange: assetId !== exists(prevState, 'assetId'),
isModeChange: mode !== exists(prevState, 'mode'),
isLandingMedia: isSlideshowGallery(section),
mediaViewState: mediaViewState,
isDeepLink: isInit && uri !== '/',
isMediaViewStateChange: exists(prevState, 'info.mediaViewState') !== mediaViewState,
isIntroGallery:section.isIntroGallery,
flickSpeed: flickSpeed,
lastUri: lastUri,
isThumbsFirst: isThumbsFirst(section),
isMobileVideoClick: isMobileVideoClick,
isBlog: isBlogFeed(section.id)
}
}
self.setTitle()
self.setMetaDescription()
layoutCalcs.updateSectionState(section.key, {assetId:assetId, mode:mode})
layoutCalcs._section = state.section
layoutCalcs._uriState = state
curState = state
searchSubmit = false
isPasswordSection = false
if(isPassive) {
// dispatch passive uri change to site
self.events.dispatchEvent('ADDRESS_URI_CHANGE_PASSIVE', curState)
} else {
checkMediaModelContent()
}
deepLinkedyLink(section)
prevState = state
lastUri = uri
isInit = false
flickSpeed = undefined
isMobileVideoClick = false
}
})
}
function checkMediaModelContent() {
// #bug 728 - 6-29-15 - intro view was not being init'd when sectionMedia was false
// var media = exists(curState, "section.media") || []
// var i = media.length
// var requestMediaStr = ''
// while(i--) {
// if(Number(media[i]) > 9999 && !MEDIA_MODEL[media[i]]) requestMediaStr += media[i] + ','
// }
// console.log(requestMediaStr, curState)
// if(requestMediaStr !== '') {
// self.events.dispatchEvent('getMediaList', {ids:requestMediaStr.slice(0, -1)})
// } else {
self.events.dispatchEvent(ADDRESS_URI_CHANGE, curState)
// }
}
function mediaListResponse() {
curState.asset = getMediaById(section.mediaItems[assetId])
self.events.dispatchEvent(ADDRESS_URI_CHANGE, curState)
}
function deepLinkedyLink(s) {
var mediaItem = getMediaById(s.media[0]);
if(mediaItem.type === 'link' && !mediaItem.thumb) {
if(mediaItem.linkTarget === '_blank') {
window.open(mediaItem.content)
} else if(mediaItem.linkTarget === '_self') {
window.location.href = mediaItem.content
}
}
}
function getMediaViewState(s) {
return s.slideshow || s.label === LANDING_MEDIA ? 'landingMedia' : 'mediaView'
}
function updateAssetId(e) {
assetId = isBlogFeed(section.id) ? inverseAssetId(e.id, section.mediaItems.length - 1) : e.id
checkCaptionDefault()
Address.setValue(buildPath(), true, false)
}
var sectionPassiveTimer
function updateSectionPassive(e) {
if(e.section && section.key !== e.section.key) {
mode = e.mode
assetId = e.assetId
section = e.section
e.path = e.section.key
clearTimeout(sectionPassiveTimer)
sectionPassiveTimer = setTimeout(function() {
filterSectionChange(e, true)
// the timeout number is according to Kent's crystal ball...
// it's the number we need for updating site things
// menu item selection is what we based this time on.
// safari breaks when too many push state changes (more than 100 in 30s)
}, 60)
} else {
// console.log('updateSectionPassive no section OR section did not change', e)
}
}
function assetInSectionKey(key, asset) {
if(key.indexOf('/') > -1) {
var labels = key.split('/')
return labels[0] == asset || labels[1] == asset
} else {
return key == asset
}
}
function isInUri(uri, id) {
return uri.indexOf(id) > -1
}
function parseQuery(querystring) {
// ?search=rock climb, tessa&sort=date
return querystring.split('&')
.reduce(function(acc, keyval) {
var keyValArr = keyval.split('=')
acc[keyValArr[0]] = keyValArr[1]
return acc
}, {originalQuery:'?' + querystring})
}
function getQueryData(uri) {
var query = uri.split('?')[1]
return query ? parseQuery(query) : {}
}
function getHiddenPassMediaIds() {
return Object.keys(SECTIONS_MODEL)
.reduce(function(acc, key) {
var section = SECTIONS_MODEL[key]
return (section.password && section.password.length > 0) || !section.visible ?
acc.concat(section.media) :
acc
}, [])
}
function getVisibleGalleryMediaIds() {
return Object.keys(SECTIONS_MODEL)
.reduce(function(acc, key) {
var section = SECTIONS_MODEL[key]
return !section.password && section.visible ?
acc.concat(section.media) :
acc
}, [])
}
function parseState(uri, cb) {
var prevSearch = queryData.search
queryData = getQueryData(uri)
if(prevSearch && queryData.search && prevSearch !== queryData.search) {
searchSubmit = true
}
uri = uri.replace(/^\/|\/$/g, '').replace(queryData.originalQuery, '').split("/")
mode = isOverlayState(uri)
delete section.isIntroGallery
section = getSection(uri)
if(queryData.lightbox) {
self.service.getLightboxMedia(queryData.lightbox)
.then(function(response) {
// asyncronously get media for lightbox, do the following lines when the media ids return
STATE.cacheLightboxSection()
section.media = response.media
section.mediaItems = response.media
if(typeof cb === 'function') cb()
})
.catch(function(response) {
// lightbox section has no media
console.log('Lightbox has no content', response)
if(typeof cb === 'function') cb()
})
assetId = isAssetNumber(uri) ? isAssetNumber(uri) : 0
assetId = section && section.key && assetInSectionKey(section.key, assetId) && !isInUri(uri, assetId) ? 0 : assetId
assetId = assetId !== 0 ? assetId - 1 : assetId
if(!isAssetNumber(uri) && isThumbsFirst(section) /* #1260 && hasMode('thumbs', mode)*/) {
assetId = -1
addMode('thumbs') // #1260
}
} else {
if(queryData.search && !section.isSearch) {
queryData = {}
} else if(queryData.search && section.isSearch) {
var searchValue = queryData.search
var parseSelection = (queryData.sort && queryData.sort.split('-')) || ['date', 'asc']
var criterion = parseSelection[0]
var order = parseSelection[1]
var nonSearchableMediaIds = getHiddenPassMediaIds()
var searchableMediaIds = getVisibleGalleryMediaIds()
var mediaIds = Object.keys(MEDIA_MODEL)
.filter(function(id) {
var index = nonSearchableMediaIds.indexOf(Number(id))
return (index === -1) || (index > -1 && searchableMediaIds.indexOf(Number(id)) > -1)
})
.map(function(id) {
var mediaItem = MEDIA_MODEL[id]
mediaItem.keywords = mediaItem.keywords || []
if(Date.parse(mediaItem.dateAdded)) {
mediaItem.dateAdded = new Date(mediaItem.dateAdded).toISOString()
} else {
mediaItem.dateAdded = new Date().toISOString()
}
return mediaItem
})
.filter(function(mediaItem) {
var searchableItems = (SETTINGS_MODEL.searchCaptions || SETTINGS_MODEL.searchLabels || mediaItem.keywords.length) && /image|video/.test(mediaItem.type)
return ((SETTINGS_MODEL.globalMediaSearch && mediaItem.searchable !== false) || (!SETTINGS_MODEL.globalMediaSearch && mediaItem.searchable)) && searchableItems
})
.filter(function(mediaItem) {
var reInput = searchValue
.split(',')
.map(function(word) {
return '\\b' + word.replace(/\s+/g, '.*')
})
.join('|')
var re = new RegExp(reInput, 'gi')
var captionsResult = SETTINGS_MODEL.searchCaptions && re.test(mediaItem.caption)
var labelResult = SETTINGS_MODEL.searchLabels && re.test(mediaItem.label)
var keywordsResult = mediaItem.keywords.reduce(function(acc, keyword) {
return acc ? acc : re.test(keyword)
}, false)
return keywordsResult || captionsResult || labelResult
})
.sort(function(a,b) {
var aCriterion = criterion === 'size' ? a.size.bytes : a[criterion]
var bCriterion = criterion === 'size' ? b.size.bytes : b[criterion]
if(aCriterion > bCriterion) return 1;
if(aCriterion < bCriterion) return -1;
return 0;
})
.map(function(mediaItem) {
return mediaItem.id
})
if(order === 'dsc') {
mediaIds.reverse();
}
section.media = mediaIds
section.mediaItems = mediaIds
console.log('address controller section', section)
}
if(isBlogFeed(section.id)) {
// inversing section media assetIds
assetId = isAssetNumber(uri) ? isAssetNumber(uri) : section.mediaItems.length
assetId = inverseAssetId(assetId - 1, section.mediaItems.length)
} else {
assetId = isAssetNumber(uri) ? isAssetNumber(uri) : 0
}
assetId = section && section.key && assetInSectionKey(section.key, assetId) && !isInUri(uri, assetId) ? 0 : assetId
assetId = assetId !== 0 ? assetId - 1 : assetId
if(!isAssetNumber(uri) && isThumbsFirst(section) /* #1260 && hasMode('thumbs', mode)*/) {
assetId = -1
addMode('thumbs') // #1260
}
if(typeof cb === 'function') cb()
}
}
function showLandingMedia() {
if(USER_AGENT === MOBILE) {
return STATE.backgroundImages.length && (LAYOUT_MODEL.landingMediaMobile === undefined || LAYOUT_MODEL.landingMediaMobile)
} else {
return STATE.backgroundImages.length
}
}
function getSection(uri) {
path = dashCheck(uri)
if(path) {
section = SECTIONS_MODEL[path]
STATE.section(section)
return section
} else if(showLandingMedia()) {
var bgImgs = STATE.backgroundImages.filter(function(id) {
return !!MEDIA_MODEL[id]
})
section = {
id:LANDING_MEDIA,
key:LANDING_MEDIA,
label:LANDING_MEDIA,
media:bgImgs,
mediaItems:bgImgs,
overrides:{captionDefault:LAYOUT_MODEL.slideshowCaptions},
password:'',
thumb:{},
visible:true
}
STATE.section(section)
checkCaptionDefault()
return section
} else {
getFirstMediaItem()
if(!path) return false /*no valid sections found*/
assetId = 0
section = SECTIONS_MODEL[path]
section.isIntroGallery = true
STATE.section(section)
checkCaptionDefault()
checkThumbsDefaultOn(section)
return section
}
}
function isGetSection(uri) {
path = dashCheck(uri)
if(path) {
section = SECTIONS_MODEL[path]
STATE.section(section)
return section
}
return false
}
function dashCheck(uri) {
var tests = [
uri[0] + '/' + uri[1],
uri[0]
]
var length = tests.length
if(length > 0) {
var i = 0
for(; i < length; i++) {
var dashes = getSectionByUrl(addDashes(tests[i]));
if(SECTIONS_MODEL[dashes]) {
return dashes
}
}
}
return false
}
function getSectionByUrl(url) {
return Object.keys(SECTIONS_MODEL)
.filter(function(key) {
return addDashes(key) === url
})[0]
}
function getFirstMediaItem() {
var firstSection = getFirstValidSub(SECTIONS_MODEL['ROOT_SECTION'])
var firstSub = getFirstValidSub(firstSection)
if(firstSection.isIndex) {
path = firstSection.label
addMode('thumbs')
} else if(firstSub) {
path = firstSection.label + "/" + firstSub.label
checkThumbsDefaultOn(firstSub)
} else {
path = firstSection.label
checkThumbsDefaultOn(firstSection)
}
}
function checkThumbsDefaultOn(s) {
if(!isSlideshowGallery(s) && STATE.overrides.thumbnailType !== 'none' && (STATE.overrides.thumbnailDefaultOn || isIndexSection(s))) {
if(s && s.media && s.media.length > 1) {
addMode('thumbs')
}
} else {
removeMode('thumbs')
}
}
function checkCaptionDefault() {
if(USER_AGENT !== MOBILE && section && (assetId > -1 || section.isSearch)) {
var asset = getMediaById(section.mediaItems[assetId])
if(!asset) asset = {overrides:{}}
var captionDefault = firstValid(asset.overrides.captionDefault, STATE.overrides.captionDefault)
if(USER_AGENT === MOBILE) captionDefault = false
if(captionManualOverride === 'caption') {
addMode('caption')
} else if(captionManualOverride === '') {
removeMode('caption')
} else if(captionDefault) {
addMode('caption')
} else {
removeMode('caption')
}
hideCaptionOnThumbsGrid()
}
}
function removeSectionKeyFromUri(uriStr) {
var sectionKey = dashCheck(uriStr.split('/'))
return sectionKey ? addDashes(uriStr).replace(addDashes(sectionKey), '') : uriStr
}
function isAssetNumber(uri) {
var strippedPath = stripLocalDomain(uri.join('/'))
var remainingPath = removeSectionKeyFromUri(strippedPath)
var num = remainingPath.split('/')[1]
return !isNaN(num) ? Number(num) : false
}
function isOverlayState(uri) {
var overlay = /thumbs|^share$|^inquiry$|caption|^fotomoto$/
if(overlay.test(uri[3])) {
return uri[3]
} else if(overlay.test(uri[2])) {
return uri[2]
} else if(overlay.test(uri[1])) {
return uri[1]
}
return ''
}
function formatEmail(str) {
return "mailTo:" + str.replace("mailto:", "").replace("mailTo:", "")
}
function getEmail(e) {
var isEmail = /[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+\.[a-zA-Z]{2,4}/g.test(e.path)
return isEmail ? function() {
window.location.href = formatEmail(e.path)
} : false
}
function getSocialPopup(e) {
return (e.label === '[one]' || e.label === '[like]') ? function() {
self.events.dispatchEvent(POP_UP, e)
} : false
}
function getNewWindow(e) {
return e.linkTarget === '_blank' ? function() {
window.open(e.path)
} : false
}
function getNewLocation(e) {
return !internalLink(e) && e.linkTarget === '_self' && e.type === 'external' ? function() {
window.location.href = e.path
} : false
}
function buildPath() {
var strippedPath = stripLocalDomain(path)
var newPath = strippedPath
var queryStr = queryData.originalQuery
if(section && !isCustomPath(path)) {
var newSection = getSectionFromPath(newPath)
if(newSection) {
newPath = (newSection && newSection.key) || ''
newPath = '/' + newPath + '/'
var assetFromPath = isAssetNumber(strippedPath.split('/'))
if(assetFromPath && assetId > -1) {
assetId = assetFromPath - 1
}
if(assetId > -1) {
newPath += (Number(assetId) + 1) + '/';
}
if(mode.length > 0) {
newPath += mode + '/';
}
} else {
newPath = '/'
}
}
if(newSection && newSection.key === 'landingMedia') newPath = '/'
return queryStr ? newPath + queryStr : newPath;
}
function isCustomPath(strPath) {
return /^(ht|f)tp(s?):\/\//.test(strPath)
}
function stripLocalDomain(url) {
var domain = window.location.protocol + '//' + window.location.host
return typeof url === 'string' ? url.replace(domain, '').replace(/^\/|\/$/g, '') : ''
}
function internalLink(e) {
if(e.path) {
if(isGetSection(e.path.split("/"))) {
e.section = isGetSection(e.path.split("/"))
e.type = 'internal'
return true
} else {
e.path = stripLocalDomain(e.path)
e.section = getSectionFromPath(e.path)
e.type = 'internal'
return true
}
}
return false
}
function setThumbsMode(e) {
if(e.section && !isSlideshowGallery(e.section)) {
if(!e.isThumbClick && isIndexSection(e.section)) {
addMode('thumbs')
} else if(STATE.overrides.thumbnailType === 'none') {
removeMode('thumbs')
} else if((e.section.isSearch || e.section.mediaItems.length > 1) && STATE.overrides.thumbnailDefaultOn && !e.isThumbClick) {
addMode('thumbs')
} else if(e.section.mediaItems.length > 1 && e.isThumbClick && STATE.overrides.thumbnailType === 'strip' && STATE.overrides.thumbnailDefaultOn && STATE.overrides.thumbnailDock === 'displace') {
addMode('thumbs')
}
if(e.nothumbs) removeMode('thumbs')
if(!e.isThumbClick && isThumbsFirst(e.section) && assetId === 0 && hasMode('thumbs', mode)) {
assetId = -1
}
}
}
function getSectionFromPath(strPath) {
var pathArr = strPath.split("/")
var _section = pathArr[0]
var subSection
if(pathArr[0] && pathArr[1]) subSection = pathArr[0] + '/' + pathArr[1]
if(subSection) return getSection(subSection.split('/'))
if(_section) return getSection(_section.split('/'))
return false
}
function filterSectionChange(e, passive) {
action = getSocialPopup(e) ||
getEmail(e) ||
getNewWindow(e) ||
getNewLocation(e) ||
sectionChange(e, passive)
action()
}
function sectionChange(e, isPassive) {
if(e.section) {
STATE.section(e.section)
section = e.section
if(!section.isSearch) queryData = {}
searchSubmit = e.searchSubmit
} else if(!e.section && !e.path) {
// go to root if no section & no path
parseState('')
STATE.section(section)
}
path = e.path
// var querystring = e.path.split('?')[1]
if(e.section && isBlogFeed(e.section.id)) {
assetId = firstValid(e.assetId, e.section.mediaItems.length - 1)
} else {
assetId = e.assetId || 0
}
mode = e.mode
isMobileVideoClick = !!e.isMobileVideoClick
if(!isPassive) setThumbsMode(e)
checkCaptionDefault()
removeMode('inquiry')
removeMode('share')
return function() {
var newPath
if(e.section && e.section.isSearch && e.searchTerm) {
queryData = {}
newPath = buildPath() + '?search=' + e.searchTerm
if(e.section.sortBy) newPath += '&sort=' + (e.section.sortBy || 'date-asc')
} else if(e.section && e.section.isLightbox && STATE.lightboxHash) {
newPath = buildPath() + '?lightbox=' + STATE.lightboxHash
} else {
queryData = getQueryData(path)
searchSubmit = e.section && e.section.isSearch && queryData.search
newPath = buildPath() //querystring ? buildPath() + '?' + querystring : buildPath()
}
Address.setValue(newPath, isPassive, !isPassive)
}
}
function overlayChange(e) {
toggleOverlayState(e)
hideCaptionOnThumbsGrid()
Address.setValue(buildPath())
}
function hideCaptionOnThumbsGrid() {
if(hasMode('thumbs', mode) && /fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType)) {
removeMode('caption')
}
}
function assetChange(e) {
var lastMediaIdx = removeLinksFromMedia(section.mediaItems).length - 1
if(isBlogFeed(section.id)) {
// inversing section media assetIds - this was bad - touch at your own risk
assetId = inverseAssetId(assetId, lastMediaIdx)
}
if(isBlogFeed(section.id)) {
if(e.navDir === 'next') {
assetId = assetId > 0 ? assetId - 1 : 0
} else if(e.navDir === 'prev') {
assetId = assetId < lastMediaIdx ? assetId + 1 : lastMediaIdx
}
} else if(e.navDir === 'prev') {
assetId = assetId > 0 ? assetId - 1 : 0
} else if(e.navDir === 'next') {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
assetId = assetId < lastMediaIdx ? assetId + 1 : lastMediaIdx
} else {
assetId = assetId < lastMediaIdx ? assetId + 1 : 0
}
}
checkCaptionDefault()
removeMode('inquiry')
removeMode('share')
flickSpeed = e.flickSpeed
var origQuery = queryData.originalQuery || ''
Address.setValue(buildPath())
}
function addMode(value) {
removeMode('share')
removeMode('inquiry')
if(!hasMode(value, mode)) {
mode = mode ? mode + '-' + value : value
}
}
function removeMode(value) {
mode = mode ? mode.replace(value, '')
.replace(/^-|-$/g, '')
.replace(/(--)/g, '-') : ''
}
function toggleOverlayState(value) {
if(hasMode(value, mode)) {
if(value === 'caption') captionManualOverride = ''
removeMode(value)
} else {
if(value === 'caption') captionManualOverride = 'caption'
addMode(value)
}
}
/*
* From dx-cloud / html.js
* issue #1554
* browser title not updating in frontend the same as html output
*
function getTitle(model, page) {
if(model.settings.advancedSeo && page.title == '' || page.path === '/') {
return model.settings.browserTitle
} else if(model.settings.advancedSeo && page.title != '' && page.path !== '/') {
return page.title
} else if(page.title != '' && page.path !== '/' && !model.settings.globalBrowserTitle) {
if(page.title === model.settings.browserTitle || model.settings.browserTitle === '') {
return page.title
} else {
return page.title + ' | ' + model.settings.browserTitle
}
} else {
if(page.title != '' && page.path !== '/' && page.path.indexOf('/') > -1) {
var path = page.path.split('/')
var pathLength = path.length
var galleryNameIndex = 2
if(/thumbs|caption|inquiry|email/.test(path[pathLength - 1])){
var galleryNameIndex = pathLength - 4 > 0 ? pathLength - 4 : 3
}
var galleryName = path[pathLength - galleryNameIndex]
if(galleryName) {
var title = galleryName.replace('/', ' | ') + " | " + page.assetId
return model.settings.browserTitle + " | " + title
}
return model.settings.browserTitle
} else {
return getLogoText(model)
}
}
}
*/
self.setMetaDescription = function() {
var media = section.mediaItems
if(media && media.length) {
var mediaItem = MEDIA_MODEL[media[assetId]] || {}
var metaThumb = { title:'', desc:'' }
if(section.thumb) {
metaThumb.title = section.thumb.metaTitle
metaThumb.desc = section.thumb.metaDesc
}
var desc = path ?
mediaItem.caption || section.metaDesc || metaThumb.desc || SETTINGS_MODEL.metaDescription :
SETTINGS_MODEL.metaDescription
Address.setMetaDescription(desc)
}
}
self.setTitle = function() {
var media = section.mediaItems
if(media && media.length) {
var mediaItem = MEDIA_MODEL[media[assetId]]
if(hasMode('thumbs', mode) && assetId === -1 && section.thumb && section.thumb.metaTitle) {
Address.setTitle(decodeURIComponent(section.thumb.metaTitle))
} else if(SETTINGS_MODEL.advancedSeo && section.id === LANDING_MEDIA) {
Address.setTitle(decodeURIComponent(SETTINGS_MODEL.browserTitle))
} else if(SETTINGS_MODEL.advancedSeo && section.id !== LANDING_MEDIA && mediaItem && mediaItem.label) {
Address.setTitle(mediaItem.label)
} else if(mediaItem && mediaItem.label && section.id !== LANDING_MEDIA && !SETTINGS_MODEL.globalBrowserTitle) {
if(mediaItem.label === SETTINGS_MODEL.browserTitle) {
Address.setTitle(mediaItem.label)
} else {
Address.setTitle(mediaItem.label + ' | ' + decodeURIComponent(SETTINGS_MODEL.browserTitle))
}
} else {
if(mediaItem && mediaItem.label && section.id !== LANDING_MEDIA) {
var fullpath = path.split('/')
mediaTitle = " | " + fullpath[fullpath.length - 1] + " | " + (assetId + 1)
} else {
mediaTitle = ''
}
Address.setTitle(decodeURIComponent(SETTINGS_MODEL.browserTitle) + mediaTitle)
}
}
}
return self
}
function FooterController(vars) {
var self = new ControllerProxy({parentView:vars.parentView, parentController:vars.parentController, events:vars.siteControllerEvents});
self.updateSpeed = 0;
self.footerView = new vars.FooterView(vars);
self.footerView.alpha = 0;
self.parentView.addChild(self.footerView);
self.events.addEventListener(LAYOUT_MODEL_CHANGE, modelChange);
self.events.addEventListener(MEDIA_MODEL_CHANGE, modelChange);
self.events.addEventListener(SETTINGS_MODEL_CHANGE, modelChange);
self.events.addEventListener(RESIZE_END, self.footerView.updatePosition);
self.events.addEventListener(MENU_DOCK_CLOSE, menuDockClose);
self.events.addEventListener(MENU_DOCK_OPEN, menuDockOpen);
self.events.addEventListener(SITE_URI_CHANGE, function() {
self.footerView.updateSpeed = 0
self.footerView.updatePosition()
});
self.events.addEventListener('UPDATE_CONTENT_HEIGHT', function() {
self.footerView.updateSpeed = 0
self.footerView.updatePosition()
});
self.events.addEventListener('mediaOverlayClose', function() {
self.footerView.updateSpeed = 0
self.footerView.updatePosition()
})
self.footerView.addEventListener(FOOTER_CLICK, clickListener);
function clickListener(e) {
var navEvent = {
type: e.type === 'link' ? 'external' : 'internal',
path: e.content,
linkTarget: e.linkTarget,
label: e.label
};
if(navEvent.path) self.events.dispatchEvent(FOOTER_CLICK, navEvent);
}
function modelChange(e) {
if(e) {
if(/copyright|social|layoutmodel|copyrightoffset|footerkerning|footericon|footerblendmode/i.test(e.id)) {
self.footerView.updateStyle(e);
self.footerView.updatePosition(e);
} else if(e.filters && e.filters.indexOf('Footer Links') > -1) {
self.footerView.updateStyle(e);
self.footerView.updatePosition(e);
}
}
}
function menuDockClose() {
if(USER_AGENT === MOBILE) {
self.footerView.hide();
}
}
function menuDockOpen() {
self.footerView.show();
}
return self;
}
function FooterView(vars) {
var textGroup
var iconGroup
var self = new ViewProxy({events:vars.events})
self.zIndex = STATE.footerView.zIndex()
self.updateSpeed = 0
self.alpha = 0
self.x = 0
//self.y = 0
/*
* setting initial y value based on copyrightAlignVertical
* for issue when there is an intro and the footer is displayed
* then transitioned into location
*/
switch(LAYOUT_MODEL.copyrightAlignVertical) {
case 'top':
self.y = 0
break
case 'center':
self.y = window.innerHeight * 0.5
break
case 'bottom':
self.y = window.innerHeight
break
}
var hasInitialized = false
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
self.position = 'absolute'
} else {
self.position = LAYOUT_MODEL.copyrightPositionFixed ? 'fixed' : 'absolute'
}
self.element.setAttribute('class', 'footerview')
var tile,
footerBtns
/*
* thinking this is deprecated due to fullscreen os buttons
*
self.events.addEventListener('fillSiteMode', setSafariHack)
self.events.addEventListener('nonFillSiteMode', removeSafariHack)
function setSafariHack(e) {
if(BROWSER_NAME === 'Safari') self.translateZ = 0
}
function removeSafariHack(e) {
if(BROWSER_NAME === 'Safari') {
self.style['-webkit-transform'] = 'none'
self.style['-ms-transform'] = 'none'
self.style['transform'] = 'none'
}
}
*/
self.addEventListener(CHILD_ADDED, function(child) {
setTimeout(function() {
}, 1200)
})
self.updateStyle = function(e) {
self.text = ''
self.children = []
buildLinks()
self.updatePosition()
var blendMode = (USER_AGENT === MOBILE || USER_AGENT === TABLET || !LAYOUT_MODEL.footerBlendMode) ? 'normal' : LAYOUT_MODEL.footerBlendMode
self.element.style['mix-blend-mode'] = blendMode
}
function getFooterPositionDelay() {
// if unifiedPageScroll and not fixed then delay
// else 0
// 01/31/2023 -- not even sure if this 2000ms delay is still needed, but trying to isolate it more
return STATE.siteView.unifiedPageScroll() && !LAYOUT_MODEL.copyrightPositionFixed && STATE.footerView.zIndex > STATE.introView.zIndex ? 2000 : 0
}
self.updatePosition = function(e) {
self.zIndex = STATE.footerView.zIndex();
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
self.position = 'absolute'
} else {
self.position = LAYOUT_MODEL.copyrightPositionFixed ? 'fixed' : 'absolute'
}
if(USER_AGENT !== MOBILE) {
setTimeout(function() {
// delay added due to max scroll site height
self.x = layoutCalcs.footerView.x(self.width)
self.y = layoutCalcs.footerView.y(self.height)
Tween(self, UPDATE_SPEED, {alpha:1})
}, getFooterPositionDelay())
}
self.element.style.transform = 'rotate(' + (LAYOUT_MODEL.copyrightRotation || 0) + 'deg)'
}
self.hide = function() {
Tween(self, UPDATE_SPEED, {alpha:0, onComplete:function() {
if(self.alpha === 0) self.display = 'none'
}})
}
self.show = function() {
self.display = 'block'
self.updateStyle()
Tween(self, UPDATE_SPEED, {alpha:1})
}
function buildLinks() {
if(STATE.copyright !== '') {
footerBtns = [STATE.copyright].concat(csvToArray(STATE.socialLinks))
} else {
footerBtns = csvToArray(STATE.socialLinks)
}
var i = 0,
length = footerBtns.length,
axis = USER_AGENT === MOBILE ? 'y' : 'x'
iconGroup = new FooterTileGroup('x')
textGroup = new FooterTileGroup(axis)
self.addChild(textGroup)
self.addChild(iconGroup)
for(;i 0) layoutBtns()
}
function isCustomIcon(mediaItem) {
return /src=/.test(mediaItem.label)
}
function isSocialIcon(mediaItem) {
return !!socialIcons[mediaItem.label.toLowerCase()]
}
function parseIconPath(str) {
return str.replace(' ', '').split('=')[1].replace(']', '')
}
function parseIconData(str) {
str = str.replace(/\[|\]|\s+/g, '')
var src = ''
var width = 20
var height = 20
if(str.indexOf(',') > -1) {
// has size info probably
var parts = str.split(',')
src = parts[0].split('=')[1]
var size = parts[1].split('x')
width = Number(size[0].split('=')[1])
height = Number(size[1])
} else {
// default to 20x20 size
src = str.split('=')[1]
}
return {
path: src,
width: width,
height: height
}
}
function loadCustomIcon(mediaItem) {
var iconData = parseIconData(mediaItem.label)
var icon = new Bitmap()
icon.src = SETTINGS_MODEL.cdnSslUri + '/' + iconData.path
icon.width = iconData.width
icon.height = iconData.height
//icon.style.padding = '2px 0'
icon.element.style.cursor = 'pointer'
icon.customLabel = mediaItem.label.toLowerCase()
return icon
}
function loadSocialIcon(mediaItem, width, height) {
var socialIcon = socialIcons[mediaItem.label.toLowerCase()]
var icon = new vars.Bitmap()
icon.src = ICONS + socialIcon.filename
icon.width = socialIcon.width
icon.height = socialIcon.height
icon.element.style.cursor = 'pointer'
icon.addEventListener(LOAD, iconLoaded)
return icon
}
function getIconPath(socialIcon) {
switch(LAYOUT_MODEL.footerIconShape) {
case 'standard':
return socialIcon.svgStdPath
case 'rectangle':
return socialIcon.svgRectPath
case 'circle':
return socialIcon.svgCircPath
}
}
function createVectorIcon(mediaItem) {
var socialIcon = socialIcons[mediaItem.label.toLowerCase()]
var icon = new Svg()
var group = new Svg({type:'g'})
var path = new Path()
var scale = USER_AGENT === TABLET || USER_AGENT === MOBILE ? 1 : LAYOUT_MODEL.footerIconScale
group.scale = scale
if(/circle|rectangle/.test(LAYOUT_MODEL.footerIconShape)) {
var bg = new Rect()
bg.rx = LAYOUT_MODEL.footerIconShape === 'circle' ? socialIcon.bgCircRadius : socialIcon.bgRectRadius
bg.width = socialIcon.width
bg.height = socialIcon.height
bg.fill = LAYOUT_MODEL.footerIconColor
group.addChild(bg)
}
path.d = getIconPath(socialIcon)
path.fill = LAYOUT_MODEL.footerIconShape === 'standard' ? LAYOUT_MODEL.footerIconColor : LAYOUT_MODEL.footerIconBgColor
path.fillRule = 'evenodd'
group.addChild(path)
icon.addChild(group)
icon.width = socialIcon.width * scale
icon.height = socialIcon.height * scale
icon.element.style.cursor = 'pointer'
icon.socialLabel = mediaItem.label.toLowerCase()
return icon
}
function iconLoaded(e) {
layoutBtns()
self.updatePosition()
}
function isValidSocialIcon(item) {
var mediaItem = getMediaById(item)
return item && mediaItem && mediaItem.label && socialIcons[mediaItem.label.toLowerCase()] && !isNaN(item)
}
function buildLabel(name) {
var tester = document.createElement('span')
var fontData = getFontData(LAYOUT_MODEL.copyrightFont)
tester.style.position = 'absolute'
tester.style.display = 'block'
if(USER_AGENT === MOBILE) tester.style.width = stage.width - 12 + 'px'
tester.style.fontFamily = fontData.family
tester.style.textTransform = LAYOUT_MODEL.copyrightTextTransform || 'none'
tester.style.fontWeight = fontData.weight
tester.style.fontSize = LAYOUT_MODEL.copyrightFontSize.toString().replace('px', '') + 'px'
tester.style.letterSpacing = LAYOUT_MODEL.footerKerning + 'px'
tester.innerHTML = name
tester.whiteSpace = USER_AGENT === MOBILE ? 'normal' : 'nowrap'
document.body.appendChild(tester)
var label = new vars.Sprite()
label.fontFamily = LAYOUT_MODEL.copyrightFont
label.textTransform = LAYOUT_MODEL.copyrightTextTransform || 'none'
label.fontSize = LAYOUT_MODEL.copyrightFontSize.toString().replace('px', '') + 'px'
label.fontColor = LAYOUT_MODEL.copyrightColor
label.letterSpacing = LAYOUT_MODEL.footerKerning
label.text = name
label.width = tester.offsetWidth
label.height = tester.offsetHeight
label.textWrap = USER_AGENT === MOBILE
// label.element.style.cursor = 'pointer'
document.body.removeChild(tester)
tester = null
return label
}
function over(e) {
if(this.btn.txt) {
Tween(this.btn.txt, UPDATE_SPEED, {fontColor: toRgba(LAYOUT_MODEL.copyrightColor, 0.5)})
} else {
Tween(this.btn, UPDATE_SPEED, {alpha: 0.5})
}
}
function out(e) {
if(this.btn.txt) {
Tween(this.btn.txt, UPDATE_SPEED, {fontColor: toRgba(LAYOUT_MODEL.copyrightColor, 1)})
} else {
Tween(this.btn, UPDATE_SPEED, {alpha: 1})
}
}
function layoutBtns() {
var groups = self.children,
i,
length = groups.length
textGroup.layoutContent()
iconGroup.layoutContent()
tile = new Tile()
tile.gap = 0
tile.axis = USER_AGENT === MOBILE ? 'y' : 'x'
tile.align = 'left'
tile.wrap = false
if(tile.axis === 'x') {
tile.perpLength = stage.height
} else {
tile.perpLength = stage.width
}
for(i = 0; i < length; i++) {
tile.addItem(groups[i].width, groups[i].height)
}
tile.layoutItems()
for(i = 0; i < length; i++) {
var position = tile.getPosition(i)
groups[i].x = position.x
groups[i].y = position.y
}
// if(iconGroup.children.length > 0 && USER_AGENT !== MOBILE) {
// textGroup.y = iconGroup.height - textGroup.height
// }
var bounds = tile.getBounds()
textGroup.y = (bounds.height - textGroup.height) * 0.5
iconGroup.y = (bounds.height - iconGroup.height) * 0.5
self.transition = 0
self.width = bounds.width
self.height = bounds.height
}
function FooterTileGroup(axis) {
var me = new Sprite()
me.layoutContent = function() {
var t = new Tile()
t.gap = 6
t.axis = axis
t.align = 'left'
t.wrap = false
t.perpLength = 150
var i = 0,
panels = me.children,
length = panels.length
for(; i < length; i++) {
t.addItem(panels[i].width, panels[i].height)
}
if(length) t.layoutItems()
for(i = 0; i < length; i++) {
var position = t.getPosition(i)
panels[i].y = position.y
panels[i].x = position.x
}
var bounds = t.getBounds()
me.width = bounds.width
me.height = bounds.height
}
return me
}
return self
}
function LogoController(vars) {
var self = new ControllerProxy({parentView:vars.parentView, parentController:vars.parentController, events:vars.siteControllerEvents});
self.updateSpeed = 0;
self.logoView = new vars.LogoView({parentView:self.parentView, parentController:self, events:vars.siteControllerEvents});
self.logoView.alpha = 0;
self.events.addEventListener('LOGO_CHILD_ADDED', show);
if(USER_AGENT === MOBILE) {
// Mobile
if(/thumbs|site/.test(LAYOUT_MODEL.mobileLogoPlacement)) {
// thumbs or site
self.parentView.addChild(self.logoView);
} else {
// menu
vars.menuController.menuView.mask.addChild(self.logoView);
}
} else {
// Desktop and Tablet
if(LAYOUT_MODEL.logoPlacement === 'menu') {
// menu
vars.menuController.menuView.addChild(self.logoView);
} else {
// site
self.parentView.addChild(self.logoView);
}
}
// if(USER_AGENT === MOBILE) {
// vars.menuController.menuView.mask.addChild(self.logoView);
// } else if(LAYOUT_MODEL.logoPlacement === 'menu') {
// vars.menuController.menuView.addChild(self.logoView);
// } else {
// self.parentView.addChild(self.logoView);
// }
self.events.addEventListener(SETTINGS_MODEL_CHANGE, function(e) {
if(/intro|logo/i.test(e.id)) {
// allow these value updates because they are moving to the SETTINGS_MODEL
self.logoView.updateStyle(e);
self.logoView.updatePosition(e);
}
});
self.events.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
self.events.addEventListener(RESIZE_END, self.logoView.updatePosition);
self.events.addEventListener(SITE_URI_CHANGE, self.logoView.updatePosition)
self.events.addEventListener(MENU_DOCK_CLOSE, menuDockClose);
self.events.addEventListener(MENU_DOCK_OPEN, menuDockOpen);
self.logoView.addEventListener(CLICK, click);
if(USER_AGENT !== MOBILE && USER_AGENT !== TABLET) {
self.logoView.addEventListener(MOUSE_OVER, over);
self.logoView.addEventListener(MOUSE_OUT, out);
}
function layoutModelChange(e) {
if(e.id === 'logoPlacement') {
// to allow live admin layout change for menu placement
// remove from SiteView then add to MenuView or vice versa
if(e.value === 'menu') {
self.parentView.removeChild(self.logoView);
vars.menuController.menuView.addContent(self.logoView);
} else {
vars.menuController.menuView.removeContent(self.logoView);
self.parentView.addChild(self.logoView);
}
}
// exclude these updates because they are moving to the SETTINGS_MODEL
if(!/^logoText$|^logoHtml$|^logoFile$|^mobileLogoFile$|^tabletLogoFile$/.test(e.id)) {
self.logoView.updateStyle(e);
self.logoView.updatePosition(e);
}
}
function over(e) {
if(this.txt && this.txt.text.indexOf(' -1) {
/*html content*/
} else {
if(this.txt) {
Tween(this.txt, UPDATE_SPEED, {ease:'ease-out', fontColor: toRgba(LAYOUT_MODEL.logoFontColor, 0.5)});
} else {
Tween(this, UPDATE_SPEED, {ease:'ease-out', alpha: 0.5});
}
}
}
function out(e) {
if(this.txt && this.txt.text.indexOf(' -1) {
/*html content*/
} else {
if(this.txt) {
Tween(this.txt, UPDATE_SPEED, {fontColor: toRgba(LAYOUT_MODEL.logoFontColor, 1)});
} else {
Tween(this, UPDATE_SPEED, {alpha: 1});
}
}
}
function menuDockClose() {
if(USER_AGENT !== MOBILE && USER_AGENT !== TABLET) {
hide();
}
}
function menuDockOpen() {
show();
}
function hide() {
self.logoView.style.pointerEvents = 'none';
Tween(self.logoView, UPDATE_SPEED, {alpha:0, display:'none'});
}
function show() {
self.logoView.updatePosition()
self.logoView.display = 'block';
Tween.defer(self.logoView, UPDATE_SPEED, {alpha:1, onComplete:function(){
self.logoView.style.pointerEvents = 'auto';
}});
}
function click(e) {
if(this.txt && this.txt.text.indexOf(' -1) {
/*html content*/
} else {
var navEvent = {
type:'internal',
path:'',
target:'_self'
};
self.events.dispatchEvent(LOGO_CLICK, navEvent);
if(LAYOUT_MODEL.globalSmoothScroll) {
// scroll to top of site on logo click if global smooth scroll
var anim = Anim.to(window, UPDATE_SPEED, {scrollY:0, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic'})
}
}
}
self.show = show
self.hide = hide
return self;
}
function LogoView(vars) {
var self = new ViewProxy({events:vars.events});
var src;
var savedSrc;
var originalWidth
var originalHeight
var logoLoaded
if(USER_AGENT === MOBILE) {
self.textWrap = true;
} else {
self.textWrap = false;
}
self.zIndex = STATE.overrides.logoViewZIndex;
// self.x = 0
// self.y = 0
function setLogoPositionType() {
// if(isPod() || isPad()) {
// self.position = /site|thumbs/.test(LAYOUT_MODEL.mobileLogoPlacement) ? 'fixed' : 'absolute'
// } else {
// self.position = LAYOUT_MODEL.logoPositionFixed ? 'fixed' : 'absolute'
// }
if(USER_AGENT !== MOBILE && USER_AGENT !== TABLET) self.position = LAYOUT_MODEL.logoPositionFixed ? 'fixed' : 'absolute'
}
setLogoPositionType()
self.updateSpeed = 0;
self.style.pointerEvents = 'none'
self.element.addEventListener('contextmenu', disable);
self.element.addEventListener('dragstart', disable);
self.element.setAttribute('data-identity', 'logo')
function disable(e) {
var disableRightClick = SETTINGS_MODEL.disableRightClick === undefined || SETTINGS_MODEL.disableRightClick
if(disableRightClick) {
e.preventDefault();
}
}
/*
* thinking this is deprecated due to fullscreen os buttons
*
self.events.addEventListener('fillSiteMode', setSafariHack);
self.events.addEventListener('nonFillSiteMode', removeSafariHack);
function setSafariHack(e) {
if(BROWSER_NAME === 'Safari') self.translateZ = 0;
}
function removeSafariHack(e) {
if(BROWSER_NAME === 'Safari') {
self.style['-webkit-transform'] = 'none';
self.style['-ms-transform'] = 'none';
self.style['transform'] = 'none';
}
}
*/
self.addEventListener(CHILD_ADDED, function(child) {
self.updatePosition();
setTimeout(function(){
self.updatePosition();
self.updateSpeed = UPDATE_SPEED;
self.events.dispatchEvent('LOGO_CHILD_ADDED');
}, 500);
});
self.addEventListener(MOUSE_OVER, overLogo);
function overLogo(e) {
self.events.dispatchEvent('OVER_LOGO');
}
function getLogoFontSize() {
if(isPod()) {
return firstValid(LAYOUT_MODEL.mobileLogoFontSize, LAYOUT_MODEL.logoFontSize)
} else if(isPad()) {
return firstValid(LAYOUT_MODEL.tabletLogoFontSize, LAYOUT_MODEL.logoFontSize)
}
return LAYOUT_MODEL.logoFontSize
}
function getLogoFontColor() {
if(isPod()) {
return firstValid(LAYOUT_MODEL.mobileLogoFontColor, LAYOUT_MODEL.logoFontColor)
} else if(isPad()) {
return firstValid(LAYOUT_MODEL.tabletLogoFontColor, LAYOUT_MODEL.logoFontColor)
}
return LAYOUT_MODEL.logoFontColor
}
function getLogoFont() {
if(isPod()) {
return firstValid(LAYOUT_MODEL.mobileLogoFont, LAYOUT_MODEL.logoFont)
} else if(isPad()) {
return firstValid(LAYOUT_MODEL.tabletLogoFont, LAYOUT_MODEL.logoFont)
}
return LAYOUT_MODEL.logoFont
}
function getLogoKerning() {
if(isPod()) {
return firstValid(LAYOUT_MODEL.mobileLogoKerning, LAYOUT_MODEL.logoKerning)
} else if(isPad()) {
return firstValid(LAYOUT_MODEL.tabletLogoKerning, LAYOUT_MODEL.logoKerning)
}
return LAYOUT_MODEL.logoKerning
}
self.updatePosition = function(e) {
self.zIndex = STATE.overrides.logoViewZIndex;
setLogoPositionType()
self.transition = 0;
if(self.txt) {
if(USER_AGENT === MOBILE && !/site|thumbs/.test(LAYOUT_MODEL.mobileLogoPlacement)) {
self.txt.width = stage.width
self.width = stage.width;
} else if(isPod()) {
self.txt.element.style.whiteSpace = 'nowrap'
self.width = self.txt.element.offsetWidth;
} else {
self.width = self.txt.element.offsetWidth;
}
self.height = self.txt.element.offsetHeight;
} else if(self.img && logoLoaded && !(e && e.action && e.action === 'changeTemplate')) {
if((USER_AGENT === MOBILE && (LAYOUT_MODEL.mobileLogoWidth || LAYOUT_MODEL.mobileLogoHeight)) || (LAYOUT_MODEL.logoWidth || LAYOUT_MODEL.logoHeight)) {
var logoHRange = percentToPixels(LAYOUT_MODEL.logoWidth, stage.width) || 2000
var logoVRange = percentToPixels(LAYOUT_MODEL.logoHeight, stage.height) || 2000
if(USER_AGENT === MOBILE) {
logoHRange = percentToPixels(LAYOUT_MODEL.mobileLogoWidth, stage.width) || logoHRange
logoVRange = percentToPixels(LAYOUT_MODEL.mobileLogoHeight, stage.height) || logoVRange
logoHRange = (percentToPixels(LAYOUT_MODEL.mobileLogoWidth, stage.width) || percentToPixels(LAYOUT_MODEL.logoWidth, stage.width) || 2000) > (stage.width - (percentToPixels(LAYOUT_MODEL.mobileLogoOffsetX, stage.width) * 2)) ?
(stage.width - (percentToPixels(LAYOUT_MODEL.mobileLogoOffsetX, stage.width) * 2)) :
logoHRange
logoVRange = percentToPixels(LAYOUT_MODEL.mobileLogoHeight, stage.height) || percentToPixels(LAYOUT_MODEL.logoHeight, stage.height) || 2000
}
var scaleVars = {
type:'fit',
hRange:logoHRange,
vRange:logoVRange,
width:originalWidth,
height:originalHeight,
disableOrientationCheck:true
}
var scale = ScaleEngine(scaleVars);
self.img.width = scale.width
self.img.height = scale.height
self.width = scale.width;
self.height = scale.height;
} else if(!(e && e.action && e.action === 'changeTemplate')) {
var logoObj = {width:originalWidth, height:originalHeight, filename:src};
var retinaSize = RetinaResizeEngine(logoObj);
var logoHRange = retinaSize.width
if(USER_AGENT === MOBILE) {
logoHRange = retinaSize.width > (stage.width - (percentToPixels(LAYOUT_MODEL.mobileLogoOffsetX, stage.width) * 2)) ?
(stage.width - (percentToPixels(LAYOUT_MODEL.mobileLogoOffsetX, stage.width) * 2)) :
logoHRange
}
var scale = ScaleEngine({
type:'fit',
hRange:logoHRange,
vRange:retinaSize.height,
width:originalWidth,
height:originalHeight,
disableOrientationCheck:true
});
self.img.width = scale.width
self.img.height = scale.height
self.width = scale.width;
self.height = scale.height;
}
}
if(USER_AGENT !== MOBILE && USER_AGENT !== TABLET) self.element.style.transform = 'rotate(' + (LAYOUT_MODEL.logoRotation || 0) + 'deg)'
// var offsetWidth = Math.abs(LAYOUT_MODEL.logoRotation) === 90 ? self.element.offsetHeight : self.element.offsetWidth
// var offsetHeight = Math.abs(LAYOUT_MODEL.logoRotation) === 90 ? self.element.offsetWidth : self.element.offsetHeight
// self.width = offsetWidth
// self.height = offsetHeight
Tween.defer(self, 0, {x:layoutCalcs.logoView.x(self.width), y:layoutCalcs.logoView.y(self.height)});
};
self.updateStyle = function(e) {
if(e && e.id && /logo|layoutModelInit/i.test(e.id)){
var logoFile = ''
var logoText = ''
var logoHtml = ''
var blendMode = 'normal'
if(isPod()) {
// if no mobileLogoFile then look for mobileLogoText/mobileLogoHtml
// if none of those then look for desktop logoFile then desktop logoText/logoHtml
logoFile = SETTINGS_MODEL.mobileLogoFile || LAYOUT_MODEL.mobileLogoFile || ''
logoText = SETTINGS_MODEL.mobileLogoText || LAYOUT_MODEL.mobileLogoText || ''
logoHtml = SETTINGS_MODEL.mobileLogoHtml || LAYOUT_MODEL.mobileLogoHtml || ''
blendMode = firstValid(LAYOUT_MODEL.mobileLogoBlendMode, LAYOUT_MODEL.logoBlendMode, 'normal')
if(!logoFile && !logoText && !logoHtml) {
logoFile = STATE.logoFile || LAYOUT_MODEL.logoFile || ''
logoText = STATE.logoText || LAYOUT_MODEL.logoText || ''
logoHtml = STATE.logoHtml || LAYOUT_MODEL.logoHtml || ''
}
} else if(isPad()) {
logoFile = SETTINGS_MODEL.tabletLogoFile || LAYOUT_MODEL.tabletLogoFile || ''
logoText = SETTINGS_MODEL.tabletLogoText || LAYOUT_MODEL.tabletLogoText || ''
logoHtml = SETTINGS_MODEL.tabletLogoHtml || LAYOUT_MODEL.tabletLogoHtml || ''
blendMode = firstValid(LAYOUT_MODEL.tabletLogoBlendMode, LAYOUT_MODEL.logoBlendMode, 'normal')
if(!logoFile && !logoText && !logoHtml) {
logoFile = STATE.logoFile || LAYOUT_MODEL.logoFile || ''
logoText = STATE.logoText || LAYOUT_MODEL.logoText || ''
logoHtml = STATE.logoHtml || LAYOUT_MODEL.logoHtml || ''
}
} else {
logoFile = STATE.logoFile || LAYOUT_MODEL.logoFile || ''
logoText = STATE.logoText || LAYOUT_MODEL.logoText || ''
logoHtml = STATE.logoHtml || LAYOUT_MODEL.logoHtml || ''
blendMode = firstValid(LAYOUT_MODEL.logoBlendMode, 'normal')
}
self.element.style['mix-blend-mode'] = blendMode
if(logoFile.indexOf('dxlogo1__at__2x.png') > -1 || logoFile.indexOf('dxlogo2__at__2x.png') > -1) {
src = CDN_PF_SSL_URI + '/media/' + logoFile;
} else if(logoFile !== '') {
src = SETTINGS_MODEL.cdnSslUri + '/' + logoFile;
} else {
src = undefined
}
if(self.txt) {
self.removeChild(self.txt);
self.txt = undefined;
}
if(src && src !== savedSrc) {
if(self.img) {
self.removeChild(self.img);
self.img = undefined;
}
self.img = new Bitmap();
self.img.element.style['user-select'] = 'none'
self.img.element.setAttribute('data-identity', 'logo')
self.img.alpha = 0;
self.img.element.setAttribute('class', 'logoImage')
loadImage(src, function(size) {
originalWidth = size.width
originalHeight = size.height
savedSrc = src
self.img.element.src = src;
})
self.img.element.addEventListener('load', logoImgLoaded)
self.addChild(self.img);
self.img.element.style.cursor = 'pointer'
} else if(!src) {
if(self.img) {
self.removeChild(self.img);
self.img = undefined;
}
src = undefined
savedSrc = undefined
logoLoaded = false
self.txt = new Sprite();
self.txt.text = logoHtml.replace(/(\\*'|\\*")/g, "'") || logoText.replace(/(\\*'|\\*")/g, "'");
self.txt.element.setAttribute('class', 'logoText')
self.txt.element.style['user-select'] = 'none'
self.addChild(self.txt);
self.txt.element.style.cursor = 'pointer'
if(USER_AGENT === MOBILE) {
self.txt.textAlign = LAYOUT_MODEL.mobileLogoAlignHorizontal || 'left'
}
var logoFontSize = getLogoFontSize()
var logoFontColor = getLogoFontColor()
var logoFont = getLogoFont()
var logoKerning = getLogoKerning()
if(logoFontSize !== self.txt.fontSize) {
self.txt.fontSize = logoFontSize;
}
if(logoFontColor !== self.txt.fontColor) {
Tween(self.txt, vars.parentController.updateSpeed, {fontColor:logoFontColor});
}
if(logoFont !== self.txt.fontFamily) {
self.txt.fontFamily = logoFont;
}
if(logoKerning !== self.txt.letterSpacing) {
self.txt.letterSpacing = logoKerning;
}
if(LAYOUT_MODEL.logoTextTransform && LAYOUT_MODEL.logoTextTransform !== self.txt.textTransform) {
self.txt.textTransform = LAYOUT_MODEL.logoTextTransform;
}
}
}
};
function loadImage(src, cb) {
var img = document.createElement('img')
img.addEventListener('load', function(e) {
var width = img.offsetWidth
var height = img.offsetHeight
document.body.removeChild(img)
cb({ width: width, height: height })
})
img.style.opacity = 0
document.body.appendChild(img)
img.src = src
}
function logoImgLoaded() {
logoLoaded = true
setTimeout(function() {
// delay to allow for element offset size info
self.updatePosition();
self.events.dispatchEvent(LOGO_LOADED);
Tween.defer(self.img, UPDATE_SPEED, {alpha:1});
self.events.dispatchEvent('LOGO_LOADED');
}, 10)
self.img.element.removeEventListener(LOAD, logoImgLoaded);
}
return self;
}
function SectionController(imports) { // eslint-disable-line
var view = imports.parentView
var sysEvents = imports.siteControllerEvents
var MediaModule = imports.MediaModule
var mediaModules
var currentMediaModule
var lastAddressChange
var currentBuild
var overlayBuild
var _scrollInteraction
var savedSectionDisplayMode
var prevAddressChange = {}
if(/unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior)) {
window.addEventListener("scroll", scrollEvents)
}
function scrollStart() {
// sysEvents.dispatchEvent('mediaScrollStart')
}
function scrollStop() {
if(_scrollInteraction) {
getCurrentSectionPosition()
}
if(_scrollInteraction !== false) _scrollInteraction = undefined
}
function scroll() {
if(_scrollInteraction === undefined) _scrollInteraction = true
if(_scrollInteraction) {
getCurrentSectionPosition()
}
}
var scrollTimer
function scrollEvents(e) {
if(!scrollTimer) scrollStart(e)
clearTimeout(scrollTimer)
scroll(e)
scrollTimer = setTimeout(function() {
scrollStop(e)
scrollTimer = null
}, 300)
}
function getCurrentSectionPosition() {
if(mediaModules && layoutCalcs.sectionDisplayMode === 'multiple') {
Object.keys(mediaModules)
.map(function(key) {
return mediaModules[key]
})
.forEach(function(module) {
var moduleY = module.view.y
if(window.scrollY + (window.innerHeight * 0.5) >= moduleY && window.scrollY + (window.innerHeight * 0.5) <= moduleY + module.view.height) {
module.controller.checkCaption()
STATE.section(module.controller.section)
sysEvents.dispatchEvent('cursorAxisUpdate', getCursorAxis(STATE.overrides.transitionType))
sysEvents.dispatchEvent('updateSectionPassive', {
section: module.controller.section,
assetId: module.controller.getCurrentAssetId(),
mode: module.controller.getCurrentMode()
})
}
})
}
}
function isThumbsFirst(section) {
STATE.section(section)
return (!isSlideshowGallery(section) && STATE.overrides.thumbnailDefaultOn && /fill|paginated|vMasonry|hMasonry/i.test(STATE.overrides.thumbnailType) && LAYOUT_MODEL.overlayAlpha === 1) || isIndexSection(section)
}
function getMode(section) {
if(isSlideshowGallery(section)) {
return ''
} else {
if(isThumbsFirst(section)) {
return 'thumbs'
} else if(checkThumbsDefaultOn(section) && checkCaptionDefault(section)) {
return 'thumbs-caption'
} else {
if(checkThumbsDefaultOn(section)) return 'thumbs'
if(checkCaptionDefault(section)) return 'caption'
}
return ''
}
}
function checkThumbsDefaultOn(section) {
STATE.section(section)
return !isSlideshowGallery(section) &&
STATE.overrides.thumbnailType !== 'none' &&
(STATE.overrides.thumbnailDefaultOn || isIndexSection(section)) &&
section && section.media && section.media.length > 1
}
function checkCaptionDefault(section) {
STATE.section(section)
var asset = getMediaById(section.mediaItems[0])
if(!asset) asset = {overrides:{}}
return USER_AGENT !== MOBILE && firstValid(asset.overrides.captionDefault, STATE.overrides.captionDefault)
}
function buildScrollDownIcon(vars) {
var container = new Sprite()
var icon = new Svg()
var iconG = new Svg({type: 'g'})
var iconPath = new Path()
var iconSize = 100 * vars.scale
container.zIndex = 5
container.width = iconSize
container.height = iconSize
container.element.style['mix-blend-mode'] = vars.blendMode
container.alpha = 0
container.addEventListener('click', function() {
var module = mediaModules[1]
if(module) {
var scrollY = module.view.y - STATE.mediaView.y(module.controller.section.key)
Anim.to(window, 0.35, {scrollY:scrollY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic'})
}
})
var debounceTimer
// 1000ms seems to be the sweet spot for dissallowing the icon alpha until the last layout
container.updatePosition = function(height) {
clearTimeout(debounceTimer)
debounceTimer = setTimeout(function(height) {
container.y = height - iconSize - vars.offsetY
container.x = (stage.width - iconSize) * 0.5
Tween(container, UPDATE_SPEED, {alpha:1})
}, 50, height)
}
icon.position = 'absolute'
icon.width = iconSize
icon.height = iconSize
container.element.style.transformOrigin = 'center'
iconG.scale = vars.scale
iconPath.d = vars.path
iconPath.fill = 'none'
iconPath.stroke = vars.color
iconPath.strokeWidth = vars.strokeWidth
icon.addChild(iconG)
iconG.addChild(iconPath)
container.addChild(icon)
return container
}
function isRenderableMaxScrollSection(section) {
STATE.section(section)
return !section.hideFromUnifiedSite &&
section.label !== '%SPACER%' &&
section.visible &&
(isIndexSection(section) ? true : section.mediaItems.length) &&
(section.password.length ? STATE.getPassedSection(section.id) : true) &&
(!/none|overlay|unifiedPageScrolling/.test(section.displayBehavior) || (/overlay/.test(section.displayBehavior) && STATE.overrides.siteDisplayGalleryOnlyOverlay && isThumbsFirst(section))) &&
(!firstItemIsLink(section) || section.isIndex)
}
function firstItemIsLink(section) {
var mediaItem = getMediaById(section.media[0])
return mediaItem ? mediaItem.type === 'link' && !section.mediaItems.length : false
}
function buildUnifiedSiteScrollVertical(e) {
var parentSection = e.parentSection
var scrollDownIcon
var uriChangeHappening
function build() {
layoutCalcs.sectionDisplayMode = 'multiple'
var sections = parentSection.media
.map(getSectionById)
.filter(isRenderableMaxScrollSection)
if(parentSection.label === 'ROOT_SECTION' && STATE.backgroundImages.length) {
var bgImgs = STATE.backgroundImages.filter(function(id) {
return !!MEDIA_MODEL[id]
})
var landingSection = {
id:LANDING_MEDIA,
key:'/',
label:LANDING_MEDIA,
visible:1,
password:'',
media:bgImgs,
mediaItems:bgImgs,
overrides:{captionDefault: LAYOUT_MODEL.slideshowCaptions}
}
sections = [landingSection].concat(sections)
}
var firstSection = sections[0]
var secondSection = sections[1]
if((parentSection.label === 'ROOT_SECTION' && LAYOUT_MODEL.slideshowScrollDownIcon && isSlideshowGallery(firstSection)) ||
parentSection.scrollDownIcon || (firstSection && firstSection.scrollDownIcon)) {
// build a scrolldown icon
scrollDownIcon = buildScrollDownIcon({
path: svgPaths.arrow3Down,
color: LAYOUT_MODEL.scrollDownIconColor || '#F2F2F2',
strokeWidth: LAYOUT_MODEL.scrollDownIconStrokeWidth || 1,
scale: LAYOUT_MODEL.scrollDownIconScale || 1,
offsetY: LAYOUT_MODEL.scrollDownIconOffsetY || 0,
blendMode: LAYOUT_MODEL.scrollDownIconBlendMode || 'normal'
})
view.addChild(scrollDownIcon)
}
mediaModules = sections
.reduce(function(acc, section, i) {
STATE.section(section)
var state = e.section === section ? e : {
section: section,
mediaToRender: removeLinksFromMedia(section.mediaItems),
path: section.key,
assetId: isThumbsFirst(section) ? -1 : 0,
asset: getMediaById(section.mediaItems[0]),
mode: getMode(section),
info: {
isSectionChange: true,
isAssetChange: true,
isModeChange: false,
isLandingMedia: isSlideshowGallery(section),
mediaViewState: isSlideshowGallery(section) ? 'landingMedia' : 'mediaView',
isDeepLink: false,
isMediaViewStateChange: true,
isIntroGallery: section.isIntroGallery,
flickSpeed: 0.35,
lastUri: '/',
isThumbsFirst: isThumbsFirst(section),
isMobileVideoClick: false,
isBlog: isBlogFeed(section.id)
}
}
layoutCalcs.updateSectionState(section.key, {assetId:state.assetId, mode:state.mode})
var mediaModule = new MediaModule(sysEvents, view, null, {position:i, length:sections.length})
mediaModule.controller.mediaView.element.id = section && section.key || 'section:' + i
layoutCalcs._uriState = state
mediaModule.controller.build(state)
return acc.concat(mediaModule)
}, [])
window.addEventListener('scroll', lazyLoadModules)
}
// needs to be built before the layout urichange modelchange
build()
// layout each media view
var layoutTimer
function layout(built) {
/*
layout needs to wait for the UPDATE_CONTENT_HEIGHT to be called
lots of figuring to do...
*/
// may have to debounce this
function doLayout() {
var totalHeight = 0
var marginOverlap = getMarginOverlap() || 0
var firstSection = mediaModules[0].controller.section
STATE.section(firstSection)
var sitePaddingTop = percentToPixels(LAYOUT_MODEL.sitePaddingTop, stage.height)
var menuNetHeight = sitePaddingTop
if(isFillSiteSlideshow(firstSection)) {
// console.log('has slide show section')
menuNetHeight = 0
} else if(/top/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal) {
// console.log('does not have slide show section')
var menuSize = percentToPixels(LAYOUT_MODEL.menuWidth, stage.height) - percentToPixels(LAYOUT_MODEL.menuOffsetX, stage.height)
menuNetHeight = sitePaddingTop + menuSize - marginOverlap
}
var y = menuNetHeight || 0
var totalMediaItems = 0
mediaModules
.forEach(function(module, i, self) {
STATE.section(module.controller.section)
var prevModule = self[i - 1]
var nextY = prevModule ? prevModule.view.y + (prevModule.view.height || 0) : y
var moduleHeight = module.controller.getTotalHeight()
totalMediaItems += module.controller.section.media.length
var section = module.controller.section
totalHeight += (moduleHeight || 0)
module.view.transition = 0
module.view.x = 0
module.view.y = nextY
module.view.width = stage.width
module.view.height = moduleHeight
module.view.mask.x = STATE.mediaView.x()
module.view.container.y = 0
module.view.mask.transition = 0
module.view.mask.width = STATE.mediaView.width()
// kent added this to get the bounds height from the transition/layout #1313
module.view.mask.height = moduleHeight
})
// view.totalHeight = mediaModules
// .map(function(module) {
// return module.controller.getTotalHeight()
// })
// .reduce(function(x, y) { return x + y }, 0)
layoutCalcs.mediaModules = mediaModules
layoutCalcs.mediaViewsHeight = totalHeight
view.totalHeight = totalHeight
view.height = STATE.siteView.height()
if(scrollDownIcon) {
scrollDownIcon.updatePosition(mediaModules[0].view.height)
}
scrollTo(lastAddressChange, built)
}
doLayout()
clearTimeout(layoutTimer)
layoutTimer = setTimeout(doLayout, 500)
}
function transition() {
// see if we can use existing media view transition types
}
function modelChange() {
destroy()
build()
}
function parentSectionChangeScrollTo(module) {
STATE.section(module.controller.section)
var scrollY = module.view.y - STATE.mediaView.y(module.controller.section.key)
if(module === mediaModules[0]) {
scrollY = 0
// } else {
// var siteviewdomEl = document.getElementsByClassName('SiteView')[0]
}
window.scrollTo(0, scrollY)
}
function sectionChangeScrollTo(module) {
STATE.section(module.controller.section)
var scrollY = module.view.y - STATE.mediaView.y(module.controller.section.key)
if(module === mediaModules[0]) scrollY = 0
Anim.to(window, 0.35, {scrollY:scrollY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic'})
}
function scrollTo(e, built) {
if(uriChangeHappening) {
var module = mediaModules.filter(function(m) {
return e.path === m.controller.section.key
})[0]
if(!module) {
module = mediaModules[0]
}
if(e.info.isParentSectionChange || built) {
parentSectionChangeScrollTo(module)
} else if(e.info.isSectionChange) {
sectionChangeScrollTo(module)
} else if(e.info.isModeChange) {
sectionChangeScrollTo(module)
}
if(!built || e.info.isParentSectionChange) module.controller.navigate(e)
uriChangeHappening = false
}
}
// listen for uri change
function uriChange(e, built) {
uriChangeHappening = true
var module = mediaModules.filter(function(m) {
return e.path === m.controller.section.key
})[0]
if(!module) {
module = mediaModules[0]
}
var runLayout = module.controller.state.mode !== e.mode
// find the section's media controller
// scroll the mediaView into view
// then call .navigate(e) on the media controller
if(!built || e.info.isParentSectionChange) module.controller.navigate(e)
// if is mode change for module then run layout
if(runLayout) layout(built)
sysEvents.dispatchEvent('cursorAxisUpdate', module.controller.cursorAxis)
}
function destroy() {
mediaModules.forEach(function(module) {
module.controller.destroy()
})
window.removeEventListener('scroll', lazyLoadModules)
if(scrollDownIcon) view.removeChild(scrollDownIcon)
}
var lazyLoadScrollTimer
function lazyLoadModules() {
clearTimeout(lazyLoadScrollTimer)
lazyLoadScrollTimer = setTimeout(function() {
mediaModules.forEach(function(module) {
if(module.view.lazyLoader) {
module.view.lazyLoader.update()
}
if(module.controller.overlayController) {
module.controller.overlayController.lazyLoaderUpdate()
}
})
}, 10)
}
return {
type: 'unified',
layout: layout,
uriChange: uriChange,
modelChange: modelChange,
scrollTo: scrollTo,
transition: transition,
destroy: destroy
}
}
function buildLegacySite() {
// legacy & unifiedPageScroll
layoutCalcs.sectionDisplayMode = 'single'
var mediaModule = new MediaModule(sysEvents, view)
currentMediaModule = mediaModule
var mediaController = mediaModule.controller
var mediaView = mediaModule.view
// there is only one module to layout here
var layoutTimer
function layout(cb) {
// trigger a resize
// if(!(layoutCalcs._thumbsVisible && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)))
// var totalHeight = STATE.overrides.siteDisplayBehavior === 'none' ?
// STATE.mediaView.height(mediaView.section.key) :
// STATE.siteView.height() // mediaController.getTotalHeight()
clearTimeout(layoutTimer)
layoutTimer = setTimeout(function() {
var totalHeight = mediaController.getTotalHeight()
STATE.section(mediaView.section)
Tween(mediaView, 0, {
x:STATE.mediaView.x(),
y:STATE.mediaView.y(mediaView.section.key),
width:STATE.mediaView.width(),
height: totalHeight
})
// page would not scroll when vScroll in legacy #1339
var maskHeight = STATE.overrides.siteDisplayBehavior === 'none' && /vScroll/.test(STATE.overrides.transitionType) ?
STATE.mediaView.zoneHeight() :
mediaView.container.boundsHeight
// set this here due to issue
// dual scrollbar issue #1280
// the mediaView.container.height was too tall
// getting set to the text page content height
// which caused an extra scrollbar at the mediaView level
// rather than just on the text page for a legacy text page
mediaView.container.height = maskHeight
Tween(mediaView.mask, 0, {
width:STATE.mediaView.width(),
// kent added this to get the bounds height from the transition/layout #1313
height: maskHeight
// height: totalHeight
})
layoutCalcs._mediaContentHeight = totalHeight
if(mediaView.lazyLoader) mediaView.lazyLoader.update()
// navigating on a vscroll from a deep link needs to navigate after the layout
if(typeof cb === 'function') setTimeout(cb, 500)
}, 20)
}
function transition() {
// no transition - only a single media view here
}
function uriChange(e, built, mediaBehaviorInitInsteadOfTransition) {
if(!built) mediaController.navigate(e, mediaBehaviorInitInsteadOfTransition)
}
function modelChange() {
Tween(mediaView.container, UPDATE_SPEED, {backgroundColor:STATE.mediaView.backgroundColor()})
layout()
mediaController.destroyStaticNav()
mediaController.createStaticNav()
}
return {
type: 'legacy',
module: mediaModule,
layout: layout,
uriChange: uriChange,
modelChange: modelChange,
transition: transition,
destroy: function() {
mediaModule.controller.destroy()
}
}
}
function buildMediaOverlay() {
// legacy & unifiedPageScroll
layoutCalcs.lastSectionDisplayMode = layoutCalcs.sectionDisplayMode
layoutCalcs.sectionDisplayMode =
/unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior) ? 'multiple' : 'single'
var isOverlay = true
var mediaModule = new MediaModule(sysEvents, view, isOverlay)
currentMediaModule = mediaModule
var mediaController = mediaModule.controller
var mediaView = mediaModule.view
// there is only one module to layout here
function layout() {
// trigger a resize
// if(!(layoutCalcs._thumbsVisible && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)))
var totalHeight = mediaController.getTotalHeight()
STATE.section(mediaView.section)
mediaView.x = 0
mediaView.y = 0
mediaView.width = stage.width
mediaView.height = stage.height
mediaView.mask.width = STATE.mediaView.width()
// kent added this to get the bounds height from the transition/layout #1313
// mediaView.mask.height = mediaView.container.height
// I think we decided that the media overlay would only be the stage height?
// the fix for #1313 caused #1337 - setting it back didn't seem to affect the
// the thumb strip issue for trevorpaulus.com
mediaView.mask.height = STATE.mediaView.contentHeight()
layoutCalcs._mediaContentHeight = totalHeight
if(mediaView.lazyLoader) mediaView.lazyLoader.update()
}
function transition() {
// no transition - only a single media view here
}
function uriChange(e) {
mediaController.navigate(e)
}
function modelChange() {
STATE.section(mediaView.section)
Tween(mediaView.container, UPDATE_SPEED, {backgroundColor:STATE.mediaView.backgroundColor()})
layout()
mediaController.destroyStaticNav()
mediaController.createStaticNav()
}
return {
type: 'overlay',
module: mediaModule,
layout: layout,
uriChange: uriChange,
modelChange: modelChange,
transition: transition,
destroy: function() {
mediaModule.controller.destroy()
}
}
}
var updateContentHeightDebounce = createDebounce(50)
var overlayBuildLayoutDebounce = createDebounce(50)
function deregisterHandlers(handlers, isOverlayBuild) {
sysEvents.removeEventListener(RESIZE_END, function() {
if(isOverlayBuild) {
overlayBuildLayoutDebounce(handlers.layout)
} else {
updateContentHeightDebounce(handlers.layout)
}
})
sysEvents.removeEventListener('UPDATE_CONTENT_HEIGHT', function() {
if(isOverlayBuild) {
overlayBuildLayoutDebounce(handlers.layout)
} else {
updateContentHeightDebounce(handlers.layout)
}
})
sysEvents.removeEventListener(LAYOUT_MODEL_CHANGE, handlers.modelChange)
sysEvents.removeEventListener(SECTIONS_MODEL_CHANGE, handlers.modelChange)
sysEvents.removeEventListener(SETTINGS_MODEL_CHANGE, function(e) {
if(/backgroundimages|template|staging/.test(e.id)) handlers.modelChange()
})
sysEvents.removeEventListener('mediaOverlayClose', function() {
if(prevAddressChange) STATE.section(prevAddressChange.section)
if(!currentBuild) {
sysEvents.dispatchEvent(ADDRESS_SECTION_CHANGE, {
type:'internal',
path:'',
target:'_self'
})
} else {
sysEvents.dispatchEvent('updateSectionPassive', {
section: prevAddressChange.section,
assetId: prevAddressChange.assetId,
mode: prevAddressChange.mode
})
}
})
}
function registerHandlers(handlers, isOverlayBuild) {
sysEvents.addEventListener(RESIZE_END, function() {
if(isOverlayBuild) {
overlayBuildLayoutDebounce(handlers.layout)
} else {
updateContentHeightDebounce(handlers.layout)
}
})
sysEvents.addEventListener('UPDATE_CONTENT_HEIGHT', function() {
if(isOverlayBuild) {
overlayBuildLayoutDebounce(handlers.layout)
} else {
updateContentHeightDebounce(handlers.layout)
}
})
sysEvents.addEventListener(LAYOUT_MODEL_CHANGE, handlers.modelChange)
sysEvents.addEventListener(SECTIONS_MODEL_CHANGE, handlers.modelChange)
sysEvents.addEventListener(SETTINGS_MODEL_CHANGE, function(e) {
if(/backgroundimages|template|staging/.test(e.id)) handlers.modelChange()
})
sysEvents.addEventListener('mediaOverlayClose', function() {
if(prevAddressChange) STATE.section(prevAddressChange.section)
if(!currentBuild) {
sysEvents.dispatchEvent(ADDRESS_SECTION_CHANGE, {
type:'internal',
path:'',
target:'_self'
})
} else {
sysEvents.dispatchEvent('updateSectionPassive', {
section: prevAddressChange.section,
assetId: prevAddressChange.assetId,
mode: prevAddressChange.mode
})
}
})
}
function siteUriChange(e) {
lastAddressChange = e
var built = false
STATE.section(e.section)
if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
// check if need to destroy old site
// if destroy? then unregister handlers
// var sectionHasSubs = !!e.section.media.filter(function(id) { id < 10000 }).length
if(overlayBuild) {
overlayBuild.module.view.close(function() {
if(overlayBuild) overlayBuild.destroy()
overlayBuild = null
})
}
if(!currentBuild) {
currentBuild = buildUnifiedSiteScrollVertical(e)
registerHandlers(currentBuild)
built = true
currentBuild.uriChange(e, built)
currentBuild.layout(built)
} else if(e.info.isParentSectionChange || (currentBuild && currentBuild.type === 'legacy') || e.info.isPasswordSection || e.info.isSearchSubmit) {
if(currentBuild) {
deregisterHandlers(currentBuild)
currentBuild.destroy()
}
currentBuild = buildUnifiedSiteScrollVertical(e)
registerHandlers(currentBuild)
built = true
currentBuild.uriChange(e, built)
currentBuild.layout(built)
} else if(e.info.isModeChange) {
currentBuild.uriChange(e, built)
currentBuild.layout(built)
} else {
currentBuild.uriChange(e, built)
currentBuild.scrollTo(e, built)
}
} else if(/overlay/.test(STATE.overrides.siteDisplayBehavior) && !(STATE.overrides.siteDisplayGalleryOnlyOverlay && isThumbsFirst(e.section) && /fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(e.mode))) {
// check if need to destroy old site
// if destroy? then unregister handlers
if(overlayBuild && (e.info.isSectionChange || e.section.id !== overlayBuild.module.view.section.id)) {
// if(e.info.isSectionChange) {
// if(overlayBuild) {
deregisterHandlers(overlayBuild, true)
overlayBuild.destroy()
overlayBuild = null
// }
}
if(!overlayBuild) {
prevAddressChange = e.prevState
overlayBuild = buildMediaOverlay()
registerHandlers(overlayBuild, true)
built = true
overlayBuild.module.controller.build(e)
}
overlayBuild.uriChange(e, built)
overlayBuild.layout()
overlayBuild.module.view.open()
savedSectionDisplayMode = layoutCalcs.sectionDisplayMode
} else {
// check if need to destroy old site
// if destroy? then unregister handlers
if(overlayBuild) {
overlayBuild.module.view.close(function() {
if(overlayBuild) overlayBuild.destroy()
overlayBuild = null
})
}
if(e.info.isSectionChange || !currentBuild || (currentBuild && currentBuild.type === 'unified')) {
if(currentBuild) {
deregisterHandlers(currentBuild)
currentBuild.destroy()
}
currentBuild = buildLegacySite()
registerHandlers(currentBuild)
currentBuild.module.controller.build(e)
built = true
var mediaBehaviorInitInsteadOfTransition = true
// currentBuild.uriChange(e, built, mediaBehaviorInitInsteadOfTransition)
currentBuild.layout(function() {
// delay navigate until end of layout
// var dontNavigate = e.assetId < 1
// currentBuild.uriChange(e, built || dontNavigate, mediaBehaviorInitInsteadOfTransition)
// >>> 01/31/2023 not calling uriChange due to flash for #1643 - build is already navigating to correct asset
})
} else if(e.info.isModeChange) {
// >>>>> getting an error here due to no currentBuild on mode change
currentBuild.uriChange(e, built)
currentBuild.layout()
} else {
if(currentBuild) currentBuild.uriChange(e, built)
}
}
}
function isCurrentSection(section, state) {
return section.key === state.section.key
}
function spacebarPlay(e) {
if(/unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior)) {
if(mediaModules) {
Object.keys(mediaModules)
.map(function(key) {
return mediaModules[key]
})
.forEach(function(module) {
var mediaId
// module.controller.updateState(e)
if(isCurrentSection(module.controller.section, e)) {
STATE.section(module.controller.section)
if(!(/fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(e.mode))) {
var child = module.view.container.children[e.assetId]
mediaId = child ? child.id : undefined
}
}
module.events.dispatchEvent('spacebarTogglePlay', mediaId)
})
}
} else if(currentMediaModule){
STATE.section(currentMediaModule.controller.section)
if(!(/fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(e.mode))) {
var child = currentMediaModule.view.container.children[e.assetId]
var mediaId = child ? child.id : undefined
}
currentMediaModule.events.dispatchEvent('spacebarTogglePlay', mediaId)
}
}
function autoplayTarget(e) {
if(/unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior)) {
if(mediaModules) {
Object.keys(mediaModules)
.map(function(key) {
return mediaModules[key]
})
.forEach(function(module) {
var mediaId
// module.controller.updateState(e)
if(isCurrentSection(module.controller.section, e)) {
STATE.section(module.controller.section)
if(!(/fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(e.mode))) {
if(STATE.mediaView.videoAutoPlay()) {
var child = module.view.container.children[e.assetId]
mediaId = child ? child.id : undefined
}
}
}
module.events.dispatchEvent('mediaAutoPlay', mediaId)
})
}
} else if(currentMediaModule){
STATE.section(currentMediaModule.controller.section)
if(!(/fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(e.mode))) {
if(STATE.mediaView.videoAutoPlay()) {
var child = currentMediaModule.view.container.children[e.assetId]
var mediaId = child ? child.id : undefined
}
}
currentMediaModule.events.dispatchEvent('mediaAutoPlay', mediaId)
}
}
sysEvents.addEventListener('autoplayTarget', autoplayTarget)
sysEvents.addEventListener('spacebarPlay', spacebarPlay)
sysEvents.addEventListener(SITE_URI_CHANGE, siteUriChange)
sysEvents.addEventListener(LAYOUT_MODEL_CHANGE, function(e) {
if(/siteDisplayBehavior|transitionType/.test(e.id)) {
if(currentBuild) {
deregisterHandlers(currentBuild)
currentBuild.destroy()
STATE.section(lastAddressChange.section)
if(STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical') {
currentBuild = buildUnifiedSiteScrollVertical(lastAddressChange)
} else {
currentBuild = buildLegacySite()
currentBuild.module.controller.build(lastAddressChange)
}
registerHandlers(currentBuild)
built = true
currentBuild.layout()
}
}
})
sysEvents.addEventListener(SECTIONS_MODEL_CHANGE, function() {
if(currentBuild) {
deregisterHandlers(currentBuild)
currentBuild.destroy()
STATE.section(lastAddressChange.section)
if(STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical') {
currentBuild = buildUnifiedSiteScrollVertical(lastAddressChange)
} else {
currentBuild = buildLegacySite()
currentBuild.module.controller.build(lastAddressChange)
}
registerHandlers(currentBuild)
built = true
currentBuild.layout()
}
})
}
var MediaController = (function() { // eslint-disable-line
function MediaController(localEvents, sysEvents) { // eslint-disable-line
var self = this
var _localEvents = localEvents
var _sysEvents = sysEvents
var navigationMode
var contactSettings = /contactTitleFont|contactTitleFontSize|contactTitleShow|contactFont|contactFontSize|contactFontColor|contactFieldRectColor/
var imageVideoSettings = /attachmentGallery|containerColor|transitionType|imageAlignHorizontal|imageAlignVertical|imageScaleType|videoScaleType|imageVideoInactiveAlpha|imageVideoMarginTop|imageVideoMarginRight|imageVideoMarginBottom|imageVideoMarginLeft|imageVideoScrollType|imageVideoScrollbarRounded|imageVideoScrollVisibility|imageVideoScrollbarHorizontalOffset|imageVideoScrollbarVerticalOffset/
var textPageSettings = /pageMarginTop|pageMarginRight|pageMarginBottom|pageMarginLeft|pageScrollVerticalMargin|pageTextFont|pageTextKerning|pageTextFontSize|pageTextFontColor|pageTitle|pageTitleFont|pageTitleKerning|pageTitleFontSize|pageTitleFontColor|pageScrollbarAlignment|pageScrollbarHorizontalOffset|pageScrollbarVerticalOffset|pageScrollbarColor|pageScrollbarHover|pageScrollbarBgAlpha|pageScrollbarWidth/
var landingMediaSettings = /landingMediaRandomize|landingMediaTransitionType|landingMediaSpeed|landingMediaTransitionDuration|landingMediaAlignHorizontal|landingMediaAlignVertical|landingMediaScaleType/
var isInit = true
_sysEvents.addEventListener(ORIENTATION_CHANGE, orientationChange)
_sysEvents.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange)
_sysEvents.addEventListener(SECTIONS_MODEL_CHANGE, sectionsModelChange)
_sysEvents.addEventListener(SETTINGS_MODEL_CHANGE, settingsModelChange)
_sysEvents.addEventListener(MEDIA_MODEL_CHANGE, mediaModelChange)
_sysEvents.addEventListener(PAUSE_MEDIA, pauseMedia)
_sysEvents.addEventListener(CONTACT_FORM_SENT, contactFormSent)
_sysEvents.addEventListener(SHARE_FORM_SENT, shareFormSent)
_sysEvents.addEventListener(INQUIRY_FORM_SENT, inquiryFormSent)
_sysEvents.addEventListener('thumbStripDisplaceChange', resize)
_sysEvents.addEventListener(MENU_DOCK_CLOSE, function(e){
_localEvents.dispatchEvent(MENU_DOCK_CLOSE, e)
})
_sysEvents.addEventListener(MENU_DOCK_OPEN, function(e){
_localEvents.dispatchEvent(MENU_DOCK_OPEN, e)
})
_sysEvents.addEventListener('SITE_URI_CHANGE_PASSIVE', updateCaptions)
_localEvents.addEventListener('SectionMediaFactory/mediaBuilt', mediaBuilt)
_localEvents.addEventListener('MediaView/ContentAdded', layoutMediaView)
_localEvents.addEventListener('ScrollTransition/updateAssetId', updateAssetId)
_localEvents.addEventListener(MEDIA_LOADED, mediaLoaded)
_localEvents.addEventListener(TRANSITION_START, transitionStart)
_localEvents.addEventListener(TRANSITION_END, transitionEnd)
_localEvents.addEventListener('cursorAxisUpdate', cursorAxisUpdate)
_localEvents.addEventListener(ADDRESS_ASSET_CHANGE, addressAssetChange)
_localEvents.addEventListener(CONTACT_FORM_SUBMIT, contactFormSubmit)
_localEvents.addEventListener(SHARE_FORM_SUBMIT, shareFormSubmit)
_localEvents.addEventListener(INQUIRY_FORM_SUBMIT, inquiryFormSubmit)
_localEvents.addEventListener(NAVBAR_OVERLAY_BTN_CLICK, overlayBtnClick)
_localEvents.addEventListener(TOUCH_NAVIGATION_END, touchNavEnd)
_localEvents.addEventListener(PAGE_LOADED, pageLoaded)
_localEvents.addEventListener('siteAnchorCaptionUpdate', function(mediaItem) {
_sysEvents.dispatchEvent('siteAnchorCaptionUpdate', mediaItem)
})
_localEvents.addEventListener('mediaOverlayClose', function() {
pauseMedia()
_sysEvents.dispatchEvent('mediaOverlayClose')
})
_localEvents.addEventListener('adminPageviewImageSizes', function(pageImageSizes) {
_sysEvents.dispatchEvent('adminPageviewImageSizes', pageImageSizes)
})
_localEvents.addEventListener('lightboxDownloadOverlayOpen', function() {
_sysEvents.dispatchEvent('lightboxDownloadOverlayOpen')
})
_localEvents.addEventListener('lightboxUpdateItem', function(e) {
_sysEvents.dispatchEvent('lightboxUpdateItem', e)
})
_localEvents.addEventListener('attachmentDownload', function(e) {
_sysEvents.dispatchEvent('attachmentDownload', e)
})
_sysEvents.addEventListener(RESIZE_END, function(e) {
STATE.section(self.section)
if(STATE.overrides.thumbnailOnly || isThumbsFirst(self.section)) {
self.overlayController.resize()
}
})
_localEvents.addEventListener('UPDATE_CONTENT_HEIGHT', function(info) {
// save the thumbs height and the gallery height here
// so you can select which one to use for total height
STATE.section(self.section)
if(info.thumbs && self.thumbsTotalHeight !== info.thumbs) {
if(/strip/.test(STATE.overrides.thumbnailType) && /thumbs/.test(self.state.mode)) {
if(/top|bottom/.test(STATE.overrides.thumbnailSide)) {
self.thumbsTotalHeight = Math.round(info.thumbs + self.totalHeight)
} else {
// /left|right/ thumbnailSide
self.thumbsTotalHeight = Math.round(self.totalHeight)
}
} else {
self.thumbsTotalHeight = Math.round(info.thumbs)
}
// for v15 siteView height in layoutCalcs
// overlay view is using legacy stage height for its height
if(!/^overlay/.test(STATE.overrides.siteDisplayBehavior) || isClosedGalleryOnlyOverlay()) {
layoutCalcs._thumbContentHeight = Math.round(info.thumbs)
}
// layoutCalcs.updateSectionState(self.section.key, {thumbsHeight:info.thumbs})
} else if(info.gallery) {
self.totalHeight = Math.round(info.gallery)
self.overlayController.resize()
// layoutCalcs.updateSectionState(self.section.key, {adjustedMediaHeight:info.gallery})
}
// need to make sure zoneHeight is defined before we persist it in the section state
// paginated thumbs was getting the undefined zoneHeight and causing an error
var zoneHeight
if(/thumbs/.test(self.state.mode)) {
if(/strip/.test(STATE.overrides.thumbnailType)) {
zoneHeight = self.totalHeight > 0 && self.totalHeight > self.thumbsTotalHeight ? self.totalHeight : self.thumbsTotalHeight
} else {
zoneHeight = self.thumbsTotalHeight
}
}
var marginOverlap = /top|bottom/.test(STATE.menuView.placement()) && !LAYOUT_MODEL.isMenuScrollReveal ? (getMarginOverlap() || 0) : 0
// mediaView.height is adding marginOverlap to the gallery height causing a iterative increase
if(marginOverlap) zoneHeight -= marginOverlap
var sectionUpdate = {
height:self.totalHeight
}
if(self.mediaView.container.children[0]) {
sectionUpdate.isFullTextHeight = allowPageContentHeight(self.mediaView.container.children[0], self.mediaView.container.children.length)
}
if(zoneHeight) sectionUpdate.zoneHeight = zoneHeight
layoutCalcs.updateSectionState(self.section.key, sectionUpdate)
if(self.staticNav) {
self.staticNav.resize({
x: 0,
y: 0,
width: STATE.mediaView.zoneWidth(),
height: self.getTotalHeight()
})
}
_sysEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT')
})
self.getTotalHeight = function() {
STATE.section(self.section)
if(STATE.overrides.siteDisplayBehavior === 'none') {
// don't need section.key because this is legacy
return STATE.mediaView.zoneHeight()
} else if(isIndexSection(self.section) && /thumbs/.test(self.state.mode)) {
return self.thumbsTotalHeight ? self.thumbsTotalHeight : STATE.mediaView.zoneHeight(self.section.key)
} else if(!isSlideshowGallery(self.section) && !/none/.test(STATE.overrides.thumbnailType) && /thumbs/.test(self.state.mode)) {
return self.thumbsTotalHeight //STATE.mediaView.zoneHeight(self.section.key)
} else if(/unifiedSiteScrollVertical/.test(STATE.overrides.siteDisplayBehavior)) {
var sectionBoundsHeight = self.mediaView.container.boundsHeight
var totalHeight = layoutCalcs.getMaxScrollSectionHeight(self.mediaView)
if(/vScroll/.test(STATE.overrides.transitionType)) {
return sectionBoundsHeight
} else {
return sectionBoundsHeight && (sectionBoundsHeight < totalHeight) ? sectionBoundsHeight : totalHeight
}
} else if(/vScroll/.test(STATE.overrides.transitionType)) {
return self.mediaView.container.boundsHeight
} else {
return STATE.mediaView.height(self.section.key)
}
}
self.localEvents = _localEvents
self.sysEvents = _sysEvents
self.buildStaticNav = function() {
STATE.section(self.section)
return new StaticNav({
zIndex: 3,
axis: /^v/.test(STATE.overrides.transitionType) ? 'y' : 'x',
align: LAYOUT_MODEL.staticNavAlignment || 'center',
scale: LAYOUT_MODEL.staticNavIconScale || 1,
zone: {
x: 0,
y: 0,
width: stage.width,
height: self.getTotalHeight()
},
offset: {
prevX: LAYOUT_MODEL.staticNavPrevOffsetX || 0,
prevY: LAYOUT_MODEL.staticNavPrevOffsetY || 0,
nextX: LAYOUT_MODEL.staticNavNextOffsetX || 0,
nextY: LAYOUT_MODEL.staticNavNextOffsetY || 0
},
paths: {
prev: {
d: svgPaths.arrow3Left,
fill: 'none',
stroke: LAYOUT_MODEL.cursorColor || '#333',
strokeWidth: LAYOUT_MODEL.staticNavStrokeWidth || 1
},
next: {
d: svgPaths.arrow3Right,
fill: 'none',
stroke: LAYOUT_MODEL.cursorColor || '#333',
strokeWidth: LAYOUT_MODEL.staticNavStrokeWidth || 1
}
},
prevClick: function() {
self.sysEvents.dispatchEvent(NAVBAR_NAV_CLICK, {navDir:'prev'})
},
nextClick: function() {
self.sysEvents.dispatchEvent(NAVBAR_NAV_CLICK, {navDir:'next'})
}
})
}
self.updateStaticNav = function(e) {
STATE.section(self.section)
if(LAYOUT_MODEL.navCursorType === 'static') {
var isGridThumbs = /thumbs/.test(e.mode) && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)
self.staticNav.resize({
x: 0, // STATE.mediaView.x(),
y: 0,
width: STATE.mediaView.zoneWidth(),
height: self.getTotalHeight()
})
e.section.media = e.section.media
.filter(function(m) {
return m !== null // strange situation where null was in media array
})
if(e.info.isLandingMedia || e.section.media.length < 2 || isGridThumbs) {
self.staticNav.hide()
} else if(e.assetId === 0) {
self.staticNav.hide('prev')
self.staticNav.show('next')
} else if(e.assetId === e.section.media.length - 1) {
self.staticNav.hide('next')
self.staticNav.show('prev')
} else {
self.staticNav.show()
}
}
}
function pauseMedia() {
_localEvents.dispatchEvent(PAUSE_MEDIA)
}
function addressAssetChange(e) {
_sysEvents.dispatchEvent(ADDRESS_ASSET_CHANGE, e)
}
function pageLoaded() {
_sysEvents.dispatchEvent(PAGE_LOADED)
}
function layoutModelChange(e) {
_localEvents.dispatchEvent(LAYOUT_MODEL_CHANGE, e)
if(self.section && e.id !== 'layoutModelInit' && (contactSettings.test(e.id) || imageVideoSettings.test(e.id) || textPageSettings.test(e.id) || landingMediaSettings.test(e.id))) {
_localEvents.dispatchEvent('SectionMediaFactory/buildItems', {section:self.section, media:removeLinksFromMedia(self.section.media)})
_localEvents.dispatchEvent('assetReset')
}
checkCaption(self)
}
function isPageOverride(value) {
return /page/.test(value)
}
function isImageVideoOverride(value) {
return /imageVideo|caption/.test(value)
}
function isThumbsOverlay(thumbnailType, mode) {
return /thumb/.test(mode) && thumbnailType !== 'strip'
}
function sectionsModelChange(e) {
if(self.section) {
STATE.section(self.section)
_localEvents.dispatchEvent(SECTIONS_MODEL_CHANGE, e);
if(e.method === 'update' && e.id === self.section.id && !isThumbsOverlay(STATE.overrides.thumbnailType, self.state.mode)) {
if(e.field === 'media') {
_localEvents.dispatchEvent('SectionMediaFactory/buildItems', {section:self.section, media:e.value ? removeLinksFromMedia(e.value) : []});
_localEvents.dispatchEvent('assetReset');
} else if(e.field === 'overrides') {
// that the current media item is a type of the override change
// if we want to filter more accurately we would need to know the actual override that changed
// this would require sending that info from higher up in the app
var overrideValue = JSON.stringify(e.value)
if(isPageOverride(overrideValue) && layoutCalcs._activeMediaType === 'html') {
_localEvents.dispatchEvent('SectionMediaFactory/buildItems', {section: self.section, media:removeLinksFromMedia(self.section.media)});
_localEvents.dispatchEvent('assetReset');
} else if(isImageVideoOverride(overrideValue) && /image|video/.test(layoutCalcs._activeMediaType)) {
_localEvents.dispatchEvent('SectionMediaFactory/buildItems', {section: self.section, media:removeLinksFromMedia(self.section.media)});
_localEvents.dispatchEvent('assetReset');
}
} else {
_localEvents.dispatchEvent('SectionMediaFactory/buildItems', {section: self.section, media:removeLinksFromMedia(self.section.media)});
_localEvents.dispatchEvent('assetReset');
if(e.field === 'slideshow') {
var mode = e.value ? 'landingMedia' : 'mediaView'
navigationMode = mode
self.mediaViewBehavior = self.behavior.navigationModeChange(mode)
var state = self.state
state.isLandingMedia = e.value
state.info.mediaViewState = mode
// this breaks due to possible race condition when building the items for the media view
// appears they aren't added yet...
self.mediaViewBehavior.uriChange(state)
}
}
checkCaption(self)
}
}
}
function settingsModelChange(e) {
_localEvents.dispatchEvent(SETTINGS_MODEL_CHANGE, e)
// isIntroGallery here so that you can show landingMedia on update
if(e.method === 'update' && self.section && (self.section.id === 'landingMedia' || self.section.isIntroGallery) && e.id === 'backgroundImages') {
_sysEvents.dispatchEvent('resetUriChange', e)
}
}
function mediaModelChange(e) {
_localEvents.dispatchEvent(MEDIA_MODEL_CHANGE, e)
if(e.method === 'update' && self.section && self.section.media.indexOf(e.id) > -1) {
_localEvents.dispatchEvent('SectionMediaFactory/buildItems', {section:self.section, media:removeLinksFromMedia(self.section.media)})
_localEvents.dispatchEvent('assetReset')
}
checkCaption(self)
}
function mediaBuilt(e) {
_localEvents.dispatchEvent('MediaView/ContentReady', e.media)
}
function layoutMediaView() {
_localEvents.dispatchEvent('layoutMediaView', {section:self.section})
if(isInit) _sysEvents.addEventListener(RESIZE_END, resize)
isInit = false
if(navigationMode === 'landingMedia' || self.mediaToRender.length < 2) {
_localEvents.dispatchEvent('hideCursor')
} else {
_localEvents.dispatchEvent('showCursor')
}
}
function resize() {
_localEvents.dispatchEvent(RESIZE)
STATE.section(self.section)
if(self.staticNav) {
self.staticNav.resize({
x: 0,
y: 0,
width: STATE.mediaView.zoneWidth(),
height: self.getTotalHeight()
})
}
}
function orientationChange() {
_localEvents.dispatchEvent(ORIENTATION_CHANGE)
}
function updateAssetId(e) {
if(self.state && self.state.assetId !== e.id) {
self.state.assetId = e.id
_sysEvents.dispatchEvent('updateAssetId', e)
}
}
function updateCaptions(e) {
// if(self.state.mode !== e.mode) {
if(self.section.key === e.section.key) {
self.state.mode = e.mode
_localEvents.dispatchEvent('checkCaption', e)
}
// }
}
function mediaLoaded(e) {
if(/video|vimeo/.test(e.type)) {
_localEvents.dispatchEvent('mediaSizeUpdate', e)
}
}
function transitionStart() {
_sysEvents.dispatchEvent(TRANSITION_START)
}
function transitionEnd() {
_sysEvents.dispatchEvent(TRANSITION_END)
}
function cursorAxisUpdate(e) {
self.cursorAxis = e
_sysEvents.dispatchEvent('cursorAxisUpdate', e)
}
function contactFormSubmit(e) {
_sysEvents.dispatchEvent(CONTACT_FORM_SUBMIT, e)
}
function shareFormSubmit(e) {
_sysEvents.dispatchEvent(SHARE_FORM_SUBMIT, e)
}
function inquiryFormSubmit(e) {
_sysEvents.dispatchEvent(INQUIRY_FORM_SUBMIT, e)
}
function contactFormSent(e) {
_localEvents.dispatchEvent(CONTACT_FORM_SENT, e)
}
function shareFormSent(e) {
_localEvents.dispatchEvent(SHARE_FORM_SENT, e)
}
function inquiryFormSent(e) {
_localEvents.dispatchEvent(INQUIRY_FORM_SENT, e)
}
function overlayBtnClick(e) {
_sysEvents.dispatchEvent(NAVBAR_OVERLAY_BTN_CLICK, e)
}
function touchNavEnd(e) {
_sysEvents.dispatchEvent(TOUCH_NAVIGATION_END, e)
}
}
MediaController.prototype = {
checkCaption: function() {
var self = this
checkCaption(self)
},
createStaticNav: function() {
var self = this
if(!isPod() && sectionHasMedia(self.section) && LAYOUT_MODEL.navCursorType === 'static' && !isSlideshowGallery(self.section)) {
self.staticNav = self.buildStaticNav()
self.updateStaticNav(self.state)
self.mediaView.addChild(self.staticNav)
} else if(LAYOUT_MODEL.navCursorType !== 'static' && self.staticNav) {
self.staticNav.hide()
}
},
destroyStaticNav: function() {
var self = this
if(self.staticNav && self.staticNav.element) {
self.mediaView.removeChild(self.staticNav)
}
},
updateState: function(newState) {
var self = this
self.state = newState
if(self.mediaViewBehavior) self.mediaViewBehavior.updateState(newState)
},
build: function(e, mediaBehaviorInitInsteadOfTransition) {
var self = this
// need to duplicate some of the code from navigate in here
// because we were getting sequencing issues
self.mediaView.section = e.section
self.state = e
navigationMode = e.info.mediaViewState
self.section = JSON.parse(JSON.stringify(e.section))
self.mediaToRender = e.mediaToRender
STATE.section(self.section)
if(isSlideshowGallery(self.section) && self.mediaToRender && STATE.overrides.slideshowRandomize) {
self.mediaToRender = shuffleArray(self.mediaToRender)
}
if(e.assetId > -1) {
var activeMediaItem = getMediaById(e.mediaToRender[e.assetId])
layoutCalcs.activeMediaType = activeMediaItem.type
}
self.createStaticNav()
// if(e.info.isMediaViewStateChange) {
self.mediaViewBehavior = self.behavior.navigationModeChange(e.info.mediaViewState)
// }
if(isSlideshowGallery(self.section) || (!STATE.overrides.thumbnailOnly || e.assetId > -1)) {
self.localEvents.dispatchEvent('SectionMediaFactory/buildItems', {
media:self.mediaToRender,
isMobileVideoClick:e.info.isMobileVideoClick,
isBlog:e.info.isBlog,
section:self.section,
state:self.state
})
// } else {
// layoutCalcs._mediaContentHeight = STATE.mediaView.zoneHeight()
// _sysEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT')
}
self.overlayController.uriChange(e)
if(mediaBehaviorInitInsteadOfTransition) {
self.mediaViewBehavior.init(e)
} else if(!/unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior) || (USER_AGENT === MOBILE || isPod() || USER_AGENT === TABLET || isPad())) {
// mSlide needs uriChange to define the first viewable media item
self.mediaViewBehavior.uriChange(e)
} else {
self.mediaViewBehavior.init(e)
}
checkCaption(self)
},
getCurrentAssetId: function() {
return this.state ? this.state.assetId : 0
},
getCurrentMode: function() {
return this.state ? this.state.mode : ''
},
navigate: function(e) {
var self = this
self.state = e
self.mediaView.section = e.section
navigationMode = e.info.mediaViewState
self.section = JSON.parse(JSON.stringify(e.section))
self.mediaToRender = e.mediaToRender
STATE.section(self.section)
if(e.assetId > -1 && !(/unifiedSiteScroll/.test(STATE.overrides.siteDisplayBehavior))) {
var activeMediaItem = getMediaById(e.mediaToRender[e.assetId])
layoutCalcs.activeMediaType = activeMediaItem.type
}
// if(e.info.isMediaViewStateChange) {
// this.localEvents.dispatchEvent('MediaViewBehavior/navigationModeChange', e.info.mediaViewState)
// }
if(self.staticNav) self.updateStaticNav(e)
self.overlayController.uriChange(e)
self.mediaViewBehavior.uriChange(e)
self.localEvents.dispatchEvent('siteUriChange', e)
checkCaption(self)
},
destroy: function() {
var self = this
self.localEvents.dispatchEvent('destroy')
self.mediaView.destroy()
self.overlayController.destroy()
self.mediaViewBehavior.destroy()
if(self.staticNav && self.staticNav.element) {
// console.log('remove static nav media controller')
self.mediaView.removeChild(self.staticNav)
}
}
}
var checkCaptionTimer
function checkCaption(self) {
clearTimeout(checkCaptionTimer)
checkCaptionTimer = setTimeout(function() {
if(self.state && self.state.mode.indexOf('caption') > -1 && USER_AGENT !== MOBILE) {
self.localEvents.dispatchEvent('showCaption', self.state)
} else {
self.localEvents.dispatchEvent('hideCaption', self.state)
}
}, 350)
}
return MediaController
}())
var MediaModule = function(imports) {
function MediaModule(siteEvents, siteView, isOverlay, maxScroll) {
var _mediaModuleEvents = new EventSandbox();
var mediaController = new MediaController(_mediaModuleEvents, siteEvents);
var mediaView
if(isOverlay) {
mediaView = new MediaOverlay({localEvents:_mediaModuleEvents, siteView:siteView});
} else {
mediaView = new MediaView({localEvents:_mediaModuleEvents, siteView:siteView});
}
siteView.addChild(mediaView)
if(maxScroll) mediaView.maxScroll = maxScroll
var sectionMediaFactory = new SectionMediaFactory({localEvents:_mediaModuleEvents});
mediaController.behavior = new MediaViewBehavior({localEvents:_mediaModuleEvents, siteView:siteView, mediaView:mediaView});
mediaController.overlayController = new OverlayController({siteEvents:siteEvents, localEvents:_mediaModuleEvents, siteView:siteView, mediaView:mediaView});
mediaController.mediaView = mediaView
return {
controller: mediaController,
view: mediaView,
events: _mediaModuleEvents,
destroy: function() {
mediaViewBehavior.destroy()
_mediaModuleEvents.listeners = null
_mediaModuleEvents = null
}
}
}
return MediaModule;
}({
});
function MediaNavigation(imports) {
var _localEvents = imports.localEvents
var _mediaView = imports.mediaView
var _mediaViewContainer = imports.mediaView.container
var transition
var layoutFn
var layout
var contentIsReady = false
var state = {assetId:0}
var transitionType
var isOrientationChange
var _scrollAssetId = 0
var self = this
_localEvents.addEventListener('layoutMediaView', layoutMediaView);
_localEvents.addEventListener(SECTIONS_MODEL_CHANGE, layoutModelChange);
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.addEventListener(RESIZE, mediaNavigationResize);
_localEvents.addEventListener(ORIENTATION_CHANGE, orientationChange);
_localEvents.addEventListener('mediaSizeUpdate', mediaSizeUpdate);
_localEvents.addEventListener('MEDIA_HEIGHT_CHANGE', mediaSizeUpdate);
// _localEvents.addEventListener('siteUriChange', siteUriChange);
_localEvents.addEventListener('assetReset', assetReset);
_localEvents.addEventListener(TOUCH_NAVIGATION_MOVE, function(e) {
if(isStartOfGallery() && e === 'prev') {
if(self.touchNav) self.touchNav.disabled = true
// } else {
// if(self.touchNav) self.touchNav.disabled = false
}
});
_localEvents.addEventListener(MENU_DOCK_CLOSE, function(e) {
if(self.touchNav) self.touchNav.disabled = false
});
_localEvents.addEventListener(TOUCH_NAVIGATION_END, touchNavEnd);
_localEvents.addEventListener('ScrollTransition/updateAssetId', updateAssetId);
function touchNavEnd(e) {
if(state.assetId === 1 && e.swipeDirection === 'right') {
// to allow menu open swipe
if(self.touchNav) self.touchNav.disabled = true
} else {
if(self.touchNav) self.touchNav.disabled = false
}
if(e.isMove) {
if(isStartOfGallery() && e.swipeDirection === 'right') {
assetReset();
} else if(isEndOfGallery() && e.swipeDirection === 'left') {
assetReset();
} else if(e.swipeDirection === 'left' || e.swipeDirection === 'right') {
e.navDir = e.swipeDirection === 'left' ? 'next' : 'prev';
_localEvents.dispatchEvent(ADDRESS_ASSET_CHANGE, e);
} else {
assetReset();
}
} else if(e.isMove && /left|right/.test(e.swipeDirection)) {
assetReset();
}
}
function mediaSizeUpdate(){
if(!layout) {
defineTransition();
}
if(transitionType === 'mSlide' && !self.touchNav) defineTouchNav()
layout(state.assetId);
if(!/scroll/i.test(transitionType)) assetReset();
}
function isStartOfGallery() {
return state.assetId === 0;
}
function isEndOfGallery() {
return state.assetId === csvToArray(state.section.media).length - 1;
}
function defineTouchNav() {
self.touchNav = new TouchNavMobile({events:_localEvents, mediaViewContainer:_mediaViewContainer});
self.touchNav.section = (state.section && state.section.key) || 'no section'
}
function defineTransition() {
STATE.section(state.section)
if(_mediaView.scroll) {
_mediaView.scroll.destroy();
_mediaView.scroll = null;
}
transitionType = STATE.overrides.transitionType;
// Desktop-Version Mobile/iPad full image nav stuck #1015
var lazyLoaderType = transitionType === 'fade' || transitionType === 'mSlide' ? 'fade' : 'default';
var container = _mediaView.container
var mask = _mediaView.mask
_mediaView.lazyLoader = new LazyLoader(container, mask, {
type:lazyLoaderType,
property:'translate'
});
_mediaView.lazyLoader.name = 'mediaView'
if(transition && typeof transition.destroy === 'function') transition.destroy()
_localEvents.dispatchEvent('cursorAxisUpdate', getCursorAxis(transitionType))
var transitionDuration = STATE.mediaView.transitionDuration()
switch(transitionType) {
case 'fade':
layoutFn = new FadeLayout({siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
transition = new FadeTransition({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
break;
case 'hSlide':
layoutFn = new SlideLayoutHorizontal({siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
transition = new SlideTransitionHorizontal({transitionDuration: transitionDuration, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
break;
case 'vSlide':
layoutFn = new SlideLayoutVertical({siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
transition = new SlideTransitionVertical({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
break;
case 'hScroll':
layoutFn = new ScrollLayoutHorizontal({siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
transition = new ScrollTransitionHorizontal({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
break;
case 'hScrollNC':
layoutFn = new ScrollLayoutHorizontalNoCrop({siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
transition = new ScrollTransitionHorizontalNoCrop({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
break;
case 'vScroll':
layoutFn = new ScrollLayoutVertical({siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
transition = new ScrollTransitionVertical({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
break;
case 'vScrollNC':
layoutFn = new ScrollLayoutVerticalNoCrop({siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
transition = new ScrollTransitionVerticalNoCrop({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
break;
case 'grid':
layoutFn = new GridLayout({siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
transition = new GridTransition({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
break;
case 'mSlide':
layoutFn = new MobileSlideLayout({siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
transition = new MobileSlideTransition({transitionDuration: transitionDuration, siteView:imports.siteView, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents});
break;
case 'vScrollStatic':
layoutFn = new StaticVLayout({siteView:imports.siteView, mediaView:_mediaView, localEvents:_localEvents});
transition = new StaticVTransition();
break;
}
layout = function() {
STATE.section(state.section)
layoutFn(state.assetId)
}
}
this.init = function(e) {
state = e;
// need to set container to zero so there isn't a flash of the gallery before thumbnail
// overlay shows. #1362
_mediaViewContainer.transition = 0;
_mediaViewContainer.alpha = 0;
// delay here for overlay transition
if(!layout) defineTransition()
if(transitionType === 'mSlide' && !self.touchNav) defineTouchNav()
layout(state.assetId)
// delay of 1000 seemed to do the trick
setTimeout(function() {
Tween(_mediaViewContainer, STATE.mediaView.transitionDuration(), {alpha:1})
}, 1000)
}
this.updateState = function(newState) {
state = newState
}
this.uriChange = function siteUriChange(e, mediaBehaviorInitInsteadOfTransition) {
state = e;
STATE.section(state.section)
var hasContent = _mediaViewContainer.children.length > 0;
if(state.mediaToRender && hasContent) {
if(!mediaBehaviorInitInsteadOfTransition) {
if(state.mode.indexOf('thumbs') !== -1 && state.assetId === -1) {
_mediaViewContainer.transition = 0;
_mediaViewContainer.alpha = 0;
}
// } else if(_mediaViewContainer.alpha !== 1) {
// _mediaViewContainer.transition = 0;
// _mediaViewContainer.alpha = 1;
// }
if(state.assetId > -1) {
if(state.info.isDeeplink) {
jumpToAsset(state.assetId);
} else if(STATE.siteView.unifiedPageScroll() && state.info.isModeChange && /fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(state.mode)) {
_mediaViewContainer.transition = 0;
_mediaViewContainer.alpha = 0;
// delay here for overlay transition
setTimeout(function() {
Tween(_mediaViewContainer, STATE.mediaView.transitionDuration(), {alpha:1})
}, UPDATE_SPEED * 1000 + 10)
} else if(state.info.isModeChange && /fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(state.info.lastUri)) {
// prevent animated scroll for this situation
// this setTimeout is here because of the delay in OverlayController for setScrollPosition on thumbs
// we need this to fire after setScrollPosition
_mediaViewContainer.transition = 0;
_mediaViewContainer.alpha = 0;
if(STATE.siteView.unifiedPageScroll()) {
// delay here for overlay transition
setTimeout(function() {
jumpToAsset(state.assetId);
Tween(_mediaViewContainer, STATE.mediaView.transitionDuration(), {alpha:1})
}, UPDATE_SPEED * 1000 + 10)
} else {
// Image Flickering when making new image selection from thumbs #1052
// jumpToAsset then
// wait for thumbnail grid fade out before
// fade in mediaViewContainer
jumpToAsset(state.assetId);
setTimeout(function() {
Tween(_mediaViewContainer, STATE.mediaView.transitionDuration(), {alpha:1})
}, UPDATE_SPEED * 500)
}
} else if(state.info.isModeChange && /fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(state.mode)) {
// capturing this situation to not fire a transition
} else {
if(!transition) defineTransition();
if(transitionType === 'mSlide' && !self.touchNav) defineTouchNav()
if(self.touchNav) {
if(stage.zoom === 1 && USER_AGENT === MOBILE && !STATE.podUseDesktop) {
// fix for text on mobile with images #1214
// not sure if the check should be isPod or USER_AGENT/Mobile
_mediaView.mask.element.scrollTo(0, 0);
}
Tween(_mediaViewContainer, STATE.mediaView.transitionDuration(), {alpha:1})
transition(state.assetId, state.info.flickSpeed, self.touchNav.swipeDirection)
} else if(state.info.isSectionChange) {
_mediaViewContainer.transition = 0;
// if(STATE.overrides.siteDisplayBehavior !== 'unifiedSiteScrollVertical') _mediaViewContainer.alpha = 0;
transition(state.assetId, state.info.flickSpeed)
// delay here for overlay transition
setTimeout(function() {
Tween(_mediaViewContainer, STATE.mediaView.transitionDuration(), {alpha:1})
}, UPDATE_SPEED * 1000 + 10)
} else {
Tween(_mediaViewContainer, STATE.mediaView.transitionDuration(), {alpha:1})
transition(state.assetId, state.info.flickSpeed)
}
}
}
}
if(state.assetId > -1 && !(/fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(e.mode)) && STATE.mediaView.videoAutoPlay()) {
var mediaId = _mediaViewContainer.children[state.assetId] && _mediaViewContainer.children[state.assetId].id;
_localEvents.dispatchEvent('mediaAutoPlay', mediaId);
} else if(!(/fill|vMasonry|hMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(e.mode)) && USER_AGENT === MOBILE) {
var mediaId = _mediaViewContainer.children[state.assetId] && _mediaViewContainer.children[state.assetId].id;
var mediaItem = MEDIA_MODEL[mediaId]
if(mediaItem && mediaItem.type === 'video' && mediaItem.content.indexOf('vimeo') !== 0 && STATE.mediaView.videoAutoPlay()) {
_localEvents.dispatchEvent('mediaAutoPlay', mediaId);
}
}
if(state.assetId > -1 && _mediaViewContainer.children[state.assetId] && _mediaViewContainer.children[state.assetId].type === 'html') {
_localEvents.dispatchEvent(PAGE_LOADED);
}
if(self.touchNav) self.touchNav.assetId = e.assetId
}
}
function assetReset() {
var transitionSpeed = isPod() || isPad() ? 0 : 0.85
if(stage.zoom === 1) {
if(state.mediaToRender && state.mediaToRender.length > state.assetId && transition) {
if(state.assetId > -1) transition(state.assetId, transitionSpeed);
} else if(transition) {
transition(0, transitionSpeed);
}
}
}
function jumpToAsset(assetId) {
transition(assetId, 0);
}
function mediaNavigationResize() {
if(stage.zoom === 1 && isAppleMobile() && !STATE.podUseDesktop) {
window.scrollTo(1, 0);
}
if(layout) layout(state.assetId);
if((state.mediaToRender && state.mediaToRender.length > 0 && state.assetId > -1)) {
if(!transition) defineTransition();
if(transitionType === 'mSlide' && !self.touchNav) defineTouchNav()
// need to figure out a way to prevent resize transition for mobile browsers when browser chrome reduces on scroll
if(!/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) jumpToAsset(state.assetId);
}
isOrientationChange = false;
if(_mediaView && _mediaView.lazyLoader) _mediaView.lazyLoader.update()
}
function orientationChange(e) {
isOrientationChange = true;
}
function layoutMediaView(e) {
layoutContent(e);
resetMediaViewContainer();
}
function layoutContent() {
defineTransition();
if(transitionType === 'mSlide' && !self.touchNav) defineTouchNav()
layout(state.assetId);
}
function layoutModelChange(e) {
if(e.id === 'siteDisplayBehavior') {
defineTransition()
}
if(transitionType === 'mSlide' && !self.touchNav) defineTouchNav()
if(layout) layout(state.assetId);
}
function isCurrentSection(section, state) {
return section.key === state.section.key
}
var updateAssetIdTimer
function updateAssetId(e) {
var mediaId
clearTimeout(updateAssetIdTimer)
updateAssetIdTimer = setTimeout(function() {
_scrollAssetId = e.id;
if(state && isCurrentSection(_mediaView.section, state)) {
state.assetId = e.id;
}
}, 200)
}
function resetMediaViewContainer() {
_mediaViewContainer.transition = 0;
// setting translate values was causing flickering for video hud #1360 & #1364
// may still be an issue for legacy site on mobile
if(Math.abs(_mediaViewContainer.translateX) > 0) _mediaViewContainer.translateX = 0;
if(Math.abs(_mediaViewContainer.translateY) > 0) _mediaViewContainer.translateY = 0;
_mediaViewContainer.x = 0;
_mediaViewContainer.y = 0;
// this is to allow for gallery overlay transparency
var backgroundColor = STATE.mediaView.backgroundColor() //STATE.overrides.siteDisplayBehavior === 'overlay' ? toRgba(STATE.mediaView.backgroundColor(), LAYOUT_MODEL.mediaOverlayAlpha || 1) : STATE.mediaView.backgroundColor()
Tween(_mediaViewContainer, UPDATE_SPEED, {backgroundColor:backgroundColor});
}
function destroy() {
if(transition && transition.destroy) transition.destroy();
layout = undefined;
transition = undefined;
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.removeEventListener(SECTIONS_MODEL_CHANGE, layoutModelChange);
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.removeEventListener(RESIZE, mediaNavigationResize);
_localEvents.removeEventListener(ORIENTATION_CHANGE, orientationChange);
// _localEvents.removeEventListener('siteUriChange', siteUriChange);
_localEvents.removeEventListener('layoutMediaView', layoutMediaView);
_localEvents.removeEventListener('mediaSizeUpdate', mediaSizeUpdate);
_localEvents.removeEventListener('MEDIA_HEIGHT_CHANGE', mediaSizeUpdate);
_localEvents.removeEventListener('assetReset', assetReset);
_localEvents.removeEventListener(TOUCH_NAVIGATION_END, touchNavEnd);
_localEvents.removeEventListener('ScrollTransition/updateAssetId', updateAssetId);
if(_mediaView.scroll) _mediaView.scroll.destroy();
if(self.touchNav) self.touchNav.destroy();
self.touchNav = null;
_mediaView.scroll = null;
}
this.destroy = destroy
// _localEvents.addEventListener('destroy', destroy)
return self
}
function MediaSlideshow(vars) {
var _localEvents = vars.localEvents,
_mediaView = vars.mediaView,
_mediaViewContainer = vars.mediaView.container,
assetLength = 0,
slideShowTimer,
transition,
layout,
_assetId = -1,
landingMediaTransitionType,
randomized = []
var state = {}
_localEvents.addEventListener('layoutMediaView', layoutMediaView)
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange)
_localEvents.addEventListener(SETTINGS_MODEL_CHANGE, settingsModelChange)
_localEvents.addEventListener(RESIZE, mediaSlideshowResize)
_localEvents.addEventListener('mediaSizeUpdate', layoutContent)
_localEvents.addEventListener('assetReset', assetReset)
this.init = function(e) {
this.uriChange(e)
}
this.updateState = function(newState) {
state = newState
}
this.uriChange = function siteUriChange(e) {
state = e
// kent added this !slideShowTimer filter because both .init and uriChange were getting called on site init
// from MediaController
// causing the first slide to not play full timer length and quickly changed to 2nd slide
// may not be the right fix
if(!slideShowTimer) {
assetLength = _mediaViewContainer.children.length
var section = vars.mediaView.section
STATE.section(section)
var mediaItem = getMediaById(section.media[0])
// var mediaViewItem = _mediaViewContainer.children[0]
if(assetLength && (assetLength > 1 || mediaItem.type === 'video')) {
if(slideShowTimer) slideShowTimer.destroy()
initSlideShow()
} else {
singleMediaItem()
}
}
}
function mediaLoaded(e) {
var mediaViewItem = _mediaViewContainer.children[_assetId]
if(mediaViewItem.type === 'image') {
setTimeout(function(){
if(!transition) defineTransition()
transition(_assetId)
slideShowTimer.resume()
}, 1000)
} else if(mediaViewItem.type === 'video') {
if(!transition) defineTransition()
mediaViewItem.autoPlay()
setTimeout(function(){
transition(_assetId)
}, 1000)
}
}
function getMediaByAssetId(assetId) {
var mediaViewItem = _mediaViewContainer.children[_assetId]
return mediaViewItem && getMediaById(mediaViewItem.id)
}
function singleMediaItem() {
_assetId = 0
transition(_assetId)
_localEvents.dispatchEvent('siteAnchorCaptionUpdate', getMediaByAssetId(_assetId))
_localEvents.dispatchEvent('showCaption', state)
}
_localEvents.addEventListener('playbackEnd', playbackEnd)
function slideShow() {
_assetId = setAssetId()
state.assetId = _assetId
var mediaViewItem = _mediaViewContainer.children[_assetId]
if(isLogin) {
transition(_assetId)
slideShowTimer.pause()
} else if(mediaViewItem.type === 'video' && mediaViewItem.loaded) {
slideShowTimer.pause()
mediaViewItem.autoPlay()
setTimeout(function(){
transition(_assetId)
}, 350)
} else if(mediaViewItem.type === 'video') {
slideShowTimer.pause()
mediaViewItem.addEventListener(MEDIA_LOADED, mediaLoaded)
mediaViewItem.autoPlay()
// setTimeout(function(){
// transition(_assetId)
// mediaViewItem.autoPlay()
// }, 100)
} else if(/html/.test(mediaViewItem.type)) {
transition(_assetId)
} else if(/image/.test(mediaViewItem.type) && mediaViewItem.loaded) {
transition(_assetId)
} else if(/image/.test(mediaViewItem.type) && !mediaViewItem.loaded) {
slideShowTimer.pause()
mediaViewItem.addEventListener(MEDIA_LOADED, mediaLoaded)
}
_localEvents.dispatchEvent('siteAnchorCaptionUpdate', getMediaByAssetId(_assetId))
if(LAYOUT_MODEL.slideshowCaptions) {
_localEvents.dispatchEvent('showCaption', state)
} else {
_localEvents.dispatchEvent('hideCaption', state)
}
_mediaView.lazyLoader.update()
}
function playbackEnd(e) {
slideShowTimer.resume()
slideShow()
}
function setAssetId() {
return _assetId < assetLength - 1 ? _assetId + 1 : 0
}
function assetReset() {
if(transition) transition(_assetId)
}
function initSlideShow() {
STATE.section(vars.mediaView.section)
slideShowTimer = new Timer(slideShow, STATE.overrides.slideshowSpeed, {loop:true})
slideShowTimer.start()
slideShow()
}
function defineTransition() {
STATE.section(vars.mediaView.section)
transitionType = STATE.overrides.slideshowTransitionType
var lazyLoaderType = transitionType === 'fade' ? 'fade' : 'default'
_mediaView.lazyLoader = new LazyLoader(_mediaView.container, _mediaView.mask, {
type:lazyLoaderType,
property:'translate'
})
// true is 'isSlideShow'
var transitionDuration = STATE.mediaView.transitionDuration(true)
switch(STATE.overrides.slideshowTransitionType) {
case 'fade':
layout = new FadeLayout({mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
transition = new FadeTransition({transitionDuration: transitionDuration, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
break
case 'hSlide':
layout = new SlideLayoutHorizontal({mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
transition = new SlideTransitionHorizontal({transitionDuration: transitionDuration, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
break
case 'vSlide':
layout = new SlideLayoutVertical({mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
transition = new SlideTransitionVertical({transitionDuration: transitionDuration, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
break
case 'grid':
layout = new GridLayout({mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
transition = new GridTransition({transitionDuration: transitionDuration, mediaView:_mediaView, mediaViewContainer:_mediaViewContainer, localEvents:_localEvents})
break
}
layoutContent()
}
function mediaSlideshowResize(e) {
layoutContent(e)
assetReset()
}
function layoutMediaView(e) {
layoutContent(e)
}
function layoutContent(e) {
if(!layout) defineTransition()
layout()
}
function layoutModelChange(e) {
STATE.section(vars.mediaView.section)
if((e && e.id && /landingMediaRandomize|landingMediaTransitionType|landingMediaSpeed|landingMediaTransitionDuration|landingMediaAlignHorizontal|landingMediaAlignVertical|landingMediaScaleType/.test(e.id)) || transitionType !== STATE.overrides.transitionType || !layout) {
if(slideShowTimer) slideShowTimer.duration = STATE.overrides.slideshowSpeed
defineTransition()
transition(_assetId)
layout()
}
}
function settingsModelChange(e) {
}
function shuffle(array) {
var i = array.length,
j = 0,
temp
while (i--) {
j = Math.floor(Math.random() * (i+1))
temp = array[i]
array[i] = array[j]
array[j] = temp
}
return array
}
this.destroy = function() {
layout = undefined
transition = undefined
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange)
_localEvents.removeEventListener(RESIZE, mediaSlideshowResize)
_localEvents.removeEventListener('layoutMediaView', layoutMediaView)
_localEvents.removeEventListener(SETTINGS_MODEL_CHANGE, settingsModelChange)
_localEvents.removeEventListener('mediaSizeUpdate', layoutContent)
_localEvents.removeEventListener('assetReset', assetReset)
if(slideShowTimer) slideShowTimer.destroy()
}
defineTransition()
}
function MediaView(vars) {
var self = new Sprite()
var mask
var container
var _localEvents
self.section = vars.section
self.zIndex = STATE.mediaView.zIndex // ??? zIndex was undefined for mediaView and above logo on v16
mask = new Sprite();
mask.element.setAttribute('class', 'MediaView.mask');
self.overflow = 'hidden';
mask.overflow = 'hidden';
container = new Sprite();
if(BROWSER_NAME === 'Chrome') {
container.selectable = true
mask.selectable = true
}
container.element.setAttribute('class', 'MediaView.container');
mask.addChild(container);
_localEvents = vars.localEvents;
updateStyle();
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.addEventListener(SECTIONS_MODEL_CHANGE, sectionsModelChange);
_localEvents.addEventListener('MediaView/ContentReady', updateContent);
self.mask = mask;
self.container = container;
self.destroy = destroy
self.addChild(mask)
self.updateStyle = updateStyle
function sectionsModelChange(e) {
updateStyle();
}
function layoutModelChange(e) {
updateStyle();
}
function updateStyle() {
if(self.section) STATE.section(self.section)
Tween(container, UPDATE_SPEED, {backgroundColor:STATE.mediaView.backgroundColor()});
}
function updateContent(items) {
container.removeChildren(container);
var i = 0,
l = items.length;
for(; i < l; i++) {
container.addChild(items[i]);
}
_localEvents.dispatchEvent('MediaView/ContentAdded', container);
}
function destroy() {
container.removeChildren(container)
mask.removeChild(container)
vars.siteView.removeChild(self)
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.removeEventListener(SECTIONS_MODEL_CHANGE, sectionsModelChange);
_localEvents.removeEventListener('MediaView/ContentReady', updateContent);
}
return self
}
function MediaOverlay(vars) {
var self = new Sprite()
var mask
var container
var _localEvents
self.section = vars.section
self.zIndex = 100
self.alpha = 0
mask = new Sprite();
mask.element.setAttribute('class', 'MediaOverlay.mask');
mask.overflowX = 'hidden';
mask.overflowY = 'auto';
container = new Sprite();
if(BROWSER_NAME === 'Chrome') {
container.selectable = true
mask.selectable = true
}
container.element.setAttribute('class', 'MediaOverlay.container');
mask.element.style['-webkit-overflow-scrolling'] = 'touch'
self.position = 'fixed'
var closeBtn = new Svg();
closeBtn.element.style.zIndex = 500
closeBtn.cursor = 'pointer'
closeBtn.element.style['mix-blend-mode'] = LAYOUT_MODEL.mediaOverlayIconBlendMode || 'normal'
var icon = new Path();
icon.d = svgPaths.bigX;
icon.fill = 'none';
closeBtn.addChild(icon)
closeBtn.icon = icon;
function updateCloseBtn() {
closeBtn.width = (LAYOUT_MODEL.mediaOverlayIconSize || 36)
closeBtn.height = (LAYOUT_MODEL.mediaOverlayIconSize || 36)
icon.strokeWidth = LAYOUT_MODEL.mediaOverlayIconLineWidth || 1;
icon.stroke = LAYOUT_MODEL.mediaOverlayIconColor || '#FFF';
icon.scale = closeBtn.width / 40
if(LAYOUT_MODEL.mediaOverlayIconSide === 'right') {
closeBtn.right = LAYOUT_MODEL.mediaOverlayIconHOffset || 30
} else {
closeBtn.left = LAYOUT_MODEL.mediaOverlayIconHOffset || 30
}
closeBtn.y = LAYOUT_MODEL.mediaOverlayIconVOffset || 20
}
updateCloseBtn()
closeBtn.addEventListener('mouseover', function() {
Tween(closeBtn, 0.2, {alpha:0.8})
})
closeBtn.addEventListener('mouseout', function() {
Tween(closeBtn, 0.2, {alpha:1})
})
closeBtn.addEventListener('click', function() {
self.close(function() {
_localEvents.dispatchEvent('mediaOverlayClose')
})
})
self.open = function(cb) {
self.display = 'block'
// adding mediaOverlayState open for overlayview updateposition filter
layoutCalcs.mediaOverlayState = 'open'
Tween.defer(self, 0.35, {alpha:1, onComplete:function(){
// stage.disableScroll = true
// removed for bug #1517
// safari didnt like resetting the overflow x/y in stage
if(typeof cb === 'function') cb()
document.documentElement.style.overflowY = 'hidden'
document.documentElement.style.overflowX = 'hidden'
}})
}
function getDisplayMode() {
if(/unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) return 'multiple'
return 'single'
}
self.close = function(cb) {
// stage.disableScroll = false
// removed for bug #1517
// safari didnt like resetting the overflow x/y in stage
layoutCalcs.sectionDisplayMode = (layoutCalcs.lastSectionDisplayMode || getDisplayMode())
// adding mediaOverlayState closed for overlayview updateposition filter
layoutCalcs.mediaOverlayState = 'closed'
Tween(self, 0.35, {alpha:0, onComplete:function(){
self.display = 'none'
if(typeof cb === 'function') cb()
document.documentElement.style.overflowY = 'initial'
document.documentElement.style.overflowX = 'initial'
}})
}
mask.addChild(container);
_localEvents = vars.localEvents;
updateStyle();
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.addEventListener(SECTIONS_MODEL_CHANGE, sectionsModelChange);
_localEvents.addEventListener('MediaView/ContentReady', updateContent);
self.mask = mask;
self.container = container;
self.destroy = destroy
self.addChild(mask)
self.addChild(closeBtn)
self.updateStyle = updateStyle
function sectionsModelChange(e) {
updateStyle();
}
function layoutModelChange(e) {
updateCloseBtn()
updateStyle();
}
function updateStyle() {
if(self.section) STATE.section(self.section)
Tween(container, UPDATE_SPEED, {backgroundColor:toRgba(LAYOUT_MODEL.mediaOverlayColor || '#000', LAYOUT_MODEL.mediaOverlayAlpha || 1)});
}
function updateContent(items) {
container.removeChildren(container);
var i = 0,
l = items.length;
for(; i < l; i++) {
container.addChild(items[i]);
}
_localEvents.dispatchEvent('MediaView/ContentAdded', container);
}
function destroy() {
container.removeChildren(container)
mask.removeChild(container)
vars.siteView.removeChild(self)
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.removeEventListener(SECTIONS_MODEL_CHANGE, sectionsModelChange);
_localEvents.removeEventListener('MediaView/ContentReady', updateContent);
}
return self
}
function MediaViewBehavior(imports) {
var _localEvents = imports.localEvents,
_mediaView = imports.mediaView,
_mediaViewContainer = imports.mediaView.container,
viewMode,
behavior,
init;
return {
navigationModeChange: function(mode) {
viewMode = mode;
_mediaViewContainer.transition = 0;
_mediaViewContainer.alpha = 1;
switch(viewMode) {
case 'landingMedia':
behavior = new MediaSlideshow({localEvents:_localEvents, siteView:imports.siteView, mediaView:_mediaView});
break;
case 'mediaView':
behavior = new MediaNavigation({localEvents:_localEvents, siteView:imports.siteView, mediaView:_mediaView});
break;
default:
behavior = new MediaNavigation({localEvents:_localEvents, siteView:imports.siteView, mediaView:_mediaView});
break;
}
return behavior
},
destroy: function() {
if(behavior) behavior.destroy()
// _localEvents.removeEventListener('MediaViewBehavior/navigationModeChange', navigationModeChange);
behavior = null
}
}
}
function SectionMediaFactory(imports) {
var _localEvents = imports.localEvents;
_localEvents.addEventListener('SectionMediaFactory/buildItems', buildItems);
function buildItems(e) {
var i = 0,
media = e.media,
l = media.length,
mediaItems = [];
for(; i < l; i++) {
var mediaItem = getMediaById(media[i])
var item
var mediaVars = {
assetId: i,
size:mediaItem.size,
localEvents:_localEvents,
isBlog:e.isBlog,
mediaItem:mediaItem,
section:e.section,
state:e.state
}
STATE.section(e.section)
if(USER_AGENT === MOBILE) {
mediaVars.loaderColor = getLoaderColor(LAYOUT_MODEL.containerColorMobile || STATE.mediaView.backgroundColor())
} else if(USER_AGENT === TABLET) {
mediaVars.loaderColor = getLoaderColor(LAYOUT_MODEL.containerColorTablet || STATE.mediaView.backgroundColor())
} else {
mediaVars.loaderColor = getLoaderColor(STATE.mediaView.backgroundColor())
}
switch(mediaItem.type) {
case IMAGE:
item = new ImageView(mediaVars);
break;
case VIDEO:
mediaVars.isMobileVideoClick = e.isMobileVideoClick
item = new VideoView(mediaVars);
break;
case HTML:
item = new PageView(mediaVars);
break;
case CONTACT:
item = new ContactView(mediaVars);
break;
default:
break;
}
if(item) mediaItems.push(item);
}
_localEvents.dispatchEvent('SectionMediaFactory/mediaBuilt', {media:mediaItems});
}
}
function FadeLayout(imports) { // eslint-disable-line
var _container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView
function layout() {
_mediaView.mask.element.scrollLeft = 0
_mediaView.mask.element.scrollTop = 0
_mediaView.mask.element.style.overflow = 'hidden'
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0
var items = _container.children
var length = items.length
var firstItemHeight = 0
var galleryHeight = STATE.mediaView.height(_mediaView.section.key)
var isMaxScroll = _mediaView.maxScroll && /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)
if(isMaxScroll) {
galleryHeight = layoutCalcs.getMaxScrollSectionHeight(_mediaView)
}
for(; i < length; i++) {
var item = items[i]
var margins = isSlideshowGallery(_mediaView.section) && /fillSite/.test(STATE.mediaView.imageScaleType()) ?
{left:0, right:0, top:0, bottom:0} :
getMediaItemMargins(item.mediaItem.type)
if(i === 0) {
// item.alpha = 1
// use the first media item to define the height for all the media items for "max scroll"
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:galleryHeight - (margins.top + margins.bottom)
}, true)
} else {
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:(isMaxScroll ? items[0].height : galleryHeight) - (margins.top + margins.bottom)
}, false)
}
item.transition = 0
item.x = 0
item.y = 0
item.zIndex = 0
firstItemHeight = allowPageContentHeight(items[0], length) ? items[0].contentHeight : items[0].height
// firstItemHeight = items[0].height
}
_container.transition = 0
_container.translateX = 0
_container.translateY = 0
_container.x = 0
_container.y = 0
_container.width = STATE.mediaView.width()
_container.height = firstItemHeight || STATE.mediaView.height(_mediaView.section.key)
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
// layoutCalcs._mediaContentHeight = _container.height
_container.boundsHeight = _container.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', {gallery: _container.height})
}
function scaleItem(item, margins, range, isFirstItem) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type) || !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || isFillSiteSlideshow(_mediaView.section)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
item.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var scale = ScaleEngine(getScaleVars(item, range, STATE.mediaView.imageScaleType()))
// width of mediaItem has to be full mediaView.width so the item content
// will center
item.width = STATE.mediaView.width()
var scaledHeight = (isFirstItem ? scale.height : range.v)
if(/fitWidth|^fill$/.test(STATE.mediaView.imageScaleType()) && scale.height > range.v) scaledHeight = range.v
item.height = scaledHeight + margins.top + margins.bottom
}
item.updatePosition()
}
return layout
}
function FadeTransition(imports) { // eslint-disable-line
var _container = imports.mediaViewContainer
var _localEvents = imports.localEvents
var _mediaView = imports.mediaView
var _duration = imports.transitionDuration
var ease = TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut
// reset container translateX to 0
Tween(_container, 0, {translateX:0})
function transition(assetId, transitionDuration) {
transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
var i = 0
var items = _container.children
var length = items.length
_localEvents.dispatchEvent(TRANSITION_START)
for(; i < length; i++) {
var item = items[i]
item.i = i
if(i === assetId) {
currentIndex = i
if(item.x !== 0) {
item.transition = 0
item.x = 0
}
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update(assetId)
if(BROWSER_NAME === 'Mobile Safari') item.visibility = 'visible'
item.pointerEvents = 'auto'
item.zIndex = 100
Tween.defer(item, _duration, {alpha:1, ease:ease, onComplete: function(){
_localEvents.dispatchEvent(TRANSITION_END)
}})
} else {
item.pointerEvents = 'none'
item.zIndex = 0
if(item.alpha !== 0) Tween(item, transitionDuration, {alpha:0, ease:ease})
}
}
}
transition.destroy = function destroy() {
// you are a dummy
}
return transition
}
function GridLayout(imports) {
var _Tile = Tile,
_container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView;
function layout() {
_mediaView.mask.element.scrollLeft = 0
_mediaView.mask.element.scrollTop = 0
_mediaView.mask.element.style.overflow = 'hidden'
if(_mediaView.section) STATE.section(_mediaView.section)
var tile = new _Tile();
tile.gap = 0;
tile.axis = 'y';
tile.align = 'left';
tile.wrap = true;
tile.perpLength = STATE.mediaView.width() * 4;
var i = 0
var items = _container.children
var firstItemHeight
var length = items.length
var galleryHeight = STATE.mediaView.height(_mediaView.section.key)
var isMaxScroll = _mediaView.maxScroll && /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)
if(isMaxScroll) {
galleryHeight = layoutCalcs.getMaxScrollSectionHeight(_mediaView)
}
for(; i < length; i++) {
var item = items[i];
var margins = isSlideshowGallery(_mediaView.section) && /fillSite/.test(STATE.mediaView.imageScaleType()) ?
{left:0, right:0, top:0, bottom:0} :
getMediaItemMargins(item.mediaItem.type)
if(i === 0) {
// use the first media item to define the height for all the media items for "max scroll"
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:galleryHeight - (margins.top + margins.bottom)
}, true)
} else {
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:(isMaxScroll ? items[0].height : galleryHeight) - (margins.top + margins.bottom)
}, false)
}
item.transition = 0;
item.display = 'block';
item.alpha = 1;
var height = allowPageContentHeight(item, length) ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height);
firstItemHeight = items[0].height
}
tile.layoutItems();
for(i = 0; i < length; i++) {
var position = tile.getPosition(i);
items[i].x = position.x;
items[i].y = position.y;
}
var bounds = tile.getBounds();
_container.transition = 0;
_container.width = bounds.width;
_container.height = bounds.height;
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
// layoutCalcs._mediaContentHeight = STATE.mediaView.zoneHeight()
_container.boundsHeight = firstItemHeight
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', { gallery: firstItemHeight });
}
function scaleItem(item, margins, range, isFirstItem) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type) || !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || isFillSiteSlideshow(_mediaView.section)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
item.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var scale = ScaleEngine(getScaleVars(item, range, STATE.mediaView.imageScaleType()))
// width of mediaItem has to be full mediaView.width so the item content
// will center
item.width = STATE.mediaView.width()
var scaledHeight = (isFirstItem ? scale.height : range.v)
if(/fitWidth|^fill$/.test(STATE.mediaView.imageScaleType()) && scale.height > range.v) scaledHeight = range.v
item.height = scaledHeight + margins.top + margins.bottom
// item.height = (isFirstItem ? scale.height : range.v) + margins.top + margins.bottom
}
item.updatePosition()
}
return layout;
}
function GridTransition(imports) {
var _container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView;
var _duration = imports.transitionDuration
_localEvents.dispatchEvent(TRANSITION_START);
function transition(assetId, transitionDuration) {
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
var asset = _container.children[assetId];
if(asset) {
var assetX = asset.x;
var assetY = asset.y;
anime({
targets: _container,
duration: transitionDuration * 1000,
translateX: -assetX,
translateY: -assetY,
easing: TOUCH_DEVICE ? 'easeOutQuart' : 'easeInOutCubic',
complete: function() {
_localEvents.dispatchEvent(TRANSITION_END);
setTimeout(function() {
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
}, 360)
}
})
}
}
transition.destroy = function destroy() {
// dummy
}
return transition;
}
function ScrollLayoutHorizontal(imports) {
var _Tile = Tile,
_mediaView = imports.mediaView,
_localEvents = imports.localEvents,
_container = _mediaView.container,
_mask = _mediaView.mask
if(STATE.overrides.imageVideoScrollType === 'native') {
_mask.element.style.overflowY = 'hidden'
_mask.element.style.overflowX = 'scroll'
} else if(MAC_SCROLLBARS && (STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll)) {
_mask.element.style.overflowY = 'hidden'
_mask.element.style.overflowX = 'scroll'
} else {
if(_mediaView.scroll) _mediaView.scroll.destroy()
var scrollProps = {
name: 'horiz scroll',
types:['bar','wheel','touch'],
axis:'x',
align:'left',
color:STATE.overrides.imageVideoScrollbarColor,
hover:STATE.overrides.imageVideoScrollbarHover,
side:STATE.overrides.imageVideoScrollbarAlignment,
alpha:STATE.overrides.imageVideoScrollbarBgTransparency,
width:STATE.overrides.imageVideoScrollbarWidth,
offsetX:STATE.overrides.imageVideoScrollbarHorizontalOffset,
offsetY:STATE.overrides.imageVideoScrollbarVerticalOffset,
topPad:0,
// parent:imports.siteView,
property:'translate',
zIndex:STATE.mediaView.zIndex,
rounded:STATE.overrides.imageVideoScrollbarRounded,
visibility:STATE.overrides.imageVideoScrollbarVisibility
}
if(STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll) {
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'bottom'
scrollProps.alpha = 0
scrollProps.width = 7
scrollProps.offsetX = 0
scrollProps.offsetY = 0
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
_mediaView.scroll = new Scroll(_container, _mask, scrollProps)
}
function allowPageContentHeight(item, length) {
// limiting use to when page is only item in a horizontal gallery
return item.contentHeight && length === 1
}
function layout(assetId) {
var tile = new _Tile()
tile.gap = 0
tile.axis = 'x'
tile.align = 'left'
tile.wrap = false
tile.perpLength = STATE.mediaView.height(_mediaView.section.key)
if(_mediaView.section) STATE.section(_mediaView.section)
var galleryHeight = STATE.mediaView.height(_mediaView.section.key)
var isMaxScroll = _mediaView.maxScroll && /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)
if(isMaxScroll) {
galleryHeight = layoutCalcs.getMaxScrollSectionHeight(_mediaView)
}
var i = 0
var items = _container.children
var length = items.length
for(; i < length; i++) {
var item = items[i]
var margins = getMediaItemMargins(item.mediaItem.type)
if(i === 0) {
// use the first media item to define the height for all the media items for "max scroll"
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:galleryHeight - (margins.top + margins.bottom)
}, true)
} else {
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:(isMaxScroll ? items[0].height : galleryHeight) - (margins.top + margins.bottom)
}, false)
}
item.transition = 0
item.display = 'block'
var alpha = assetId === undefined || (!isNaN(assetId) && assetId === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
item.alpha = alpha
// item.contentHeight added for getting page text height from PageView
var height = allowPageContentHeight(item, length) ? item.contentHeight : item.height
tile.addItem(item.width, height)
}
tile.layoutItems()
for(i = 0; i < length; i++) {
var position = tile.getPosition(i)
items[i].x = position.x
items[i].y = position.y
}
var bounds = tile.getBounds()
_container.transition = 0
_container.width = bounds.width
_container.height = bounds.height
if(_mediaView.scroll) {
setTimeout(function(){
if(_mediaView.scroll) {
_mediaView.scroll.resize()
}
}, (STATE.mediaView.transitionDuration() * 1000) + 550)
}
if(_mediaView.lazyLoader) {
if(isPod() || isPad()) {
_mediaView.lazyLoader.domElementScroll = true
} else if(MAC_SCROLLBARS && (/native/.test(STATE.overrides.imageVideoScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
_mediaView.lazyLoader.domElementScroll = true
}
if(!_mediaView.scroll) {
_mediaView.lazyLoader.property = false
}
_mediaView.lazyLoader.update()
}
// layoutCalcs._mediaContentHeight = bounds.height
_container.boundsHeight = bounds.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', {gallery: bounds.height})
}
function scaleItem(item, margins, range, isFirstItem) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.overrides.pageMaxWidth || STATE.mediaView.width()
item.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var scale = ScaleEngine(getScaleVars(item, range, STATE.mediaView.imageScaleType()))
item.width = scale.width + margins.left + margins.right
if(/unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
var scaledHeight = (isFirstItem ? scale.height : range.v)
if(/fitWidth|^fill$/.test(STATE.mediaView.imageScaleType()) && scale.height > range.v) scaledHeight = range.v
item.height = scaledHeight + margins.top + margins.bottom
// item.height = (isFirstItem ? scale.height : range.v) + margins.top + margins.bottom
} else {
item.height = STATE.mediaView.height()
}
}
item.updatePosition()
}
return layout
}
function ScrollTransitionHorizontal(imports) {
var _mediaView = imports.mediaView
var _container = _mediaView.container
var _mask = _mediaView.mask
var _localEvents = imports.localEvents
var _duration = imports.transitionDuration
var _scrollInteraction
var scrollTimer
var isScrollAnimation
var curAssetId
var anim
if(_mediaView.scroll) {
_mediaView.scroll.addEventListener('scrollStop', scrollStop)
_mediaView.scroll.addEventListener('scrollStart', scrollStart)
_mediaView.scroll.addEventListener(SCROLL, scroll)
} else {
_mask.element.addEventListener("scroll", scrollEvents)
}
function transition(assetId, transitionDuration) {
curAssetId = assetId
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
_localEvents.dispatchEvent(TRANSITION_START)
var asset = _container.children[assetId]
if(asset) {
var assetX = asset.x
var assetY = asset.y
var alignBehavior = getAlignBehavior(assetId, _container.children.length)
_mask.width = STATE.mediaView.width()
var hAlign = AlignEngine({width:asset.width, hRange:_mask.width, hAlign:alignBehavior})
assetX = asset.x - hAlign.x
isScrollAnimation = true
_scrollInteraction = false
if(_mediaView.scroll) {
var scollDist = _container.width - _mask.width
var percent = assetX / scollDist
_mediaView.scroll.percent = percent
_mediaView.scroll.bar.moveHandle(STATE.mediaView.transitionDuration())
Tween(_container, transitionDuration, {translateX:-assetX, translateY:-assetY, ease:TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut, onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 360)
}})
// anime({
// targets: _container,
// duration: transitionDuration * 1000,
// translateX: -assetX,
// translateY: -assetY,
// easing: TOUCH_DEVICE ? 'easeOutQuart' : 'easeInOutCubic',
// complete: function() {
// isScrollAnimation = false
// _scrollInteraction = undefined
// _localEvents.dispatchEvent(TRANSITION_END)
// setTimeout(function() {
// if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
// }, 360)
// }
// })
} else {
if(transitionDuration) {
if(anim) anim.kill()
anim = Anim.to(_mask, transitionDuration, {scrollLeft:assetX, scrollTop:assetY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}})
} else {
setTimeout(function() {
_mask.scrollLeft = assetX
_mask.scrollTop = assetY
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}, 10)
}
}
_scrollInteraction ? setAllActive() : setActiveAlpha(assetId)
}
}
transition.destroy = function destroy() {
if(_mediaView.scroll) {
_mediaView.scroll.removeEventListener('scrollStop', scrollStop)
_mediaView.scroll.removeEventListener('scrollStart', scrollStart)
_mediaView.scroll.removeEventListener(SCROLL, scroll)
} else if(_mask.element) {
_mask.element.removeEventListener("scroll", scrollEvents)
}
}
function setActiveAlpha(activeIndex) {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var alpha = activeIndex === undefined || (!isNaN(activeIndex) && activeIndex === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
Tween(child, STATE.mediaView.transitionDuration(), {alpha:alpha})
}
}
function setAllActive() {
var i = _container.children.length
while(i--) {
Tween(_container.children[i], STATE.mediaView.transitionDuration(), {alpha:1})
}
}
function getAlignBehavior(assetId, arrLen) {
if(assetId === 0) {
return 'left'
} else if(assetId === arrLen - 1) {
return 'right'
}
return STATE.mediaView.hAlign()
}
function getCurrentAssetPosition() {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var mediaViewCenter = _mask.width * 0.5
if(_mediaView.scroll) {
if(-_container.translateX + mediaViewCenter >= child.x && -_container.translateX + mediaViewCenter <= child.x + child.width) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
} else {
if(_mask.scrollLeft + mediaViewCenter >= child.x && _mask.scrollLeft + mediaViewCenter <= child.x + child.width) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
}
}
}
function scrollStart(e) {
_localEvents.dispatchEvent('mediaScrollStart')
if(_scrollInteraction !== false) _localEvents.dispatchEvent('pauseMedia')
// if(_scrollInteraction === false && anim) {
// anim.kill()
// }
isScrollAnimation ? setActiveAlpha(curAssetId) : setAllActive()
}
function scrollStop(e) {
if(_scrollInteraction) {
getCurrentAssetPosition()
}
if(_scrollInteraction !== false) _scrollInteraction = undefined
}
function scroll(e) {
if(_scrollInteraction === undefined) _scrollInteraction = true
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
if(_scrollInteraction) {
getCurrentAssetPosition()
}
}
function scrollEvents(e) {
if(!scrollTimer) scrollStart(e)
clearTimeout(scrollTimer)
scroll(e)
scrollTimer = setTimeout(function() {
scrollStop(e)
scrollTimer = null
}, 300)
}
return transition
}
function ScrollLayoutHorizontalNoCrop(imports) {
var _Tile = Tile,
_mediaView = imports.mediaView,
_localEvents = imports.localEvents,
_container = _mediaView.container,
_mask = _mediaView.mask
if(STATE.overrides.imageVideoScrollType === 'native') {
_mask.element.style.overflowY = 'hidden'
_mask.element.style.overflowX = 'scroll'
} else if(MAC_SCROLLBARS && (STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll)) {
_mask.element.style.overflowY = 'hidden'
_mask.element.style.overflowX = 'scroll'
} else {
if(_mediaView.scroll) _mediaView.scroll.destroy()
var scrollProps = {
name: 'horiz scroll',
types:['bar','wheel','touch'],
axis:'x',
align:'left',
color:STATE.overrides.imageVideoScrollbarColor,
hover:STATE.overrides.imageVideoScrollbarHover,
side:STATE.overrides.imageVideoScrollbarAlignment,
alpha:STATE.overrides.imageVideoScrollbarBgTransparency,
width:STATE.overrides.imageVideoScrollbarWidth,
offsetX:STATE.overrides.imageVideoScrollbarHorizontalOffset,
offsetY:STATE.overrides.imageVideoScrollbarVerticalOffset,
topPad:0,
// parent:imports.siteView,
property:'translate',
zIndex:STATE.mediaView.zIndex,
rounded:STATE.overrides.imageVideoScrollbarRounded,
visibility:STATE.overrides.imageVideoScrollbarVisibility
}
if(STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll) {
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'bottom'
scrollProps.alpha = 0
scrollProps.width = 7
scrollProps.offsetX = 0
scrollProps.offsetY = 0
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
_mediaView.scroll = new Scroll(_container, _mask, scrollProps)
}
function layout(assetId) {
var tile = new _Tile()
tile.gap = 0
tile.axis = 'x'
tile.align = 'left'
tile.wrap = false
tile.perpLength = STATE.mediaView.height(_mediaView.section.key)
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0
var items = _container.children
var length = items.length
var galleryHeight = STATE.mediaView.height(_mediaView.section.key)
var isMaxScroll = _mediaView.maxScroll && /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)
if(isMaxScroll) {
galleryHeight = layoutCalcs.getMaxScrollSectionHeight(_mediaView)
}
for(; i < length; i++) {
var item = items[i]
var margins = getMediaItemMargins(item.mediaItem.type)
if(i === 0) {
// use the first media item to define the height for all the media items for "max scroll"
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:galleryHeight - (margins.top + margins.bottom)
}, true)
} else {
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:(isMaxScroll ? items[0].height : galleryHeight) - (margins.top + margins.bottom)
}, false)
}
item.transition = 0
item.display = 'block'
var alpha = assetId === undefined || (!isNaN(assetId) && assetId === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
item.alpha = alpha
var height = allowPageContentHeight(item, length) ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height)
}
tile.layoutItems()
for(i = 0; i < length; i++) {
var position = tile.getPosition(i)
items[i].x = position.x
items[i].y = position.y
}
var bounds = tile.getBounds()
_container.transition = 0
_container.width = bounds.width
_container.height = bounds.height
if(_mediaView.scroll) {
setTimeout(function(){
if(_mediaView.scroll) {
_mediaView.scroll.resize()
}
}, (STATE.mediaView.transitionDuration() * 1000) + 550)
}
if(_mediaView.lazyLoader) {
if(isPod() || isPad()) {
_mediaView.lazyLoader.domElementScroll = true
} else if(MAC_SCROLLBARS && (/native/.test(STATE.overrides.imageVideoScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
_mediaView.lazyLoader.domElementScroll = true
}
if(!_mediaView.scroll) {
_mediaView.lazyLoader.property = false
}
_mediaView.lazyLoader.update()
}
// layoutCalcs._mediaContentHeight = bounds.height
_container.boundsHeight = bounds.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', { gallery: bounds.height })
}
function scaleItem(item, margins, range, isFirstItem) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.overrides.pageMaxWidth || STATE.mediaView.width()
item.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var scale = ScaleEngine(getScaleVars(item, range, STATE.mediaView.imageScaleType()))
item.width = scale.width + margins.left + margins.right
if(/unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
var scaledHeight = (isFirstItem ? scale.height : range.v)
if(/fitWidth|^fill$/.test(STATE.mediaView.imageScaleType()) && scale.height > range.v) scaledHeight = range.v
item.height = scaledHeight + margins.top + margins.bottom
// item.height = (isFirstItem ? scale.height : range.v) + margins.top + margins.bottom
} else {
item.height = STATE.mediaView.height()
}
}
item.updatePosition()
}
return layout
}
function ScrollTransitionHorizontalNoCrop(imports) {
var _mediaView = imports.mediaView
var _container = _mediaView.container
var _mask = _mediaView.mask
var _localEvents = imports.localEvents
var _duration = imports.transitionDuration
var _scrollInteraction
var scrollTimer
var isScrollAnimation
var curAssetId
var anim
if(_mediaView.scroll) {
_mediaView.scroll.addEventListener('scrollStop', scrollStop)
_mediaView.scroll.addEventListener('scrollStart', scrollStart)
_mediaView.scroll.addEventListener(SCROLL, scroll)
} else {
_mask.element.addEventListener("scroll", scrollEvents)
}
function transition(assetId, transitionDuration) {
curAssetId = assetId
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
_localEvents.dispatchEvent(TRANSITION_START)
var asset = _container.children[assetId]
if(asset) {
var assetX = asset.x
var assetY = asset.y
var alignBehavior = getAlignBehavior(assetId, _container.children.length)
_mask.width = STATE.mediaView.width()
var hAlign = AlignEngine({width:asset.width, hRange:_mask.width, hAlign:alignBehavior})
assetX = asset.x - hAlign.x
isScrollAnimation = true
_scrollInteraction = false
if(_mediaView.scroll) {
var scollDist = _container.width - _mask.width
var percent = assetX / scollDist
_mediaView.scroll.percent = percent
_mediaView.scroll.bar.moveHandle(STATE.mediaView.transitionDuration())
Tween(_container, transitionDuration, {translateX:-assetX, translateY:-assetY, ease:TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut, onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 360)
}})
// anime({
// targets: _container,
// duration: transitionDuration * 1000,
// translateX: -assetX,
// translateY: -assetY,
// easing: TOUCH_DEVICE ? 'easeOutQuart' : 'easeInOutCubic',
// complete: function() {
// isScrollAnimation = false
// _scrollInteraction = undefined
// _localEvents.dispatchEvent(TRANSITION_END)
// setTimeout(function() {
// if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
// }, 360)
// }
// })
} else {
if(transitionDuration) {
if(anim) anim.kill()
anim = Anim.to(_mask, transitionDuration, {scrollLeft:assetX, scrollTop:assetY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}})
} else {
setTimeout(function() {
_mask.scrollLeft = assetX
_mask.scrollTop = assetY
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}, 10)
}
}
isScrollAnimation ? setActiveAlpha(assetId) : setAllActive()
}
}
transition.destroy = function destroy() {
if(_mediaView.scroll) {
_mediaView.scroll.removeEventListener('scrollStop', scrollStop)
_mediaView.scroll.removeEventListener('scrollStart', scrollStart)
_mediaView.scroll.removeEventListener(SCROLL, scroll)
} else if(_mask.element) {
_mask.element.removeEventListener("scroll", scrollEvents)
}
}
function setActiveAlpha(activeIndex) {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var alpha = activeIndex === undefined || (!isNaN(activeIndex) && activeIndex === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
Tween(child, STATE.mediaView.transitionDuration(), {alpha:alpha})
}
}
function setAllActive() {
var i = _container.children.length
while(i--) {
Tween(_container.children[i], STATE.mediaView.transitionDuration(), {alpha:1})
}
}
function getAlignBehavior(assetId, arrLen) {
if(assetId === 0) {
return 'left'
} else if(assetId === arrLen - 1) {
return 'right'
}
return STATE.mediaView.hAlign()
}
function getCurrentAssetPosition() {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var mediaViewCenter = _mask.width * 0.5
if(_mediaView.scroll) {
if(-_container.translateX + mediaViewCenter >= child.x && -_container.translateX + mediaViewCenter <= child.x + child.width) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
} else {
if(_mask.scrollLeft + mediaViewCenter >= child.x && _mask.scrollLeft + mediaViewCenter <= child.x + child.width) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
}
}
}
function scrollStart(e) {
_localEvents.dispatchEvent('mediaScrollStart')
if(_scrollInteraction !== false) _localEvents.dispatchEvent('pauseMedia')
// if(_scrollInteraction === false && anim) {
// anim.kill()
// }
isScrollAnimation ? setActiveAlpha(curAssetId) : setAllActive()
}
function scrollStop(e) {
if(_scrollInteraction) {
getCurrentAssetPosition()
}
if(_scrollInteraction !== false) _scrollInteraction = undefined
}
function scroll(e) {
if(_scrollInteraction === undefined) _scrollInteraction = true
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
if(_scrollInteraction) {
getCurrentAssetPosition()
}
}
function scrollEvents(e) {
if(!scrollTimer) scrollStart(e)
clearTimeout(scrollTimer)
scroll(e)
scrollTimer = setTimeout(function() {
scrollStop(e)
scrollTimer = null
}, 300)
}
return transition
}
function ScrollLayoutVertical(imports) {
var _Tile = Tile,
_mediaView = imports.mediaView,
_localEvents = imports.localEvents,
_container = _mediaView.container,
_mask = _mediaView.mask
if(!STATE.siteView.unifiedPageScroll()) {
if(STATE.overrides.imageVideoScrollType === 'native' || USER_AGENT === MOBILE || USER_AGENT === TABLET) {
_mask.element.style.overflowX = 'hidden'
_mask.element.style.overflowY = 'scroll'
// _mask.element.style['-webkit-overflow-scrolling'] = 'touch'
} else if(MAC_SCROLLBARS && (STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll)) {
_mask.element.style.overflowX = 'hidden'
_mask.element.style.overflowY = 'scroll'
} else {
if(_mediaView.scroll) _mediaView.scroll.destroy()
var scrollProps = {
name: 'horiz scroll',
types:['bar','wheel','touch'],
axis:'y',
align:'left',
color:STATE.overrides.imageVideoScrollbarColor,
hover:STATE.overrides.imageVideoScrollbarHover,
side:STATE.overrides.imageVideoScrollbarAlignment,
alpha:STATE.overrides.imageVideoScrollbarBgTransparency,
width:STATE.overrides.imageVideoScrollbarWidth,
offsetX:STATE.overrides.imageVideoScrollbarHorizontalOffset,
offsetY:STATE.overrides.imageVideoScrollbarVerticalOffset,
topPad:0,
parent:imports.siteView,
property:'translate',
zIndex:STATE.mediaView.zIndex,
rounded:STATE.overrides.imageVideoScrollbarRounded,
visibility:STATE.overrides.imageVideoScrollbarVisibility
}
if(STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll) {
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'bottom'
scrollProps.alpha = 0
scrollProps.width = 7
scrollProps.offsetX = -10
scrollProps.offsetY = 0
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
_mediaView.scroll = new Scroll(_container, _mask, scrollProps)
}
}
var layoutTimer
function layout(assetId) {
clearTimeout(layoutTimer)
layoutTimer = setTimeout(function() {
var tile = new _Tile()
tile.gap = 0
tile.axis = 'y'
tile.align = 'left'
tile.wrap = false
tile.perpLength = STATE.mediaView.width()
tile.name = 'vScroll'
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0
var items = _container.children
var length = items.length
for(; i < length; i++) {
var item = items[i]
var margins = getMediaItemMargins(item.mediaItem.type)
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:STATE.mediaView.height(_mediaView.section.key) - (margins.top + margins.bottom)
})
item.transition = 0
item.display = 'block'
var alpha = assetId === undefined || (!isNaN(assetId) && assetId === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
item.alpha = alpha
// var height = item.height
var height = item.contentHeight ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height)
}
tile.layoutItems()
for(i = 0; i < length; i++) {
var position = tile.getPosition(i)
items[i].x = position.x
items[i].y = position.y
}
var bounds = tile.getBounds()
_container.transition = 0
_container.width = bounds.width
_container.height = STATE.overrides.siteDisplayBehavior === 'none' ? STATE.mediaView.zoneHeight() : bounds.height
if(_mediaView.scroll) {
setTimeout(function(){
if(_mediaView.scroll) _mediaView.scroll.resize()
}, UPDATE_SPEED * 1000)
}
if(_mediaView.lazyLoader) {
if(isPod() || isPad()) {
_mediaView.lazyLoader.domElementScroll = true
} else if(MAC_SCROLLBARS && (/native/.test(STATE.overrides.imageVideoScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
_mediaView.lazyLoader.domElementScroll = true
}
_mediaView.lazyLoader.update()
}
// layoutCalcs._mediaContentHeight = bounds.height
_container.boundsHeight = bounds.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', {gallery: bounds.height})
}, 200)
}
function scaleItem(item, margins, range) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
// item.height = item.contentHeight || STATE.mediaView.height()
item.height = item.mediaItem.type === 'html' ? item.contentHeight || stage.height : STATE.mediaView.height()
} else {
var scale = ScaleEngine(getScaleVars(item, range, 'fit', false))
item.width = scale.width + margins.left + margins.right
item.height = scale.height + margins.top + margins.bottom
}
item.updatePosition()
}
return layout
}
function ScrollTransitionVertical(imports) {
var _mediaView = imports.mediaView
var _container = _mediaView.container
var _mask = _mediaView.mask
var _localEvents = imports.localEvents
var _duration = imports.transitionDuration
var _scrollInteraction
var scrollTimer
var isScrollAnimation
var curAssetId
var anim
if(_mediaView.scroll) {
_mediaView.scroll.addEventListener('scrollStop', scrollStop)
_mediaView.scroll.addEventListener('scrollStart', scrollStart)
_mediaView.scroll.addEventListener(SCROLL, scroll)
} else if(STATE.siteView.unifiedPageScroll()) {
window.addEventListener("scroll", scrollEvents)
} else {
_mask.element.addEventListener("scroll", scrollEvents)
}
function transition(assetId, transitionDuration) {
curAssetId = assetId
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
_localEvents.dispatchEvent(TRANSITION_START)
isScrollAnimation = true
_scrollInteraction = false
// setTimeout is for delaying the transition when the site is rendering vertical text pages
// (possibly due to using offsetHeight because of the varying text page height)
setTimeout(function() {
var asset = _container.children[assetId]
if(asset) {
if(STATE.siteView.unifiedPageScroll()) {
_mask = document.body
var assetX = asset.absX
var assetY = asset.absY
var alignBehavior = getAlignBehavior(assetId, _container.children.length)
// if(LAYOUT_MODEL.menuAlignHorizontal === 'top' && assetId === 0) {
// offset for menu when in this situation
// assetY = STATE.mediaView.maskY()
// }
if(/top/.test(STATE.menuView.placement()) && assetId === 0 && !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
assetY = 0
if(window.scrollY === 0) {
// prevent tween when already at the top of page
// a better solution would be a Tween interupt for user scroll
transitionDuration = 0
}
} else {
var vAlign = AlignEngine({height:asset.height, vRange:_mask.offsetHeight, vAlign:alignBehavior})
assetY = Math.round(asset.absY - vAlign.y)
}
} else {
var assetX = asset.x
var assetY = asset.y
var alignBehavior = getAlignBehavior(assetId, _container.children.length)
var vAlign = AlignEngine({height:asset.height, vRange:_mask.height, vAlign:alignBehavior})
assetY = Math.round(asset.y - vAlign.y)
}
if(_mediaView.scroll) {
var scollDist = _container.height - _mask.height
var percent = assetY / scollDist
_mediaView.scroll.percent = percent
_mediaView.scroll.bar.moveHandle(STATE.mediaView.transitionDuration())
Tween(_container, transitionDuration, {translateX:-assetX, translateY:-assetY, ease:TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut, onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 360)
}})
// anime({
// targets: _container,
// duration: transitionDuration * 1000,
// translateX: -assetX,
// translateY: -assetY,
// easing: TOUCH_DEVICE ? 'easeOutQuart' : 'easeInOutCubic',
// complete: function() {
// isScrollAnimation = false
// _scrollInteraction = undefined
// _localEvents.dispatchEvent(TRANSITION_END)
// setTimeout(function() {
// if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
// }, 360)
// }
// })
} else if(STATE.siteView.unifiedPageScroll()) {
if(transitionDuration) {
if(anim) anim.kill()
anim = Anim.to(window, transitionDuration, {scrollY:assetY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}})
} else {
setTimeout(function() {
window.scrollTo(0, assetY)
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}, 10)
}
} else {
if(transitionDuration) {
if(anim) anim.kill()
anim = Anim.to(_mask, transitionDuration, {scrollLeft:assetX, scrollTop:assetY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}})
} else {
setTimeout(function() {
_mask.scrollLeft = assetX
_mask.scrollTop = assetY
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}, 10)
}
}
// to prevent reduced opacity when all media items fit on the screen
(isScrollAnimation && (layoutCalcs._mediaContentHeight > STATE.mediaView.zoneHeight(_mediaView.section.key))) && USER_AGENT !== MOBILE ? setActiveAlpha(assetId) : setAllActive()
}
}, BROWSER_NAME === 'Firefox' ? 1000 : 300)
}
transition.destroy = function destroy() {
if(_mediaView.scroll) {
_mediaView.scroll.removeEventListener('scrollStop', scrollStop)
_mediaView.scroll.removeEventListener('scrollStart', scrollStart)
_mediaView.scroll.removeEventListener(SCROLL, scroll)
} else if(STATE.siteView.unifiedPageScroll()) {
window.removeEventListener("scroll", scrollEvents)
} else if(_mask.element) {
_mask.element.removeEventListener("scroll", scrollEvents)
}
}
function setActiveAlpha(activeIndex) {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var alpha = activeIndex === undefined || (!isNaN(activeIndex) && activeIndex === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
Tween(child, STATE.mediaView.transitionDuration(), {alpha:alpha})
}
}
function setAllActive() {
var i = _container.children.length
while(i--) {
Tween(_container.children[i], STATE.mediaView.transitionDuration(), {alpha:1})
}
}
function getAlignBehavior(assetId, arrLen) {
if(isBlogFeed(_mediaView.section.id)) {
return 'top'
} else if(assetId === 0) {
return 'top'
} else if(assetId === arrLen - 1) {
return 'bottom'
}
return STATE.mediaView.vAlign()
}
function getCurrentAssetPosition() {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var mediaViewCenter = _mask.height * 0.5
if(_mediaView.scroll) {
if(-_container.translateY + mediaViewCenter >= child.y && -_container.translateY + mediaViewCenter <= child.y + child.height) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
} else if(STATE.siteView.unifiedPageScroll()) {
if(window.scrollY + (window.innerHeight * 0.5) >= child.absY && window.scrollY + (window.innerHeight * 0.5) <= child.absY + child.height) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
} else {
if(_mask.scrollTop + mediaViewCenter >= child.y && _mask.scrollTop + mediaViewCenter <= child.y + child.height) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
}
}
}
function scrollStart(e) {
_localEvents.dispatchEvent('mediaScrollStart')
if(_scrollInteraction !== false) {
_localEvents.dispatchEvent('pauseMedia')
}
// if(_scrollInteraction === false && anim) {
// anim.kill()
// }
isScrollAnimation ? setActiveAlpha(curAssetId) : setAllActive()
}
function scrollStop(e) {
if(_scrollInteraction && !isScrollAnimation) {
getCurrentAssetPosition()
}
if(_scrollInteraction !== false) _scrollInteraction = undefined
}
function scroll(e) {
if(_scrollInteraction === undefined && !isScrollAnimation) _scrollInteraction = true
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
if(_scrollInteraction && !isScrollAnimation) {
getCurrentAssetPosition()
}
}
function scrollEvents(e) {
if(!scrollTimer) scrollStart(e)
clearTimeout(scrollTimer)
scroll(e)
scrollTimer = setTimeout(function() {
scrollStop(e)
scrollTimer = null
}, 300)
}
return transition
}
function ScrollLayoutVerticalNoCrop(imports) {
var _Tile = Tile,
_mediaView = imports.mediaView,
_localEvents = imports.localEvents,
_container = _mediaView.container,
_mask = _mediaView.mask
if(!STATE.siteView.unifiedPageScroll()) {
if(STATE.overrides.imageVideoScrollType === 'native') {
_mask.element.style.overflowX = 'hidden'
_mask.element.style.overflowY = 'scroll'
} else if(MAC_SCROLLBARS && (STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll)) {
_mask.element.style.overflowX = 'hidden'
_mask.element.style.overflowY = 'scroll'
} else {
if(_mediaView.scroll) _mediaView.scroll.destroy()
var scrollProps = {
name: 'horiz scroll',
types:['bar','wheel','touch'],
axis:'y',
align:'left',
color:STATE.overrides.imageVideoScrollbarColor,
hover:STATE.overrides.imageVideoScrollbarHover,
side:STATE.overrides.imageVideoScrollbarAlignment,
alpha:STATE.overrides.imageVideoScrollbarBgTransparency,
width:STATE.overrides.imageVideoScrollbarWidth,
offsetX:STATE.overrides.imageVideoScrollbarHorizontalOffset,
offsetY:STATE.overrides.imageVideoScrollbarVerticalOffset,
topPad:0,
parent:imports.siteView,
property:'translate',
zIndex:STATE.mediaView.zIndex,
rounded:STATE.overrides.imageVideoScrollbarRounded,
visibility:STATE.overrides.imageVideoScrollbarVisibility
}
if(STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll) {
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'bottom'
scrollProps.alpha = 0
scrollProps.width = 7
scrollProps.offsetX = -10
scrollProps.offsetY = 0
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
_mediaView.scroll = new Scroll(_container, _mask, scrollProps)
}
}
var layoutTimer
function layout(assetId) {
clearTimeout(layoutTimer)
layoutTimer = setTimeout(function() {
var tile = new _Tile()
tile.gap = 0
tile.axis = 'y'
tile.align = 'left'
tile.wrap = false
tile.perpLength = STATE.mediaView.width()
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0,
items = _container.children,
length = items.length
for(; i < length; i++) {
var item = items[i]
var margins = getMediaItemMargins(item.mediaItem.type)
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:STATE.mediaView.height(_mediaView.section.key) - (margins.top + margins.bottom)
})
item.transition = 0
item.display = 'block'
var alpha = assetId === undefined || (!isNaN(assetId) && assetId === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
item.alpha = alpha
// var height = item.height
var height = item.contentHeight ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height)
}
tile.layoutItems()
for(i = 0; i < length; i++) {
var position = tile.getPosition(i)
items[i].x = position.x
items[i].y = position.y
}
var bounds = tile.getBounds()
_container.transition = 0
_container.width = bounds.width
_container.height = STATE.overrides.siteDisplayBehavior === 'none' ? STATE.mediaView.zoneHeight() : bounds.height
if(_mediaView.scroll) {
setTimeout(function(){
if(_mediaView.scroll) {
_mediaView.scroll.resize()
}
}, UPDATE_SPEED * 1000)
}
if(_mediaView.lazyLoader) {
if(isPod() || isPad()) {
_mediaView.lazyLoader.domElementScroll = true
} else if(MAC_SCROLLBARS && (/native/.test(STATE.overrides.imageVideoScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
_mediaView.lazyLoader.domElementScroll = true
}
_mediaView.lazyLoader.update()
}
// layoutCalcs._mediaContentHeight = bounds.height
_container.boundsHeight = bounds.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', { gallery: bounds.height })
}, 50)
}
function scaleItem(item, margins, range) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
item.height = item.mediaItem.type === 'html' ? item.contentHeight || stage.height : STATE.mediaView.height()
} else {
// var scale = ScaleEngine(getScaleVars(item, range, 'fit', false))
// width of mediaItem has to be full mediaView.width so the item content
// will center
// item.width = STATE.mediaView.width() //scale.width + margins.left + margins.right
// item.height = STATE.mediaView.height()
// ^^^^^^^^ changed this due to non-uniform margins for vertical scroll - nc on Mobile devices
// Image gallery cropping in rotation of mobile device #1540
var scale = ScaleEngine(getScaleVars(item, range, 'fit', false))
item.width = STATE.mediaView.width() //scale.width + margins.left + margins.right
item.height = isPod() ? scale.height + margins.top + margins.bottom : STATE.mediaView.height()
}
item.updatePosition()
}
return layout
}
function ScrollTransitionVerticalNoCrop(imports) {
var _mediaView = imports.mediaView
var _container = _mediaView.container
var _mask = _mediaView.mask
var _localEvents = imports.localEvents
var _duration = imports.transitionDuration
var _scrollInteraction
var scrollTimer
var isScrollAnimation
var curAssetId
var anim
if(_mediaView.scroll) {
_mediaView.scroll.addEventListener('scrollStop', scrollStop)
_mediaView.scroll.addEventListener('scrollStart', scrollStart)
_mediaView.scroll.addEventListener(SCROLL, scroll)
} else if(STATE.siteView.unifiedPageScroll()) {
window.addEventListener("scroll", scrollEvents)
} else {
_mask.element.addEventListener("scroll", scrollEvents)
}
function transition(assetId, transitionDuration) {
curAssetId = assetId
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
_localEvents.dispatchEvent(TRANSITION_START)
isScrollAnimation = true
_scrollInteraction = false
// setTimeout is for delaying the transition when the site is rendering vertical text pages
// (possibly due to using offsetHeight because of the varying text page height)
setTimeout(function() {
var asset = _container.children[assetId]
if(asset) {
if(STATE.siteView.unifiedPageScroll()) {
_mask = document.body
var assetX = asset.absX
var assetY = asset.absY
var alignBehavior = getAlignBehavior(assetId, _container.children.length)
// if(LAYOUT_MODEL.menuAlignHorizontal === 'top' && assetId === 0) {
// offset for menu when in this situation
// assetY = STATE.mediaView.maskY()
// }
if(/top/.test(STATE.menuView.placement()) && assetId === 0 && !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
assetY = 0
if(window.scrollY === 0) {
// prevent tween when already at the top of page
// a better solution would be a Tween interupt for user scroll
transitionDuration = 0
}
} else {
var vAlign = AlignEngine({height:asset.height, vRange:_mask.offsetHeight, vAlign:alignBehavior})
assetY = Math.round(asset.absY - vAlign.y)
}
} else {
var assetX = asset.x
var assetY = STATE.siteView.unifiedPageScroll() ? asset.absY : asset.y
var alignBehavior = getAlignBehavior(assetId, _container.children.length)
var vAlign = AlignEngine({height:asset.height, vRange:_mask.height, vAlign:alignBehavior})
assetY = Math.round(asset.y - vAlign.y)
}
if(_mediaView.scroll) {
var scollDist = _container.height - _mask.height
var percent = assetY / scollDist
_mediaView.scroll.percent = percent
_mediaView.scroll.bar.moveHandle(STATE.mediaView.transitionDuration())
Tween(_container, transitionDuration, {translateX:-assetX, translateY:-assetY, ease:TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut, onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 360)
}})
// anime({
// targets: _container,
// duration: transitionDuration * 1000,
// translateX: -assetX,
// translateY: -assetY,
// easing: TOUCH_DEVICE ? 'easeOutQuart' : 'easeInOutCubic',
// complete: function() {
// isScrollAnimation = false
// _scrollInteraction = undefined
// _localEvents.dispatchEvent(TRANSITION_END)
// setTimeout(function() {
// if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
// }, 360)
// }
// })
} else if(STATE.siteView.unifiedPageScroll()) {
if(transitionDuration) {
if(anim) anim.kill()
anim = Anim.to(window, transitionDuration, {scrollY:assetY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}})
} else {
setTimeout(function() {
window.scrollTo(0, assetY)
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}, 10)
}
} else {
if(transitionDuration) {
if(anim) anim.kill()
anim = Anim.to(_mask, transitionDuration, {scrollLeft:assetX, scrollTop:assetY, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}})
} else {
setTimeout(function() {
_mask.scrollLeft = assetX
_mask.scrollTop = assetY
_scrollInteraction = undefined
_localEvents.dispatchEvent(TRANSITION_END)
setTimeout(function() {
// delay isScrollAnimation flag for debounce in scrollEvents
isScrollAnimation = false
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
}, 310)
}, 10)
}
}
// to prevent reduced opacity when all media items fit on the screen
isScrollAnimation && layoutCalcs._mediaContentHeight > STATE.mediaView.zoneHeight(_mediaView.section.key) ? setActiveAlpha(assetId) : setAllActive()
}
// delay for navigating tall galleries by
}, BROWSER_NAME === 'Firefox' ? 1000 : 300)
}
transition.destroy = function destroy() {
if(_mediaView.scroll) {
_mediaView.scroll.removeEventListener('scrollStop', scrollStop)
_mediaView.scroll.removeEventListener('scrollStart', scrollStart)
_mediaView.scroll.removeEventListener(SCROLL, scroll)
} else if(STATE.siteView.unifiedPageScroll()) {
window.removeEventListener("scroll", scrollEvents)
} else if(_mask.element) {
_mask.element.removeEventListener("scroll", scrollEvents)
}
}
function setActiveAlpha(activeIndex) {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var alpha = activeIndex === undefined || (!isNaN(activeIndex) && activeIndex === i) ? 1 : STATE.overrides.imageVideoInactiveAlpha
Tween(child, STATE.mediaView.transitionDuration(), {alpha:alpha})
}
}
function setAllActive() {
var i = _container.children.length
while(i--) {
Tween(_container.children[i], STATE.mediaView.transitionDuration(), {alpha:1})
}
}
function getAlignBehavior(assetId, arrLen) {
if(isBlogFeed(_mediaView.section.id)) {
return 'top'
} else if(assetId === 0) {
return 'top'
} else if(assetId === arrLen - 1) {
return 'bottom'
}
return STATE.mediaView.vAlign()
}
function getCurrentAssetPosition() {
var i = _container.children.length
while(i--) {
var child = _container.children[i]
var mediaViewCenter = _mask.height * 0.5
if(_mediaView.scroll) {
if(-_container.translateY + mediaViewCenter >= child.y && -_container.translateY + mediaViewCenter <= child.y + child.height) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
} else if(STATE.siteView.unifiedPageScroll()) {
if(window.scrollY + (window.innerHeight * 0.5) >= child.absY && window.scrollY + (window.innerHeight * 0.5) <= child.absY + child.height) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
} else {
if(_mask.scrollTop + mediaViewCenter >= child.y && _mask.scrollTop + mediaViewCenter <= child.y + child.height) {
_localEvents.dispatchEvent('ScrollTransition/updateAssetId', {id:i})
}
}
}
}
function scrollStart(e) {
_localEvents.dispatchEvent('mediaScrollStart')
if(_scrollInteraction !== false) _localEvents.dispatchEvent('pauseMedia')
// if(_scrollInteraction === false && anim) {
// anim.kill()
// }
isScrollAnimation ? setActiveAlpha(curAssetId) : setAllActive()
}
function scrollStop(e) {
if(_scrollInteraction && !isScrollAnimation) {
getCurrentAssetPosition()
}
if(_scrollInteraction !== false) _scrollInteraction = undefined
}
function scroll(e) {
if(_scrollInteraction === undefined && !isScrollAnimation) _scrollInteraction = true
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
if(_scrollInteraction && !isScrollAnimation) {
getCurrentAssetPosition()
}
}
function scrollEvents(e) {
if(!scrollTimer) scrollStart(e)
clearTimeout(scrollTimer)
scroll(e)
scrollTimer = setTimeout(function() {
scrollStop(e)
scrollTimer = null
}, 300)
}
return transition
}
function SlideLayoutHorizontal(imports) {
var _Tile = Tile,
_container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView;
function layout() {
_mediaView.mask.element.scrollLeft = 0
_mediaView.mask.element.scrollTop = 0
_mediaView.mask.element.style.overflow = 'hidden'
var tile = new _Tile();
tile.gap = 0;
tile.axis = 'x';
tile.align = 'left';
tile.wrap = false;
tile.perpLength = STATE.mediaView.height(_mediaView.section.key);
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0
var items = _container.children
var length = items.length
var mediaViewWidth = STATE.mediaView.width()
var galleryHeight = STATE.mediaView.height(_mediaView.section.key)
var isMaxScroll = _mediaView.maxScroll && /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)
if(isMaxScroll) {
galleryHeight = layoutCalcs.getMaxScrollSectionHeight(_mediaView)
}
for(; i < length; i++) {
var item = items[i];
var margins = isSlideshowGallery(_mediaView.section) && /fillSite/.test(STATE.mediaView.imageScaleType()) ?
{left:0, right:0, top:0, bottom:0} :
getMediaItemMargins(item.mediaItem.type)
if(i === 0) {
// use the first media item to define the height for all the media items for "max scroll"
scaleItem(item, margins, {
h:mediaViewWidth - (margins.left + margins.right),
v:galleryHeight - (margins.top + margins.bottom)
}, true)
} else {
scaleItem(item, margins, {
h:mediaViewWidth - (margins.left + margins.right),
v:(isMaxScroll ? items[0].height : galleryHeight) - (margins.top + margins.bottom)
}, false)
}
item.transition = 0;
item.display = 'block';
item.alpha = 1;
var height = allowPageContentHeight(item, length) ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height);
}
tile.layoutItems();
for(i = 0; i < length; i++) {
var position = tile.getPosition(i);
items[i].x = position.x;
items[i].y = position.y;
}
var bounds = tile.getBounds();
_container.transition = 0;
_container.width = bounds.width;
_container.height = bounds.height;
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
// layoutCalcs._mediaContentHeight = bounds.height
_container.boundsHeight = bounds.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', { gallery: bounds.height });
}
function scaleItem(item, margins, range, isFirstItem) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type) || !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || isFillSiteSlideshow(_mediaView.section)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
item.height = STATE.mediaView.height(/*_mediaView.section.key*/)
} else {
var scale = ScaleEngine(getScaleVars(item, range, STATE.mediaView.imageScaleType()))
// width of mediaItem has to be full mediaView.width so the item content
// will center
item.width = STATE.mediaView.width()
var scaledHeight = (isFirstItem ? scale.height : range.v)
if(/fitWidth|^fill$/.test(STATE.mediaView.imageScaleType()) && scale.height > range.v) scaledHeight = range.v
item.height = scaledHeight + margins.top + margins.bottom
// item.height = (isFirstItem ? scale.height : range.v) + margins.top + margins.bottom
}
item.updatePosition()
}
return layout;
}
function SlideTransitionHorizontal(imports) {
var _container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView;
var _duration = imports.transitionDuration
function transition(assetId, transitionDuration) {
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
_localEvents.dispatchEvent(TRANSITION_START);
var asset = _container.children[assetId];
if(asset) {
var assetX = asset.x;
var assetY = asset.y;
Tween(_container, transitionDuration, {translateX:-assetX, translateY:-assetY, ease:TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut, onComplete:function(){
_localEvents.dispatchEvent(TRANSITION_END);
setTimeout(function() {
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
}, 360)
}});
// anime({
// targets: _container,
// duration: transitionDuration * 1000,
// translateX: -assetX,
// translateY: -assetY,
// easing: TOUCH_DEVICE ? 'easeOutQuart' : 'easeInOutCubic',
// complete: function() {
// _localEvents.dispatchEvent(TRANSITION_END);
// setTimeout(function() {
// if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
// }, 360)
// }
// })
if(USER_AGENT === MOBILE) {
var items = _container.children
for(var i = 0; i < items.length; i++) {
var item = items[i];
item.i = i;
if(i === assetId || i === assetId -1 || i === assetId + 1) {
item.element.style.visibility = 'visible';
} else {
item.element.style.visibility = 'hidden';
}
}
}
}
}
transition.destroy = function destroy() {
// dummy
}
return transition;
}
function SlideLayoutVertical(imports) { // eslint-disable-line
var _Tile = Tile
var _container = imports.mediaViewContainer
var _localEvents = imports.localEvents
var _mediaView = imports.mediaView
function layout() {
_mediaView.mask.element.scrollLeft = 0
_mediaView.mask.element.scrollTop = 0
_mediaView.mask.element.style.overflow = 'hidden'
var tile = new _Tile()
tile.gap = 0
tile.axis = 'y'
tile.align = 'left'
tile.wrap = false
tile.perpLength = STATE.mediaView.width()
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0
var items = _container.children
var length = items.length
var firstItemHeight = 0
var galleryHeight = STATE.mediaView.height(_mediaView.section.key)
var isMaxScroll = _mediaView.maxScroll && /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)
if(isMaxScroll) {
galleryHeight = layoutCalcs.getMaxScrollSectionHeight(_mediaView)
}
for(; i < length; i++) {
var item = items[i]
var margins = isSlideshowGallery(_mediaView.section) && /fillSite/.test(STATE.mediaView.imageScaleType()) ?
{left:0, right:0, top:0, bottom:0} :
getMediaItemMargins(item.mediaItem.type)
if(i === 0) {
// use the first media item to define the height for all the media items for "max scroll"
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:galleryHeight - (margins.top + margins.bottom)
}, true)
} else {
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:(isMaxScroll ? items[0].height : galleryHeight) - (margins.top + margins.bottom)
}, false)
}
item.transition = 0
item.display = 'block'
item.alpha = 1
var height = allowPageContentHeight(item, length) ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height);
firstItemHeight = items[0].height
}
tile.layoutItems()
for(i = 0; i < length; i++) {
var position = tile.getPosition(i)
items[i].x = position.x
items[i].y = position.y
}
var bounds = tile.getBounds()
_container.transition = 0
_container.width = bounds.width
_container.height = bounds.height
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update()
// layoutCalcs._mediaContentHeight = STATE.mediaView.zoneHeight()
_container.boundsHeight = firstItemHeight
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', {gallery: firstItemHeight})
}
function scaleItem(item, margins, range, isFirstItem) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type) || !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || isFillSiteSlideshow(_mediaView.section)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
item.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var scale = ScaleEngine(getScaleVars(item, range, STATE.mediaView.imageScaleType()))
// width of mediaItem has to be full mediaView.width so the item content
// will center
item.width = STATE.mediaView.width()
var scaledHeight = (isFirstItem ? scale.height : range.v)
if(/fitWidth|^fill$/.test(STATE.mediaView.imageScaleType()) && scale.height > range.v) scaledHeight = range.v
item.height = scaledHeight + margins.top + margins.bottom
// item.height = (isFirstItem ? scale.height : range.v) + margins.top + margins.bottom
}
item.updatePosition()
}
return layout
}
function SlideTransitionVertical(imports) {
var _container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView
var _duration = imports.transitionDuration
function transition(assetId, transitionDuration) {
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
_localEvents.dispatchEvent(TRANSITION_START)
var asset = _container.children[assetId]
if(asset) {
var assetX = asset.x
var assetY = asset.y
Tween(_container, transitionDuration, {translateX:-assetX, translateY:-assetY, ease:TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut, onComplete:function(){
_localEvents.dispatchEvent(TRANSITION_END);
setTimeout(function() {
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
}, 360)
}});
// anime({
// targets: _container,
// duration: transitionDuration * 1000,
// translateX: -assetX,
// translateY: -assetY,
// easing: TOUCH_DEVICE ? 'easeOutQuart' : 'easeInOutCubic',
// complete: function() {
// _localEvents.dispatchEvent(TRANSITION_END);
// setTimeout(function() {
// if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
// }, 360)
// }
// })
}
}
transition.destroy = function destroy() {
// dummy
}
return transition
}
function MobileSlideLayout(imports) {
var _Tile = Tile,
_container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView;
function layout() {
_mediaView.mask.element.scrollLeft = 0
_mediaView.mask.element.scrollTop = 0
_mediaView.mask.element.style.overflow = 'hidden'
var tile = new _Tile();
tile.gap = 0;
tile.axis = 'x';
tile.align = 'left';
tile.wrap = false;
tile.perpLength = STATE.mediaView.height(_mediaView.section.key);
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0
var items = _container.children
var length = items.length
var galleryHeight = STATE.mediaView.height(_mediaView.section.key)
var isMaxScroll = _mediaView.maxScroll && /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)
if(isMaxScroll) {
galleryHeight = layoutCalcs.getMaxScrollSectionHeight(_mediaView)
}
for(; i < length; i++) {
var item = items[i];
var margins = isSlideshowGallery(_mediaView.section) && /fillSite/.test(STATE.mediaView.imageScaleType()) ?
{left:0, right:0, top:0, bottom:0} :
getMediaItemMargins(item.mediaItem.type)
if(i === 0) {
// use the first media item to define the height for all the media items for "max scroll"
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:galleryHeight - (margins.top + margins.bottom)
}, true)
} else {
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:(isMaxScroll ? items[0].height : galleryHeight) - (margins.top + margins.bottom)
}, false)
}
item.transition = 0;
item.display = 'block';
item.alpha = 0;
var height = allowPageContentHeight(item, length) ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height);
}
tile.layoutItems();
for(i = 0; i < length; i++) {
var position = tile.getPosition(i);
items[i].translateX = position.x;
items[i].translateY = position.y;
}
if(USER_AGENT === MOBILE) {
// var bounds = tile.getBounds();
_container.transition = 0
_container.width = STATE.mediaView.width()
_container.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var bounds = tile.getBounds();
_container.transition = 0;
_container.width = bounds.width;
_container.height = bounds.height;
}
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
// layoutCalcs._mediaContentHeight = bounds.height
_container.boundsHeight = _container.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', { gallery: _container.height });
}
function scaleItem(item, margins, range, isFirstItem) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type) || !/unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || isFillSiteSlideshow(_mediaView.section)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
item.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var scale = ScaleEngine(getScaleVars(item, range, STATE.mediaView.imageScaleType()))
// width of mediaItem has to be full mediaView.width so the item content
// will center
item.width = STATE.mediaView.width()
var scaledHeight = (isFirstItem ? scale.height : range.v)
if(/fitWidth|^fill$/.test(STATE.mediaView.imageScaleType()) && scale.height > range.v) scaledHeight = range.v
item.height = scaledHeight + margins.top + margins.bottom
// item.height = (isFirstItem ? scale.height : range.v) + margins.top + margins.bottom
}
item.updatePosition()
}
return layout;
}
function MobileSlideTransition(imports) {
var _container = imports.mediaViewContainer
var _localEvents = imports.localEvents
var _mediaView = imports.mediaView
var _duration = imports.transitionDuration
var mediaDisplayTimer
function transition(assetId, transitionDuration, swipeDirection) {
var transitionDuration = transitionDuration !== undefined ? transitionDuration : _duration
_localEvents.dispatchEvent(TRANSITION_START)
var ease = EASE.quart.out
var items = _container.children
var prevAsset = items[assetId - 1]
var curAsset = items[assetId]
var nextAsset = items[assetId + 1]
if(prevAsset) {
setTimeout(function() {
prevAsset.transition = 0
if(swipeDirection === 'right') prevAsset.translateX = -STATE.mediaView.width()
prevAsset.display = 'block'
prevAsset.updateSpeed = 0
prevAsset.updatePosition()
if(!prevAsset.loaded) prevAsset.load()
Tween.defer(prevAsset, transitionDuration, {translateX:-STATE.mediaView.width(), alpha:1, ease:ease});
}, 0)
}
if(curAsset) {
curAsset.transition = 0
curAsset.display = 'block'
curAsset.updateSpeed = 0
curAsset.updatePosition()
if(!curAsset.loaded) curAsset.load()
clearTimeout(mediaDisplayTimer)
mediaDisplayTimer = setTimeout(function(){
items
.filter(function(item) {
return item !== curAsset && item !== prevAsset && item !== nextAsset
})
.forEach(function(item) {
item.display = 'none'
})
}, 200)
Tween.defer(curAsset, transitionDuration, {translateX:0, alpha:1, ease:ease, onComplete:function(){
_localEvents.dispatchEvent(TRANSITION_END);
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
}});
}
if(nextAsset) {
setTimeout(function() {
nextAsset.transition = 0
if(swipeDirection === 'left') nextAsset.translateX = STATE.mediaView.width()
nextAsset.display = 'block'
nextAsset.updateSpeed = 0
nextAsset.updatePosition()
if(!nextAsset.loaded) nextAsset.load()
Tween.defer(nextAsset, transitionDuration, {translateX:STATE.mediaView.width(), alpha:1, ease:ease});
}, 0)
}
}
transition.destroy = function() {}
return transition;
}
function StaticVLayout(imports) {
var _Tile = Tile,
_mediaView = imports.mediaView,
_localEvents = imports.localEvents,
_container = _mediaView.container,
_mask = _mediaView.mask;
if(!STATE.siteView.unifiedPageScroll() ) {
if(STATE.overrides.imageVideoScrollType === 'native' || USER_AGENT === MOBILE || USER_AGENT === TABLET) {
_mask.element.style.overflowX = 'hidden'
_mask.element.style.overflowY = 'scroll'
} else if(MAC_SCROLLBARS && (STATE.overrides.imageVideoScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll)) {
_mask.element.style.overflowX = 'hidden'
_mask.element.style.overflowY = 'scroll'
} else {
// removed legacy scroll behaviors for StaticV transition
// for 'dual scrollbar issue #1280'
// as this transition is targeted for single text pages
// instead of galleries with multiple vScroll items
}
}
function layout() {
var tile = new _Tile();
tile.gap = 0;
tile.axis = 'y';
tile.align = 'left';
tile.wrap = false;
tile.perpLength = STATE.mediaView.width();
if(_mediaView.section) STATE.section(_mediaView.section)
var i = 0
var items = _container.children
var length = items.length
for(; i < length; i++) {
var item = items[i];
var margins = getMediaItemMargins(item.mediaItem.type)
scaleItem(item, margins, {
h:STATE.mediaView.width() - (margins.left + margins.right),
v:STATE.mediaView.height(_mediaView.section.key) - (margins.top + margins.bottom)
})
item.transition = 0;
item.display = 'block';
item.alpha = 1;
var height = item.contentHeight ? item.contentHeight : item.height
// item.contentHeight added for getting page text height from PageView
tile.addItem(item.width, height);
}
tile.layoutItems();
for(i = 0; i < length; i++) {
var position = tile.getPosition(i);
items[i].x = position.x;
items[i].y = position.y;
}
var bounds = tile.getBounds();
_container.transition = 0;
_container.width = bounds.width;
_container.height = bounds.height
// _container.height = STATE.overrides.siteDisplayBehavior === 'none' ? STATE.mediaView.zoneHeight() : bounds.height;
if(_mediaView.scroll) {
setTimeout(function(){
if(_mediaView.scroll) _mediaView.scroll.resize();
}, UPDATE_SPEED * 1000);
}
if(_mediaView.lazyLoader) {
if(isPod() || isPad()) {
_mediaView.lazyLoader.domElementScroll = true
} else if(MAC_SCROLLBARS && (/native/.test(STATE.overrides.imageVideoScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
_mediaView.lazyLoader.domElementScroll = true
}
_mediaView.lazyLoader.update();
}
// layoutCalcs._mediaContentHeight = bounds.height
_container.boundsHeight = STATE.overrides.siteDisplayBehavior === 'none' ? STATE.mediaView.height() : bounds.height
_localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT', {gallery: _container.boundsHeight});
}
function scaleItem(item, margins, range) {
// we don't add margins to html/contact because they are not scaled
if(/html|contact/.test(item.mediaItem.type)) {
// for html height is ignore and uses item.contentHeight
item.width = STATE.mediaView.width()
item.height = STATE.mediaView.height(_mediaView.section.key)
} else {
var scale = ScaleEngine(getScaleVars(item, range, 'fit', false))
item.width = scale.width + margins.left + margins.right
item.height = scale.height + margins.top + margins.bottom
}
item.updatePosition()
}
return layout;
}
function StaticVTransition() {
// StaticVLayout doesn't need transitions for single media items
// vscroll was interfering with max scroll for single text pages
function transition() {}
transition.destroy = function destroy() {}
return transition
}
var Caption = (function() { // eslint-disable-line
function Caption() { // eslint-disable-line
this._properties = {}
this.container = new Sprite()
var blendMode = (USER_AGENT === MOBILE || USER_AGENT === TABLET || !LAYOUT_MODEL.captionBlendMode) ? 'normal' : LAYOUT_MODEL.captionBlendMode
this.container.element.style['mix-blend-mode'] = blendMode
this.container.element.style['border-radius'] = '2px'
this.mask = new Sprite()
this.container.addChild(this.mask)
this.hide()
this.content = new Sprite()
this.mask.addChild(this.content)
this.mask.overflow = 'hidden'
this.container.selectable = true
this.content.selectable = true
this.mask.selectable = true
var self = this
this.closeBtn = makeCloseBtn(function() {
self.hide()
})
this.closeBtn.x = this.width - 9
this.closeBtn.y = -9
this.closeBtn.element.style.zIndex = 10
this.container.addChild(this.closeBtn)
if(!LAYOUT_MODEL.captionCloseButton) {
setTimeout(function() {
self.hideCloseButton()
}, 0)
}
}
function makeCloseBtn(action) {
var btn = new Svg()
btn.width = 18
btn.height = 18
btn.cursor = 'pointer'
var circ = new Circle()
circ.r = 9
circ.cx = 9
circ.cy = 9
circ.fill = LAYOUT_MODEL.captionBackgroundRectColor
circ.element.style.opacity = LAYOUT_MODEL.captionBackgroundAlpha
circ.stroke = 'none'
var icon = new Path()
icon.id = 'icon'
icon.d = 'M5,5l8,8 M5,13l8-8'
icon.strokeWidth = 1.5
icon.fill = 'none'
icon.stroke = LAYOUT_MODEL.captionFontColor
btn.addEventListener('click', action)
btn.addEventListener('mouseover', function(){
if(btn.element.style.opacity != 0) {
btn.element.style.opacity = 0.75
}
})
btn.addEventListener('mouseout', function(){
if(btn.element.style.opacity != 0) {
btn.element.style.opacity = 1
}
})
btn.addChild(circ)
btn.addChild(icon)
return btn
}
Caption.prototype = {
get text() {
return this._properties.text
},
set text(value) {
this._properties.text = value
this.content.text = value
},
get backgroundColor() {
return this._properties.backgroundColor
},
set backgroundColor(value) {
this._properties.backgroundColor = value
this.container.backgroundColor = value
},
hideCloseButton: function() {
this.closeBtn.element.style.pointerEvents = 'none'
this.closeBtn.alpha = 0
this.closeBtn.display = 'none'
},
showCloseButton: function() {
this.closeBtn.element.style.pointerEvents = 'auto'
this.closeBtn.alpha = 1
this.closeBtn.display = 'block'
},
get fontFamily() {
return this._properties.fontFamily
},
set fontFamily(value) {
this._properties.fontFamily = value
this.content.fontFamily = value
},
get fontColor() {
return this._properties.fontColor
},
set fontColor(value) {
this._properties.fontColor = value
this.content.fontColor = value
},
get fontSize() {
return this._properties.fontSize
},
set fontSize(value) {
this._properties.fontSize = value
this.content.fontSize = value
},
get textAlign() {
return this._properties.textAlign
},
set textAlign(value) {
this._properties.textAlign = value
this.content.textAlign = value
},
get paddingTop() {
return this._properties.paddingTop
},
set paddingTop(value) {
this._properties.paddingTop = value
this.content.paddingTop = value
},
get paddingRight() {
return this._properties.paddingRight
},
set paddingRight(value) {
this._properties.paddingRight = value
this.content.paddingRight = value
this.width = this._properties.width
},
get paddingBottom() {
return this._properties.paddingBottom
},
set paddingBottom(value) {
this._properties.paddingBottom = value
this.content.paddingBottom = value
},
get paddingLeft() {
return this._properties.paddingLeft
},
set paddingLeft(value) {
this._properties.paddingLeft = value
this.content.paddingLeft = value
this.width = this._properties.width
},
get width() {
return this._properties.width
},
set width(value) {
this._properties.width = value
if(this.closeBtn) {
this.closeBtn.x = value - 9
}
this.container.width = value
this.mask.width = value
this.content.width = value - (this._properties.paddingLeft + this._properties.paddingRight)
},
get height() {
return this._properties.height
},
set height(value) {
this._properties.height = value
this.container.height = value
this.mask.height = value
},
show:function show(cb) {
var thisCaption = this
if(thisCaption.text) {
setTimeout(function() {
thisCaption.container.display = 'block'
thisCaption.isShowing = true
if(thisCaption.scroll) {
// changed this for git issue ** caption placement shifts down #1087
// dont know why the timeout was UPDATE_SPEED * 1000 before back from
// v12 release https://github.com/photofolio/designx/commit/82e4638e0f5bfdf7532d89a5f4230874e2565f80#diff-66a8f5645e99fa559db9b9922267e525
setTimeout(thisCaption.scroll.resize, 0)
}
if(typeof cb === 'function') cb()
Tween(thisCaption.container, 0.35, {alpha:1})
}, LAYOUT_MODEL.transitionDuration * 1000)
} else {
this.hide()
}
},
hide:function hide() {
this.container.alpha = 0
this.container.display = 'none'
this.isShowing = false
},
buildScroll:function buildScroll(scrollVars) {
// not getting this.content.element.offsetHeight
// per this issue - caption text placement on initial load is off #1156
// https://github.com/photofolio/designx/issues/1156
// console.log(this._properties.height, this.content.element.offsetHeight)
if(isPod() || isPad()) {
if(this.mask.element.offsetHeight < this._properties.height) {
this.mask.element.style.overflowY = 'scroll'
this.mask.element.style.overflowX = 'hidden'
}
this.mask.element.style['-webkit-overflow-scrolling'] = 'touch'
// assume we are filtering this due to caption overlay for mobile
if(USER_AGENT !== MOBILE) {
switch(scrollVars.align) {
case 'top':
this.content.element.style.top = '0px'
this.content.element.style.bottom = ''
break
case 'center':
this.content.element.style.top = ((this._properties.height - this.content.element.offsetHeight) * 0.5) + 'px'
this.content.element.style.bottom = ''
break
case 'bottom':
this.content.element.style.bottom = '0px'
this.content.element.style.top = ''
break
}
}
} else if(LAYOUT_MODEL.captionScrollType === 'native') {
if(this.mask.element.offsetHeight < this._properties.height) {
this.mask.element.style.overflowY = 'scroll'
this.mask.element.style.overflowX = 'hidden'
}
switch(scrollVars.align) {
case 'top':
this.content.element.style.top = '0px'
this.content.element.style.bottom = ''
break
case 'center':
this.content.element.style.top = ((this._properties.height - this.content.element.offsetHeight) * 0.5) + 'px'
this.content.element.style.bottom = ''
break
case 'bottom':
this.content.element.style.bottom = '0px'
this.content.element.style.top = ''
break
}
} else if(MAC_SCROLLBARS && (LAYOUT_MODEL.captionScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll)) {
if(this.mask.element.offsetHeight < this._properties.height) {
this.mask.element.style.overflowY = 'scroll'
this.mask.element.style.overflowX = 'hidden'
}
switch(scrollVars.align) {
case 'top':
this.content.element.style.top = '0px'
this.content.element.style.bottom = ''
break
case 'center':
this.content.element.style.top = ((this._properties.height - this.content.element.offsetHeight) * 0.5) + 'px'
this.content.element.style.bottom = ''
break
case 'bottom':
this.content.element.style.bottom = '0px'
this.content.element.style.top = ''
break
}
} else {
if(this.scroll) this.scroll.destroy()
var scrollProps = {
types:[
'bar',
'wheel',
'touch'
],
axis:'y',
align:scrollVars.align,
margin:0,
color:scrollVars.color,
hover:scrollVars.hover,
side:scrollVars.side,
alpha:scrollVars.alpha,
width:scrollVars.width,
offsetX:scrollVars.offsetX,
offsetY:scrollVars.offsetY,
property:'translate',
rounded: LAYOUT_MODEL.captionScrollbarRounded,
visibility: LAYOUT_MODEL.captionScrollbarVisibility,
zIndex:2
}
// if(LAYOUT_MODEL.pageScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll) {
if(/native/.test(STATE.overrides.captionScrollType) || LAYOUT_MODEL.globalSmoothScroll) {
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'right'
scrollProps.alpha = 0
scrollProps.width = 7
scrollProps.offsetX = -9
scrollProps.offsetY = 0
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
this.scroll = new Scroll(this.content, this.mask, scrollProps)
this.scroll.captionScroll = true
}
}
}
return Caption
})()
function ContactView(imports) {
var self = new Sprite({events:imports.events}),
formContainer = new Sprite(),
contactExtra = new Sprite(),
contactFields = new Sprite(),
responseMessage = new Sprite(),
contactFormObj,
contentHeight,
formHeight,
formFieldsArr,
contactLabel,
_thumbState,
_localEvents = imports.localEvents,
submit;
var contactExtraWidth = 0
self.section = imports.section
self.alpha = 0;
formContainer.alpha = 0;
formContainer.selectable = true
self.updateSpeed = 0;
self.id = imports.mediaItem.id;
self.type = imports.mediaItem.type;
self.dims = imports.size.content;
self.element.navigationCursor = !isSlideshowGallery(self.section);
self.mediaItem = imports.mediaItem
self.addEventListener(CHILD_ADDED, childAdded);
_localEvents.addEventListener(RESIZE, updatePosition);
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, updatePosition);
_localEvents.addEventListener('destroy', destroy);
_localEvents.addEventListener('showCursor', showCursor);
_localEvents.addEventListener('hideCursor', hideCursor);
function showCursor(e) {
self.element.navigationCursor = !isSlideshowGallery(self.section);
}
function hideCursor(e) {
self.element.navigationCursor = false;
}
function childAdded(child) {
self.addChild(formContainer);
contactFormObj = imports.mediaItem.content;
formFieldsArr = csvToArray(contactFormObj.contactFormFields);
contactExtra.text = contactFormObj.contactFormExtra.replace(/\r\n/g, '
').replace(/\\r\\n/g, '
').replace(/\n\r/g, '
').replace(/\\n\\r/g, '
').replace(/\r/g, '
').replace(/\\r/g, '
').replace(/\n/g, '
').replace(/\\n/g, '
').replace(/\\/g, '');
contactExtra.selectable = true
contactExtra.setClass('dx_page_text ql-editor');
contactExtra.fontFamily = LAYOUT_MODEL.contactFont;
contactExtra.fontSize = LAYOUT_MODEL.contactFontSize;
contactExtra.fontColor = LAYOUT_MODEL.contactFontColor;
contactExtra.textAlign = 'right';
contactExtra.textWrap = false;
formContainer.addChild(contactExtra);
formContainer.addChild(contactFields);
var contactImgs = formContainer.element.getElementsByTagName('img'),
i = contactImgs.length;
if(contactImgs.length > 0) {
while(i--) {
var img = contactImgs[i];
img.addEventListener(LOAD, function(e) {
updatePosition();
});
}
}
if(contactExtraWidth > 320) {
contactExtraWidth = 320
contactExtra.width = 320;
contactExtra.textWrap = true;
contactExtra.style['word-wrap'] = 'break-word';
}
var i = 0,
length = formFieldsArr.length,
fieldY = 0;
for(;i < length; i++) {
var input = buildFormInput(formFieldsArr[i]);
input.x = 16;
input.y = fieldY;
contactFields.addChild(input);
fieldY += formFieldsArr[i] === 'Comments' ? 180 : 50;
}
submit = new Button();
submit.text = 'Submit';
submit.x = 16;
submit.y = fieldY + 5;
submit.fontSize = 12;
submit.fontColor = LAYOUT_MODEL.contactFontColor;
submit.backgroundColor = LAYOUT_MODEL.contactFieldRectColor;
submit.paddingTop = 2;
submit.paddingRight = 14;
submit.paddingBottom = 2;
submit.paddingLeft = 14;
submit.selectable = false
contactFields.addChild(submit);
submit.addEventListener(FOCUS, onFocusSubmit);
submit.addEventListener(BLUR, onBlurSubmit);
submit.addEventListener(MOUSE_OVER, onFocusSubmit);
submit.addEventListener(MOUSE_OUT, onBlurSubmit);
submit.addEventListener(CLICK, onSubmit);
_localEvents.addEventListener('destroy', destroy);
function destroy(e) {
_localEvents.removeEventListener('destroy', destroy);
submit.removeEventListener(FOCUS, onFocusSubmit);
submit.removeEventListener(BLUR, onBlurSubmit);
submit.removeEventListener(MOUSE_OVER, onFocusSubmit);
submit.removeEventListener(MOUSE_OUT, onBlurSubmit);
submit.removeEventListener(CLICK, onSubmit);
}
fieldY += 25;
contactFields.width = 318;
contactFields.height = fieldY;
contactFields.borderLeft = '1px solid ' + toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.3);
if(LAYOUT_MODEL.contactTitleShow) {
contactLabel = new TextField();
contactLabel.text = imports.mediaItem.label;
formContainer.addChild(contactLabel);
contactLabel.fontFamily = LAYOUT_MODEL.contactTitleFont;
contactLabel.fontSize = LAYOUT_MODEL.contactTitleFontSize;
contactLabel.fontColor = LAYOUT_MODEL.contactFontColor;
contactLabel.textWrap = false;
contactLabel.selectable = false
contactLabel.x = contactExtra.element.offsetWidth + 16;
contactLabel.y = percentToPixels(LAYOUT_MODEL.contactTitleFontSize, 100) - 33;
}
formContainer.width = contactExtraWidth + contactFields.width;
responseMessage.alpha = 0;
responseMessage.x = contactExtraWidth + 17;
responseMessage.y = 44;
responseMessage.fontSize = 14;
formContainer.addChild(responseMessage);
_localEvents.addEventListener(CONTACT_FORM_SENT, contactResponse);
updateStyle()
updatePosition()
}
function getContactHeight() {
// var topMargin = percentToPixels(STATE.overrides.pageMarginTop, stage.height);
// var btmMargin = percentToPixels(STATE.overrides.pageMarginBottom, stage.height);
STATE.section(self.section)
var topMargin = 0;
var btmMargin = 0;
// formHeight = 22;
formHeight = topMargin;
if(LAYOUT_MODEL.contactTitleShow) {
formHeight += contactLabel.y + contactLabel.element.offsetHeight + 16;
}
if(isVerticalPageBuild()) {
formHeight += contactExtra.element.offsetHeight + contactFields.height + 16;
formHeight += submit.element.offsetHeight + 5 + btmMargin;
} else if(contactExtra.element.offsetHeight > contactFields.height) {
formHeight += contactExtra.element.offsetHeight + btmMargin;
} else {
formHeight += contactFields.height;
formHeight += submit.element.offsetHeight + 5 + btmMargin;
}
formContainer.height = formHeight;
}
function updateScroll() {
STATE.section(self.section)
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
self.element.style.overflowY = 'scroll'
self.element.style.overflowX = 'hidden'
self.element.style['-webkit-overflow-scrolling'] = 'touch'
} else if(STATE.siteView.unifiedPageScroll() && /vScroll/.test(STATE.overrides.transitionType)) {
getContactHeight()
setTimeout(function() {
STATE.section(self.section)
var contentHeight = formHeight
contentHeight = contentHeight > STATE.mediaView.height() ? contentHeight : STATE.mediaView.height()
var heightUpdateRequired = contentHeight !== self.contentHeight
self.contentHeight = contentHeight
self.height = contentHeight
if(heightUpdateRequired) {
_localEvents.dispatchEvent('MEDIA_HEIGHT_CHANGE');
}
// _localEvents.dispatchEvent('UPDATE_CONTENT_HEIGHT');
}, 30);
} else {
if(LAYOUT_MODEL.pageScrollType === 'native') {
self.element.style.overflowY = 'scroll'
self.element.style.overflowX = 'hidden'
} else if(OS === 'Macintosh' && LAYOUT_MODEL.pageScrollType === 'nativeMacOs') {
self.element.style.overflowY = 'scroll'
self.element.style.overflowX = 'hidden'
} else {
if(self.scroll) {
self.scroll.destroy();
}
var scrollBarWidth = LAYOUT_MODEL.pageScrollbarWidth;
var scrollBarOffsetXDevice = USER_AGENT === MOBILE ? -(scrollBarWidth + 5) : LAYOUT_MODEL.pageScrollbarHorizontalOffset;
var scrollBarOffsetX = LAYOUT_MODEL.pageScrollbarAlignment === 'right' ? -scrollBarOffsetXDevice - scrollBarWidth : scrollBarOffsetXDevice + scrollBarWidth;
var scrollProps = {
name:'text page',
types:['bar','wheel','touch'],
axis:'y',
align:'top',
margin:LAYOUT_MODEL.pageScrollVerticalMargin,
color:LAYOUT_MODEL.pageScrollbarColor,
hover:LAYOUT_MODEL.pageScrollbarHover,
side:LAYOUT_MODEL.pageScrollbarAlignment,
alpha:LAYOUT_MODEL.pageScrollbarBgAlpha,
width:scrollBarWidth,
offsetX:scrollBarOffsetX,
offsetY:LAYOUT_MODEL.pageScrollbarVerticalOffset,
property:'translate',
rounded: LAYOUT_MODEL.pageScrollbarRounded,
visibility: LAYOUT_MODEL.pageScrollbarVisibility,
scrollTopCheck:true,
parent:self
}
if(LAYOUT_MODEL.pageScrollType === 'nativeMacOs') {
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'right'
scrollProps.alpha = 0
scrollProps.width = 7
scrollProps.offsetX = 0
scrollProps.offsetY = 0
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
self.scroll = new Scroll(formContainer, self, scrollProps);
self.scroll.addEventListener('WINDOW_SCROLL_TOP', function(){
self.scroll.percent = 0;
self.scroll.update(UPDATE_SPEED);
});
}
}
}
function buildFormInput(label) {
var holder = new Sprite();
holder.width = 300;
var title = new TextField();
title.fontFamily = LAYOUT_MODEL.contactTitleFont;
title.fontColor = LAYOUT_MODEL.contactFontColor;
title.fontSize = 11;
title.text = label;
title.selectable = false
holder.addChild(title);
var input = label === 'Comments' ? new TextArea() : new Input();
input.backgroundColor = toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.1);
input.border = '1px solid ' + toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.3);
input.fontFamily = LAYOUT_MODEL.contactTitleFont;
input.fontColor = LAYOUT_MODEL.contactFontColor;
input.fontSize = 16;
input.height = label === 'Comments' ? 150 : 20;
input.width = 300;
input.y = 17;
input.addEventListener(FOCUS, onFocus);
input.addEventListener(BLUR, onBlur);
_localEvents.addEventListener('destroy', destroy);
function destroy(e) {
_localEvents.removeEventListener('destroy', destroy);
input.removeEventListener(FOCUS, onFocus);
input.removeEventListener(BLUR, onBlur);
}
holder.addChild(input);
holder.id = label;
holder.input = input;
return holder;
}
function onFocus(e) {
// not sure if this is needed anymore
// for resetting scroll on contact form input
// if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
// window.scrollTo(0, 0)
// }
Tween(this, UPDATE_SPEED, {backgroundColor:toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.2), border:'1px solid ' + toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.7)});
}
function onBlur(e) {
Tween(this, UPDATE_SPEED, {backgroundColor:toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.1), border:'1px solid ' + toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.3)});
}
function onFocusSubmit(e) {
Tween(this, UPDATE_SPEED, {backgroundColor:toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.8)});
}
function onBlurSubmit(e) {
Tween(this, UPDATE_SPEED, {backgroundColor:toRgba(LAYOUT_MODEL.contactFieldRectColor, 1)});
}
function contactResponse(e) {
responseMessage.text = e.response;
responseMessage.x = contactExtraWidth + 17;
Tween(contactFields, UPDATE_SPEED, {alpha:0, onComplete:function(e){
contactFields.display = 'none';
}});
Tween(responseMessage, UPDATE_SPEED, {alpha:1});
}
function onSubmit(e) {
var mediaItem = MEDIA_MODEL[self.id]
var fields = [].slice.apply(contactFields.children)
.filter(function(val) {
return val.id
})
.reduce(function(emailObj, fieldSprite) {
if(emailObj) {
emailObj[fieldSprite.id] = fieldSprite.input.value || ''
if(fieldSprite.id === 'Name' && fieldSprite.input.value === '') {
alert('Name field cannot be blank.');
return false;
} else if(fieldSprite.id === 'Email' && (fieldSprite.input.value.indexOf("@") === -1 || fieldSprite.input.value.indexOf(".") === -1)) {
alert('Please enter valid email address.');
return false;
} else if(fieldSprite.id === 'Comments' && fieldSprite.input.value === '') {
alert('Comments field cannot be blank.');
return false;
}
}
return emailObj
}, {})
fields.Title = mediaItem.label
fields.toEmail = mediaItem.content.contactFormEmail
fields.subject = mediaItem.content.contactFormSubject
if(fields) _localEvents.dispatchEvent(CONTACT_FORM_SUBMIT, fields);
}
function updateStyle(e) {
STATE.section(self.section)
Tween(self, self.updateSpeed, {backgroundColor:STATE.mediaView.backgroundColor()});
}
self.load = function load() {
self.loaded = true;
};
self.unload = function unload() {
};
self.show = function() {
self.display = 'block';
Tween(self, UPDATE_SPEED, {alpha:1});
};
self.hide = function() {
Tween(self, UPDATE_SPEED, {alpha:0,onComplete:function() {
self.display = 'none';
}});
};
function isVerticalPageBuild() {
STATE.section(self.section)
if(USER_AGENT === MOBILE) return true;
if(formContainer.width + 16 > STATE.mediaView.width()) return true
return false;
}
function updatePosition(e) {
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type;
contactExtraWidth = contactExtra.element.offsetWidth
if(contactExtraWidth > 320) {
contactExtraWidth = 320
contactExtra.width = 320;
contactExtra.textWrap = true;
contactExtra.style['word-wrap'] = 'break-word';
}
formContainer.width = contactExtraWidth + contactFields.width + 18;
if(isVerticalPageBuild()) {
contactExtra.x = 8;
contactFields.x = -8;
if(LAYOUT_MODEL.contactTitleShow) {
if(contactLabel) {
contactLabel.x = 8;
contactLabel.y = percentToPixels(LAYOUT_MODEL.contactTitleFontSize, 100);
}
contactExtra.y = contactLabel.y + percentToPixels(LAYOUT_MODEL.contactTitleFontSize, 100) + 16;
contactFields.y = contactExtra.y + contactExtra.element.offsetHeight + 16;
} else {
contactExtra.y = 0;
contactFields.y = contactExtra.element.offsetHeight;
}
if(self.scroll) self.scroll.align = 'top';
contactFields.borderLeft = '1px solid ' + toRgba(LAYOUT_MODEL.contactFieldRectColor, 0);
contactExtra.textAlign = 'left';
} else {
contactExtra.x = 0;
contactExtra.y = 0;
contactFields.x = contactExtraWidth + 16;
contactFields.y = 44;
contactFields.borderLeft = '1px solid ' + toRgba(LAYOUT_MODEL.contactFieldRectColor, 0.3);
contactExtra.textAlign = 'right';
if(LAYOUT_MODEL.contactTitleShow && contactLabel) {
contactLabel.textWrap = true;
contactLabel.x = contactExtraWidth + 32;
contactLabel.y = percentToPixels(LAYOUT_MODEL.contactTitleFontSize, 100) - 33;
}
// #990 - scroll.align = 'center' was pushing form to bottom of screen
if(self.scroll) self.scroll.align = 'top';
}
if(contactFormObj && !contactFormObj.contactFormExtra) {
if(self.scroll) self.scroll.align = 'top';
contactFields.borderLeft = '1px solid ' + toRgba(LAYOUT_MODEL.contactFieldRectColor, 0);
contactFields.x = -8;
if(contactLabel) contactLabel.x = 8;
}
formContainer.transition = 0;
getContactHeight()
Tween.defer(formContainer, self.updateSpeed, {x:getFormX(), y:getFormY(), onComplete:function(){
if(self.scroll) self.scroll.resize();
Tween(formContainer, UPDATE_SPEED, {alpha:1});
}});
self.updateSpeed = UPDATE_SPEED;
isInit = false;
updateScroll()
}
self.updatePosition = updatePosition
function getFormX() {
STATE.section(self.section)
layoutCalcs._activeView = 'contact';
if(formContainer.width + 16 > STATE.mediaView.width()) {
var left = Math.round((STATE.mediaView.width() - contactFields.width) * 0.5)
return left;
} else {
var left = Math.round((STATE.mediaView.width() - formContainer.width) * 0.5)
return left;
}
}
function getFormY() {
STATE.section(self.section)
layoutCalcs._activeView = 'contact';
if(formHeight > STATE.mediaView.height()) {
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) {
return 40
} else {
return 22
}
} else {
return Math.round((STATE.mediaView.height() - formHeight) * 0.5);
}
}
function destroy(e) {
_localEvents.removeEventListener(RESIZE, updatePosition);
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, updatePosition);
_localEvents.removeEventListener('destroy', destroy);
_localEvents.removeEventListener('showCursor', showCursor);
_localEvents.removeEventListener('hideCursor', hideCursor);
_localEvents.removeEventListener(CONTACT_FORM_SENT, contactResponse);
self.removeEventListener(CHILD_ADDED, childAdded);
}
return self;
}
function ImageView(imports) { // eslint-disable-line
var self = new Sprite({events:imports.localEvents})
self.alpha = 0
self.updateSpeed = 0
self.overflow = 'hidden'
self.id = imports.mediaItem.id
self.type = imports.mediaItem.type
self.dims = imports.size.content
self.section = imports.section
self.state = imports.state
self.mediaItem = imports.mediaItem
var image = new Bitmap()
var mask = new Sprite()
var caption
var loader
var originalImageWidth = imports.size.content.width
var originalImageHeight = imports.size.content.height
var imageWidth = 0
var imageHeight = 0
var imageX = 0
var imageY = 0
var maskWidth = 0
var maskHeight = 0
var loaded = false
var _captionLocal
var _localEvents = imports.localEvents
var state = imports.state
function hasLightboxButton() {
return STATE.lightboxSection &&
!LAYOUT_MODEL.lightboxGalleryBtnDisable &&
!LAYOUT_MODEL.lightboxImageDisable
}
var captionText = getCaptionText(imports.mediaItem)
if(captionText && STATE.overrides.captionMobileOverrides) {
var scale = 1
var icon = new Svg()
icon.left = 0
icon.top = 0
icon.rotate = 0
icon.path = new Path()
icon.path.scale = scale
icon.width = 15 * scale
icon.height = 15 * scale
icon.path.d = svgPaths.navInfo[LAYOUT_MODEL.navbarIconSet]
icon.path.strokeWidth = LAYOUT_MODEL.navbarIconSet === 'thin' ? 1 : 0
icon.path.fill = LAYOUT_MODEL.navbarIconSet === 'thin' ? 'none' : LAYOUT_MODEL.navbarColor
icon.path.stroke = LAYOUT_MODEL.navbarIconSet === 'thin' ? LAYOUT_MODEL.navbarColor : 'none'
icon.addChild(icon.path)
var mobileCaptionIcon = buildAlignedButton({
alignHorizontal:'right',
alignVertical:'top',
horizontalOffset:25,
verticalOffset:20,
blendMode:'normal',
font:'Helvetica',
fontSize:12,
fontColor:'#999999'
})
mobileCaptionIcon.zIndex = 1
mobileCaptionIcon.width = 15 * scale
mobileCaptionIcon.height = 15 * scale
mobileCaptionIcon.addChild(icon)
mobileCaptionIcon.addEventListener('click', function(e) {
if(caption) {
if(caption.isShowing) {
caption.hide()
} else {
var captionText = getCaptionText(imports.mediaItem)
caption.text = plainTextToHtml(captionText)
caption.show(updateCaptionStyle)
}
}
})
self.addChild(mobileCaptionIcon)
}
if(hasLightboxButton() && STATE.lightboxButtonsEnabled()) {
var mediaItemIndex = STATE.lightboxSection.media.indexOf(self.mediaItem.id)
/*
var AlignHorizontal
var AlignVertical
var HorizontalOffset
var VerticalOffset
var BlendMode
var Font
var FontSize
var FontColor
var RemoveText
var AddText
*/
if(!self.mediaItem.disableLightbox) {
var lightboxBtn = buildAlignedButton({
alignHorizontal:LAYOUT_MODEL.lightboxGalleryBtnAlignHorizontal || 'left',
alignVertical:LAYOUT_MODEL.lightboxGalleryBtnAlignVertical || 'top',
horizontalOffset:percentToPixels(LAYOUT_MODEL.lightboxGalleryBtnHorizontalOffset, stage.height),
verticalOffset:percentToPixels(LAYOUT_MODEL.lightboxGalleryBtnVerticalOffset, stage.height),
blendMode:LAYOUT_MODEL.lightboxGalleryBtnBlendMode || 'difference',
font:LAYOUT_MODEL.lightboxGalleryBtnFont || 'Helvetica',
fontSize:LAYOUT_MODEL.lightboxGalleryBtnFontSize || 12,
fontColor:LAYOUT_MODEL.lightboxGalleryBtnFontColor || '#999999'
})
lightboxBtn.zIndex = 1
lightboxBtn.text = mediaItemIndex > -1 ? (LAYOUT_MODEL.lightboxGalleryBtnRemoveText || '- Lightbox') : (LAYOUT_MODEL.lightboxGalleryBtnAddText || '+ Lightbox')
lightboxBtn.addEventListener('click', function(e) {
var idx = STATE.lightboxSection.media.indexOf(self.mediaItem.id)
var action
if(idx > -1) {
lightboxBtn.text = (LAYOUT_MODEL.lightboxGalleryBtnAddText || '+ Lightbox')
action = 'remove'
} else {
lightboxBtn.text = (LAYOUT_MODEL.lightboxGalleryBtnRemoveText || '- Lightbox')
action = 'add'
}
self.events.dispatchEvent('lightboxUpdateItem', {
action:action,
id:self.mediaItem.id
})
lightboxBtn.cursor = 'pointer'
})
self.addChild(lightboxBtn)
if(imports.section.isLightbox && !LAYOUT_MODEL.lightboxGalleryDownloadBtnDisable) {
var downloadBtn = buildAlignedButton({
alignHorizontal:LAYOUT_MODEL.lightboxDownloadBtnAlignHorizontal || 'right',
alignVertical:LAYOUT_MODEL.lightboxDownloadBtnAlignVertical || 'top',
horizontalOffset:percentToPixels(LAYOUT_MODEL.lightboxDownloadBtnHorizontalOffset, stage.height),
verticalOffset:percentToPixels(LAYOUT_MODEL.lightboxDownloadBtnVerticalOffset, stage.height),
blendMode:LAYOUT_MODEL.lightboxDownloadBtnBlendMode || 'difference',
font:LAYOUT_MODEL.lightboxDownloadBtnFont || 'Helvetica',
fontSize:LAYOUT_MODEL.lightboxDownloadBtnFontSize || 12,
fontColor:LAYOUT_MODEL.lightboxDownloadBtnFontColor || '#999999'
})
downloadBtn.zIndex = 1
downloadBtn.text = LAYOUT_MODEL.lightboxDownloadBtnText || '↓'
downloadBtn.addEventListener('click', function(e) {
self.events.dispatchEvent('lightboxDownloadOverlayOpen')
})
self.addChild(downloadBtn)
}
}
}
if(!isSlideshowGallery(self.section) && imports.mediaItem.attachment && !LAYOUT_MODEL.attachmentGalleryBtnDisable) {
// if(true) {
var attachmentBtn = buildAttachmentButton({
alignHorizontal:LAYOUT_MODEL.attachmentGalleryBtnAlignHorizontal || 'right',
alignVertical:LAYOUT_MODEL.attachmentGalleryBtnAlignVertical || 'top',
horizontalOffset:percentToPixels(LAYOUT_MODEL.attachmentGalleryBtnHorizontalOffset, stage.height),
verticalOffset:percentToPixels(LAYOUT_MODEL.attachmentGalleryBtnVerticalOffset, stage.height),
blendMode:LAYOUT_MODEL.attachmentGalleryBtnBlendMode || 'difference',
font:LAYOUT_MODEL.attachmentGalleryBtnFont || 'Helvetica',
fontSize:LAYOUT_MODEL.attachmentGalleryBtnFontSize || 12,
fontColor:LAYOUT_MODEL.attachmentGalleryBtnFontColor || '#999999',
iconColor:LAYOUT_MODEL.attachmentGalleryBtnFontColor || '#999999',
icon: svgPaths.cloud,
text: LAYOUT_MODEL.attachmentGalleryBtnText
})
attachmentBtn.zIndex = 1
attachmentBtn.addEventListener('click', function(e) {
self.events.dispatchEvent('attachmentDownload', imports.mediaItem.attachment)
})
self.addChild(attachmentBtn)
}
image.alpha = 0
image.selectable = false
mask.overflow = 'hidden'
_localEvents.addEventListener(RESIZE, updatePosition)
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, updatePosition)
_localEvents.addEventListener('destroy', destroy)
_localEvents.addEventListener('showCursor', showCursor)
_localEvents.addEventListener('hideCursor', hideCursor)
self.addEventListener(CHILD_ADDED, childAdded)
var captionText = getCaptionText(imports.mediaItem)
if(!caption && captionText !== '') {
caption = new Caption()
_captionLocal = imports.mediaItem.overrides || {}
_localEvents.addEventListener('showCaption', showCaption)
_localEvents.addEventListener('hideCaption', hideCaption)
_localEvents.addEventListener('checkCaption', checkCaptionOnScrollStop)
updateCaptionText(captionText)
}
function childAdded() {
if(!isSlideshowGallery(self.section)) {
self.element.navigationCursor = true
image.element.navigationCursor = true
mask.element.navigationCursor = true
}
image.element.addEventListener('contextmenu', disable)
image.element.addEventListener('dragstart', disable)
self.element.style['user-select'] = 'none'
mask.element.style['user-select'] = 'none'
image.element.style['user-select'] = 'none'
self.addChild(mask)
mask.addChild(image)
if(STATE.overrides.imageVideoLoaderType === 'spinner') {
loader = new LoadingIndicator({color:imports.loaderColor})
mask.addChild(loader)
}
updateStyle()
updatePosition()
}
function disable(e) {
var disableRightClick = SETTINGS_MODEL.disableRightClick === undefined || SETTINGS_MODEL.disableRightClick
if(disableRightClick) {
e.preventDefault()
}
}
function showCursor() {
if(!isSlideshowGallery(self.section)) {
self.element.navigationCursor = true
image.element.navigationCursor = true
mask.element.navigationCursor = true
}
}
function hideCursor() {
self.element.navigationCursor = false
image.element.navigationCursor = false
mask.element.navigationCursor = false
}
function updateStyle() {
STATE.section(self.section)
if(image && LAYOUT_MODEL.imageRendering.optimizeQuality) image.style['image-rendering'] = 'optimizeQuality'
if(image && LAYOUT_MODEL.imageRendering.webkitOptimizeContrast) image.style['image-rendering'] = '-webkit-optimize-contrast'
if(image && BROWSER_NAME === 'Safari' && LAYOUT_MODEL.imageRendering.webkitBackfaceVisibility) image.element.style['-webkit-backface-visibility'] = 'hidden'
if(image && USER_AGENT === MOBILE) image.element.style['-webkit-backface-visibility'] = 'hidden'
if(USER_AGENT === MOBILE) {
Tween(self, self.updateSpeed, {backgroundColor:LAYOUT_MODEL.containerColorMobile || STATE.mediaView.backgroundColor()})
} else if(USER_AGENT === TABLET) {
Tween(self, self.updateSpeed, {backgroundColor:LAYOUT_MODEL.containerColorTablet || STATE.mediaView.backgroundColor()})
} else {
var backgroundColor = STATE.mediaView.backgroundColor() // self.section && STATE.overrides.siteDisplayBehavior === 'overlay' ? toRgba(STATE.mediaView.backgroundColor(), LAYOUT_MODEL.mediaOverlayAlpha) : STATE.mediaView.backgroundColor()
Tween(self, self.updateSpeed, {backgroundColor:backgroundColor})
}
showCaption(state)
}
function updateCaptionStyle() {
if(/media/.test(_captionLocal.captionAnchorTo) || /media/.test(STATE.overrides.captionAnchorTo)) {
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type
caption.container.transition = 0
if(firstValid(_captionLocal.captionCloseButton, STATE.overrides.captionCloseButton)) {
caption.showCloseButton()
} else {
caption.hideCloseButton()
}
var alignVars = {
onInit:function() {
if(caption.scroll) {
caption.scroll.hide()
}
},
onComplete:function() {
if(caption.scroll) {
caption.scroll.show()
caption.scroll.resize()
}
}
}
var bgColor = _captionLocal.captionBackgroundRectColor || STATE.overrides.captionBackgroundRectColor
var bgAlpha = firstValid(_captionLocal.captionBackgroundAlpha, STATE.overrides.captionBackgroundAlpha)
caption.backgroundColor = toRgba(bgColor, bgAlpha)
caption.fontFamily = _captionLocal.captionFont || STATE.overrides.captionFont
caption.fontSize = stage.width < LAYOUT_MODEL.screenWidthBreakpoint ?
(_captionLocal.captionFontSizeBreakpoint || STATE.overrides.captionFontSizeBreakpoint || _captionLocal.captionFontSize || STATE.overrides.captionFontSize) :
(_captionLocal.captionFontSize || STATE.overrides.captionFontSize)
caption.fontColor = _captionLocal.captionFontColor || STATE.overrides.captionFontColor
if((USER_AGENT === MOBILE && LAYOUT_MODEL.captionMobileOverrides) || firstValid(_captionLocal.captionAutoPosition, STATE.overrides.captionAutoPosition) !== false) {
var padding = 20
var captionText = getCaptionText(imports.mediaItem)
layoutCalcs.captionView.size(captionText, padding)
caption.width = layoutCalcs.captionView.width
caption.height = layoutCalcs.captionView.height
alignVars.width = layoutCalcs.captionView.width
alignVars.height = layoutCalcs.captionView.height
alignVars.hRange = self.width
alignVars.vRange = self.height
alignVars.hAlign = 'center'
alignVars.vAlign = 'bottom'
alignVars.hOffset = 0
alignVars.vOffset = 33
caption.textAlign = 'center'
caption.paddingTop = padding
caption.paddingRight = 0
caption.paddingBottom = padding
caption.paddingLeft = 0
caption.buildScroll({
color:STATE.overrides.captionScrollbarColor,
hover:STATE.overrides.captionScrollbarHover,
align:STATE.overrides.captionTextAlignVertical,
side:STATE.overrides.captionScrollbarAlignment,
alpha:STATE.overrides.captionScrollbarBgAlpha,
width:STATE.overrides.captionScrollbarWidth,
offsetX:STATE.overrides.captionScrollbarHorizontalOffset,
offsetY:STATE.overrides.captionScrollbarVerticalOffset
})
} else {
caption.width = firstValid(_captionLocal.captionWidth, STATE.overrides.captionWidth)
caption.height = firstValid(_captionLocal.captionHeight, STATE.overrides.captionHeight)
alignVars.width = firstValid(_captionLocal.captionWidth, STATE.overrides.captionWidth)
alignVars.height = firstValid(_captionLocal.captionHeight, STATE.overrides.captionHeight)
if((isSlideshowGallery(self.section) && /fill|fitWidth/.test(STATE.overrides.slideshowScaleType)) || (!isSlideshowGallery(self.section) && /fill/.test(STATE.overrides.imageScaleType))) {
alignVars.hOrigin = 0
alignVars.vOrigin = 0
alignVars.hRange = maskWidth // layoutCalcs.mediaView.width()
alignVars.vRange = maskHeight // layoutCalcs.mediaView.height(self.section.key)
} else if(/unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || /^hScroll/.test(STATE.overrides.transitionType) || _captionLocal.captionAnchorTo === 'media item' || STATE.overrides.captionAnchorTo === 'media item') {
alignVars.hOrigin = STATE.mediaView.maskX() + imageX
alignVars.vOrigin = STATE.mediaView.maskY(self.section.key) + imageY
alignVars.hRange = imageWidth
alignVars.vRange = imageHeight
} else {
alignVars.hOrigin = 0
alignVars.vOrigin = 0
alignVars.hRange = layoutCalcs.mediaView.width()
alignVars.vRange = layoutCalcs.mediaView.height(self.section.key)
}
alignVars.hAlign = _captionLocal.captionAlignHorizontal || STATE.overrides.captionAlignHorizontal
alignVars.vAlign = _captionLocal.captionAlignVertical || STATE.overrides.captionAlignVertical
alignVars.hOffset = firstValid(_captionLocal.captionOffsetX, STATE.overrides.captionOffsetX)
alignVars.vOffset = firstValid(_captionLocal.captionOffsetY, STATE.overrides.captionOffsetY)
caption.textAlign = _captionLocal.captionTextAlign || STATE.overrides.captionTextAlign
caption.paddingTop = firstValid(_captionLocal.captionPaddingTop, STATE.overrides.captionPaddingTop)
caption.paddingRight = firstValid(_captionLocal.captionPaddingRight, STATE.overrides.captionPaddingRight)
caption.paddingBottom = firstValid(_captionLocal.captionPaddingBottom, STATE.overrides.captionPaddingBottom)
caption.paddingLeft = firstValid(_captionLocal.captionPaddingLeft, STATE.overrides.captionPaddingLeft)
caption.buildScroll({
color:_captionLocal.captionScrollbarColor || STATE.overrides.captionScrollbarColor,
hover:_captionLocal.captionScrollbarHover || STATE.overrides.captionScrollbarHover,
align:_captionLocal.captionTextAlignVertical || STATE.overrides.captionTextAlignVertical,
side:_captionLocal.captionScrollbarAlignment || STATE.overrides.captionScrollbarAlignment,
alpha:firstValid(_captionLocal.captionScrollbarBgAlpha, STATE.overrides.captionScrollbarBgAlpha),
width:firstValid(_captionLocal.captionScrollbarWidth, STATE.overrides.captionScrollbarWidth),
offsetX:firstValid(_captionLocal.captionScrollbarHorizontalOffset, STATE.overrides.captionScrollbarHorizontalOffset),
offsetY:firstValid(_captionLocal.captionScrollbarVerticalOffset, STATE.overrides.captionScrollbarVerticalOffset)
})
}
Align(caption.container, 0, alignVars)
}
}
function checkCaptionOnScrollStop(e) {
if(STATE.overrides.captionMobileOverrides) {
// don't mess with caption state on scroll stop
} else {
if(USER_AGENT !== MOBILE) {
showCaption(e)
} else {
caption.text = ''
caption.hide()
if(caption.scroll) caption.scroll.destroy()
}
}
}
function updateCaptionText(e) {
if(/media/.test(_captionLocal.captionAnchorTo) || /media/.test(STATE.overrides.captionAnchorTo)) {
caption.text = plainTextToHtml(e)
} else {
caption.hide()
if(caption.scroll) caption.scroll.destroy()
}
}
function anchorIsMedia(anchor) {
return /media/.test(anchor)
}
function showCaption(newState) {
if(USER_AGENT !== MOBILE || STATE.overrides.captionMobileOverrides) {
var captionDefault = firstValid(imports.mediaItem.overrides.captionDefault, STATE.overrides.captionDefault)
if(loaded && newState && caption && (captionDefault || newState.mode.indexOf('caption') > -1)) {
state = newState
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type
var captionText = getCaptionText(imports.mediaItem)
caption.text = plainTextToHtml(captionText)
var anchorToMedia = anchorIsMedia(firstValid(imports.mediaItem.overrides.captionAnchorTo, STATE.overrides.captionAnchorTo))
var isSlideshowCaption = isSlideshowGallery(self.section) && LAYOUT_MODEL.slideshowCaptions
if(anchorToMedia && (isSlideshowCaption || (state && state.mode && (captionDefault || state.mode.indexOf('caption') > -1)))) {
caption.show(updateCaptionStyle)
}
}
}
}
function hideCaption() {
var isSlideshowCaption = isSlideshowGallery(self.section) && LAYOUT_MODEL.slideshowCaptions
if(!isSlideshowCaption) caption.hide()
// if(caption.scroll) caption.scroll.destroy()
}
self.load = function load() {
self.loaded = true
// if(USER_AGENT === MOBILE) {
// image.src = getThumbQuery(1000, 1000, imports.mediaItem.content, imports.mediaItem.demoFile)
// } else {
image.addEventListener(LOAD, imageLoaded)
image.src = cdnMediaPath(imports.mediaItem.content, imports.mediaItem.demoFile)
// }
if(captionText !== '') {
self.addChild(caption.container)
updateCaptionStyle()
}
}
self.unload = function unload() {
}
self.hide = function() {
if(self.alpha === 1) {
Tween(self, UPDATE_SPEED, {alpha:0, onComplete:function(){
self.display = 'none'
}})
}
}
self.show = function() {
if(self.alpha === 0) {
self.display = 'block'
Tween(self, UPDATE_SPEED, {alpha:1})
}
}
function updatePosition() {
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type
maskWidth = STATE.mediaView.maskWidth(self.width)
maskHeight = STATE.mediaView.maskHeight(self.height, self.section.key)
Tween(mask, self.updateSpeed, {x:STATE.mediaView.maskX(), y:STATE.mediaView.maskY(self.section.key), width:maskWidth, height:maskHeight})
positionLoader()
if(loaded) resizeImage()
showCaption(state)
}
self.updatePosition = updatePosition
function imageLoaded() {
self.updateSpeed = 0
loaded = true
if(this.width && originalImageWidth !== this.width) originalImageWidth = this.width
if(this.height && originalImageHeight !== this.height) originalImageHeight = this.height
if(loader) {
loader.removeLoader()
mask.removeChild(loader)
}
updatePosition()
showCaption(state)
self.dispatchEvent(MEDIA_LOADED, {type:'image', id:imports.mediaItem.id, width:this.width, height:this.height})
self.events.dispatchEvent(MEDIA_LOADED, {type:'image', id:imports.mediaItem.id, width:this.width, height:this.height})
self.updateSpeed = UPDATE_SPEED
if(BROWSER_NAME === 'Safari' && /hScroll/.test(STATE.overrides.transitionType)) {
// image.element.setAttribute('data-pin-no-hover', true)
image.element.setAttribute('nopin', 'nopin')
}
}
function resizeImage() {
STATE.section(self.section)
var resize = Resize(null, 0, {
type:STATE.mediaView.imageScaleType(),
width:originalImageWidth,
height:originalImageHeight,
hRange:maskWidth,
vRange:maskHeight,
hAlign:STATE.mediaView.hAlign(),
vAlign:STATE.mediaView.vAlign(),
disableOrientationCheck:getOrientationCheck(self.type)
})
imageWidth = Math.ceil(resize.scale.width)
imageHeight = Math.ceil(resize.scale.height)
imageX = Math.floor(resize.align.x)
imageY = Math.floor(resize.align.y)
Tween(image, self.updateSpeed, {
x: imageX,
y: imageY,
width: imageWidth,
height: imageHeight,
onComplete:function(){
setTimeout(function(){
Tween(image, STATE.mediaView.transitionDuration(), {alpha:1, ease:'cubic-bezier(0.7, 0, 0.3, 1)'})
}, 0)
}
})
showCaption(state)
}
function positionLoader() {
if(loader) {
loader.x = (maskWidth - loader.width) * 0.5
loader.y = (maskHeight - loader.height) * 0.5
}
}
function destroy() {
_localEvents.removeEventListener('destroy', destroy)
_localEvents.removeEventListener(RESIZE, updatePosition)
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, updatePosition)
_localEvents.removeEventListener('showCursor', showCursor)
_localEvents.removeEventListener('hideCursor', hideCursor)
image.removeEventListener(LOAD, imageLoaded)
self.removeEventListener(CHILD_ADDED, childAdded)
}
return self
}
function PageView(imports) {
var self = new Sprite({events:imports.localEvents})
var text = new Sprite()
var image
var mask = new Sprite()
mask.id = 'pageViewMask'
var originalImageWidth = imports.size.featuredImage.width || 0
var originalImageHeight = imports.size.featuredImage.height || 0
var imageGap = 30
var maskWidth = 0
var maskHeight = 0
var _localEvents = imports.localEvents
var pageImgs
var pageSrcElements
var responsiveWidthElements
var responsiveElements
var maskX
var maskY
var CDN_SSL_URI = SETTINGS_MODEL.cdnSslUri + '/'
self.mediaItem = imports.mediaItem
self.section = imports.section
var isVerticalPage = isVerticalPageBuild()
self.alpha = 0;
text.alpha = 0;
self.updateSpeed = 0;
self.setClass('dx_page_text');
mask.setClass('pageviewMask');
text.setClass('ql-editor');
self.id = imports.mediaItem.id;
self.type = imports.mediaItem.type;
self.dims = imports.size.content;
self.element.navigationCursor = true;
self.overflow = 'hidden'
mask.overflow = 'hidden'
text.selectable = true
self.selectable = true
mask.selectable = true
text.selectable = true
_localEvents.addEventListener(RESIZE, updatePosition);
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
_localEvents.addEventListener('destroy', destroy);
_localEvents.addEventListener('showCursor', showCursor);
_localEvents.addEventListener('hideCursor', hideCursor);
self.addEventListener(CHILD_ADDED, childAdded);
function showCursor(e) {
if(!isSlideshowGallery(self.section)) {
self.element.navigationCursor = true;
if(image) image.element.navigationCursor = true;
mask.element.navigationCursor = true;
}
}
function hideCursor(e) {
self.element.navigationCursor = false;
if(image) image.element.navigationCursor = false;
mask.element.navigationCursor = false;
}
function layoutModelChange(e) {
if(/page|imageRendering/.test(e.id)) {
updateStyle();
updatePosition();
}
}
if(!isSlideshowGallery(self.section) && imports.mediaItem.attachment && !LAYOUT_MODEL.attachmentGalleryBtnDisable) {
// if(true) {
var attachmentBtn = buildAttachmentButton({
alignHorizontal:LAYOUT_MODEL.attachmentGalleryBtnAlignHorizontal || 'right',
alignVertical:LAYOUT_MODEL.attachmentGalleryBtnAlignVertical || 'top',
horizontalOffset:percentToPixels(LAYOUT_MODEL.attachmentGalleryBtnHorizontalOffset, stage.height),
verticalOffset:percentToPixels(LAYOUT_MODEL.attachmentGalleryBtnVerticalOffset, stage.height),
blendMode:LAYOUT_MODEL.attachmentGalleryBtnBlendMode || 'difference',
font:LAYOUT_MODEL.attachmentGalleryBtnFont || 'Helvetica',
fontSize:LAYOUT_MODEL.attachmentGalleryBtnFontSize || 12,
fontColor:LAYOUT_MODEL.attachmentGalleryBtnFontColor || '#999999',
iconColor:LAYOUT_MODEL.attachmentGalleryBtnFontColor || '#999999',
icon: svgPaths.cloud,
text: LAYOUT_MODEL.attachmentGalleryBtnText
})
attachmentBtn.zIndex = 1
attachmentBtn.addEventListener('click', function(e) {
self.events.dispatchEvent('attachmentDownload', imports.mediaItem.attachment)
})
self.addChild(attachmentBtn)
}
function init() {
STATE.section(self.section)
imports.mediaItem.content = unescapeScriptTags(imports.mediaItem.content)
self.loaded = false
var retinaSize = RetinaResizeEngine({width:originalImageWidth, height:originalImageHeight, filename:imports.mediaItem.featuredImage});
originalImageWidth = Math.round(retinaSize.width)
originalImageHeight = Math.round(retinaSize.height)
if(hasFeaturedImage() && !isVerticalPageBuild()) {
image = new Bitmap();
image.dataSrc = cdnMediaPath(imports.mediaItem.featuredImage, imports.mediaItem.demoFile)
if(!isSlideshowGallery(self.section)) {
image.element.navigationCursor = true;
mask.element.navigationCursor = true;
}
image.addEventListener(LOAD, imageLoaded);
image.alpha = 0;
self.addChild(image);
} else {
self.events.dispatchEvent(MEDIA_LOADED, {});
setTimeout(function(){
self.updateSpeed = STATE.mediaView.transitionDuration();
}, 0);
}
var textContent = "";
if(isValidPageTitle()) {
var fontProps = STATE.overrides.pageTitleFont.split(':')
var fontName = fontProps[0]
var fontWeight = fontProps[1]
var titleFontSize = percentToPixels(STATE.overrides.pageTitleFontSize, 22);
textContent += "" + imports.mediaItem.label + "
";
}
// if(imports.isBlog && imports.mediaItem.postDate) {
// var fontProps = STATE.overrides.pageTitleFont.split(':')
// var fontName = fontProps[0]
// var fontWeight = fontProps[1]
// var titleFontSize = percentToPixels(STATE.overrides.pageTitleFontSize, 22);
// text.text += "" + new Date(imports.mediaItem.postDate).toLocaleString() + "
";
// }
isVerticalPage = isVerticalPageBuild()
if(isVerticalPageBuild() && hasFeaturedImage()) {
textContent += " + ")
";
}
textContent += plainTextToHtml(imports.mediaItem.content);
// do this on self.load or something
// loadPageImages()
// before inserting into mask - collect all imgs
// unset the src and attach src value to data-src='...'
// find and replace src= with data-src=
// except for when lazy loader disabled (e.g. google maps)
if(textContent.indexOf('no-lazy-load') === -1) {
// disable lazy loader for things like google map pages
// add class='no-lazy-load' to main text page div
text.text = textContent.replace(/src\=/g, 'data-src=')
} else {
text.text = textContent
}
mask.addChild(text);
self.addChild(mask);
responsiveElements = text.element.getElementsByClassName('responsive');
responsiveWidthElements = text.element.getElementsByClassName('responsive-width');
}
function isSameSrc(filename) {
return function(data) {
// remove non-printing chars from equality check
return filename.replace(/[^ -~]+/g, '') === data.src
}
}
function getOriginalStyleSize(img) {
img.savedOpacity = img.style.opacity
img.style.opacity = 0
img.originalWidth = img.style.width
img.originalHeight = img.style.height
// img.style.width = dims.width + 'px'
// img.style.height = dims.height + 'px'
// if(dims.width > maskWidth || !maxWidth) img.style.maxWidth = '100%'
// placeholder size stuff
// inlineStyle
// if width and no height or height and no width
// set the width and height styles with a ratio
// else do nothing
// widthAttr
// set the width and height styles with a ratio
// neither widthAttr or inlineStyle
// embeddedStyleSheet
// maxWidth
return img
}
function childAdded(child) {
init()
// // set original dims before updatePosition
maskWidth = Math.round(STATE.mediaView.maskWidth(self.element.offsetWidth))
if(STATE.overrides.pageMaxWidth && maskWidth > STATE.overrides.pageMaxWidth) {
maskWidth = STATE.overrides.pageMaxWidth
}
pageSrcElements = getLoadableElements(text.element)
pageImgs = pageSrcElements
.filter(function(el) {
return el.tagName.toLowerCase() === 'img'
})
.map(getOriginalStyleSize)
updateStyle()
updatePosition()
setTimeout(function() {
updateStyle()
updatePosition()
}, 150)
}
function getLoadableElements(element) {
return Array.prototype.slice.apply(element.getElementsByTagName('img'))
.concat(Array.prototype.slice.apply(element.getElementsByTagName('video')))
.concat(Array.prototype.slice.apply(element.getElementsByTagName('iframe')))
.concat(Array.prototype.slice.apply(element.getElementsByTagName('input')))
}
function updateAdminSrcSizes(imgs) {
var pageImages =
imgs
.reduce(function(acc, data) {
if(data.img.tagName.toLowerCase() === 'img') {
var key = data.img.src.replace(CDN_SSL_URI, '')
acc = acc.concat({
src: key,
width: data.img.naturalWidth,
height: data.img.naturalHeight
})
}
return acc
}, [])
if(JSON.stringify(self.mediaItem.size.pageImages) !== JSON.stringify(pageImages)) {
self.mediaItem.size.pageImages = pageImages
_localEvents.dispatchEvent('adminPageviewImageSizes', self.mediaItem);
}
}
function getNaturalSize(img) {
return new Promise(function(resolve, reject) {
var timer
var src = img.getAttribute('data-src')
if(img.tagName.toLowerCase() === 'img') {
timer = setInterval(function() {
if(img.naturalWidth && img.naturalHeight) {
img.metaLoaded = true
clearInterval(timer)
resolve({img:img})
}
}, 10)
img.addEventListener('load', function() {
Tween(img, 0.35, {opacity:img.savedOpacity || 1})
})
img.addEventListener('error', function() {
clearInterval(timer)
})
setTimeout(function() {
if(timer) {
clearInterval(timer)
}
}, 10000)
} else {
resolve({img:img})
}
img.src = src
})
}
function disable(e) {
var disableRightClick = SETTINGS_MODEL.disableRightClick === undefined || SETTINGS_MODEL.disableRightClick
if(disableRightClick) {
e.preventDefault()
}
}
function disableRightClick(imgData) {
imgData.img.oncontextmenu = disable
imgData.img.ondragstart = disable
return imgData
}
function loadPageImages(pageMedia) {
Promise.all(pageMedia.map(getNaturalSize))
.then(function(imgs) {
return imgs.map(disableRightClick)
})
.then(updateAdminSrcSizes)
.then(updatePosition)
.catch(function(e) {
// updatePosition()
console.log('something broke while loading images:', e)
})
}
var debounceTimer
var heightUpdateRequired
function isNativePageScroll() {
return STATE.overrides.pageScrollType === 'native' ||
(MAC_SCROLLBARS && (STATE.overrides.pageScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll))
}
function updateScroll() {
STATE.section(self.section)
if(USER_AGENT === MOBILE || USER_AGENT === TABLET) mask.element.style['-webkit-overflow-scrolling'] = 'touch'
if(/vScroll/.test(STATE.overrides.transitionType) && STATE.siteView.unifiedPageScroll()) {
mask.element.style.overflow = 'hidden'
mask.element.style['-webkit-overflow-scrolling'] = 'touch'
Tween.defer(text, UPDATE_SPEED, {alpha:1});
} else if(isNativePageScroll() || /unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
mask.element.style.overflowY = 'auto'
mask.element.style.overflowX = 'hidden'
mask.element.style['-webkit-overflow-scrolling'] = 'touch'
Tween.defer(text, UPDATE_SPEED, {alpha:1});
} else {
if(self.scroll) {
self.scroll.destroy();
}
var scrollBarWidth = STATE.overrides.pageScrollbarWidth;
var scrollBarOffsetXDevice = USER_AGENT === MOBILE ? -(scrollBarWidth + 5) : STATE.overrides.pageScrollbarHorizontalOffset;
var scrollBarOffsetX = STATE.overrides.pageScrollbarAlignment === 'right' ? -scrollBarOffsetXDevice - scrollBarWidth : scrollBarOffsetXDevice + scrollBarWidth;
var scrollProps = {
name:'text page',
types:['bar','wheel','touch'],
axis:'y',
align:'top',
margin:STATE.overrides.pageScrollVerticalMargin,
color:STATE.overrides.pageScrollbarColor,
hover:STATE.overrides.pageScrollbarHover,
side:STATE.overrides.pageScrollbarAlignment,
alpha:STATE.overrides.pageScrollbarBgAlpha,
width:scrollBarWidth,
offsetX:scrollBarOffsetX,
offsetY:STATE.overrides.pageScrollbarVerticalOffset,
property:'translate',
rounded: STATE.overrides.pageScrollbarRounded,
visibility: STATE.overrides.pageScrollbarVisibility,
scrollTopCheck:true
}
if(STATE.overrides.pageScrollType === 'nativeMacOs' || LAYOUT_MODEL.globalSmoothScroll) {
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'right'
scrollProps.alpha = 0
scrollProps.width = 7
scrollProps.offsetX = 0
scrollProps.offsetY = 0
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
self.scroll = new Scroll(text, mask, scrollProps);
self.scroll.addEventListener('WINDOW_SCROLL_TOP', function(){
self.scroll.percent = 0;
self.scroll.update(UPDATE_SPEED);
});
}
STATE.section(self.section)
var topMargin = percentToPixels(STATE.overrides.pageMarginTop, stage.height);
var btmMargin = percentToPixels(STATE.overrides.pageMarginBottom, stage.height);
var contentHeight = topMargin + text.element.offsetHeight + btmMargin
if(hasFeaturedImage() && !isVerticalPageBuild()) {
var retinaSize = RetinaResizeEngine({width:imports.mediaItem.size.featuredImage.width, height:imports.mediaItem.size.featuredImage.height, filename:image.dataSrc});
var featImageWidth = Math.round(retinaSize.width)
var featImageHeight = Math.round(retinaSize.height)
contentHeight = contentHeight > topMargin + featImageHeight + btmMargin ? contentHeight : topMargin + featImageHeight + btmMargin
}
heightUpdateRequired = contentHeight !== self.contentHeight
self.contentHeight = contentHeight
// return legacy || (section.media.length > 1 && is a horizontal gallery)
if(isMediaViewMask_ViewportConstrained_Legacy(self.section)) {
layoutCalcs._mediaMarginPrefix = 'page'
mask.height = Math.round(STATE.mediaView.maskHeight(undefined, self.section.key))
self.height = Math.round(STATE.mediaView.height(self.section.key))
} else {
mask.height = contentHeight
self.height = contentHeight
}
// self.width = maskWidth
// if this gate is not well guarded you will create
// an infinite loop
if(heightUpdateRequired) {
// set to vertical scroll transition
setTimeout(function() {
_localEvents.dispatchEvent('MEDIA_HEIGHT_CHANGE');
}, 100)
}
if(self.scroll) self.scroll.resize();
Tween.defer(text, UPDATE_SPEED, {alpha:1});
}
function isMediaViewMask_ViewportConstrained_Legacy(section) {
STATE.section(self.section)
// removed mobile check due to #1375
// then added back with vScroll check for text pages on mobile
// added this for tablet due to #1618
if((USER_AGENT === MOBILE || USER_AGENT === TABLET) && /vScroll/.test(STATE.overrides.transitionType)) return false
return STATE.overrides.siteDisplayBehavior === 'none' ||
(!/vScroll/.test(STATE.overrides.transitionType) && section.media.length > 1)
}
function isValidPageTitle() {
STATE.section(self.section)
return STATE.overrides.pageTitle && imports.mediaItem.label !== '';
}
function hasFeaturedImage() {
return imports.mediaItem.featuredImage !== '';
}
function updateStyle(e) {
STATE.section(self.section)
if(image && LAYOUT_MODEL.imageRendering.optimizeQuality) image.style['image-rendering'] = 'optimizeQuality';
if(image && LAYOUT_MODEL.imageRendering.webkitOptimizeContrast) image.style['image-rendering'] = '-webkit-optimize-contrast';
if(image && BROWSER_NAME === 'Safari' && LAYOUT_MODEL.imageRendering.webkitBackfaceVisibility) image.style['-webkit-backface-visibility'] = 'hidden';
text.fontFamily = STATE.overrides.pageTextFont;
text.fontColor = STATE.overrides.pageTextFontColor;
text.fontSize = STATE.overrides.pageTextFontSize;
text.letterSpacing = STATE.overrides.pageTextKerning;
Tween(self, self.updateSpeed, {backgroundColor:STATE.mediaView.backgroundColor()});
};
self.load = function load() {
if(hasFeaturedImage() && !isVerticalPageBuild() && image && image.dataSrc) {
image.src = image.dataSrc
}
self.loaded = true
if(!text.element.getElementsByClassName('no-lazy-load').length) {
// disable lazy loader for things like google map pages
// add class='no-lazy-load' to main text page div
loadPageImages(pageSrcElements)
}
updatePosition()
};
self.unload = function unload() {
};
self.show = function() {
self.display = 'block';
Tween(self, UPDATE_SPEED, {alpha:1});
};
self.hide = function() {
Tween(self, UPDATE_SPEED, {alpha:0,onComplete:function() {
self.display = 'none';
}});
};
function updatePosition(e) {
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type;
maskX = Math.round(STATE.mediaView.maskX())
maskY = Math.round(STATE.mediaView.maskY(self.section.key))
var fullMaskWidth = STATE.mediaView.maskWidth(self.element.offsetWidth)
maskWidth = Math.round(STATE.mediaView.maskWidth(self.element.offsetWidth))
maskHeight = Math.round(STATE.mediaView.maskHeight(self.element.offsetHeight, self.section.key))
if(STATE.overrides.pageMaxWidth && maskWidth > STATE.overrides.pageMaxWidth) {
maskWidth = STATE.overrides.pageMaxWidth
switch(STATE.overrides.pageMaxAlign) {
case 'center':
maskX += Math.round((fullMaskWidth - maskWidth) * 0.5)
break
case 'right':
maskX += Math.round(fullMaskWidth - maskWidth)
break
default:
// pass maskX thru
break
}
}
if(image && hasFeaturedImage() && !isVerticalPageBuild()) {
maskX += originalImageWidth + imageGap;
maskWidth -= (originalImageWidth + imageGap);
Tween(image, self.updateSpeed, {x:maskX - originalImageWidth - imageGap, y:maskY});
}
if(!isVerticalPage && isVerticalPageBuild()) {
if(image) {
self.removeChild(image);
image = undefined;
}
init();
pageSrcElements = getLoadableElements(text.element)
pageImgs = pageSrcElements
.filter(function(el) {
return el.tagName.toLowerCase() === 'img'
})
.map(getOriginalStyleSize)
} else if(isVerticalPage && !isVerticalPageBuild()) {
text.text = '';
init();
pageSrcElements = getLoadableElements(text.element)
pageImgs = pageSrcElements
.filter(function(el) {
return el.tagName.toLowerCase() === 'img'
})
.map(getOriginalStyleSize)
}
Tween(mask, 0, {x:maskX, y:maskY, width:maskWidth/*, height:maskHeight*/});
Tween(text, 0, {width:maskWidth});
updateResponsiveElements();
if(responsiveElements && responsiveElements.length > 0) {
if(isPod() || isPad()) {
mask.style.overflow = 'auto';
mask.style['-webkit-overflow-scrolling'] = 'touch';
}
Tween.defer(text, UPDATE_SPEED, {alpha:1});
}
updateScroll();
};
self.updatePosition = updatePosition
function updateResponsiveElements() {
if(responsiveElements) {
var el = responsiveElements[0];
if(el && el.tagName.toLowerCase() === 'iframe') {
el.style.overflow = 'hidden';
el.style.width = maskWidth + 'px';
el.style.height = maskHeight + 'px';
el.style.border = 'none';
} else if(el) {
var pageOffsetHeight = Math.round(STATE.mediaView.maskHeight(text.element.offsetHeight, self.section.key))
var mediaViewMaskHeight = Math.round(STATE.mediaView.maskHeight(undefined, self.section.key))
var elHeight = pageOffsetHeight > mediaViewMaskHeight ? pageOffsetHeight : mediaViewMaskHeight
el.style.overflow = 'hidden';
el.style.width = (maskWidth - el.offsetLeft) + 'px';
el.style.height = (elHeight - el.offsetTop) + 'px';
el.style.border = 'none';
}
}
if(responsiveWidthElements) {
var el2 = responsiveWidthElements[0];
if(el2) {
el2.style.overflow = 'hidden';
el2.style.width = (maskWidth - el2.offsetLeft) + 'px';
el2.style.border = 'none';
}
}
if(pageImgs) {
var i = pageImgs.length;
if(i > 0) {
while(i--) {
var img = pageImgs[i];
var filename = img.getAttribute('data-src') ? img.getAttribute('data-src').replace(CDN_SSL_URI, '') : ''
if(filename && self.mediaItem.size.pageImages) {
// save inline style for when natural width/height loads
// then reset back to original w/h style when getNaturalSize fires
// remember that originalWidth/height is different than the natural size
var computedStyle = window.getComputedStyle(img)
var maxWidth = computedStyle.getPropertyValue('max-width')
var widthAttr = img.getAttribute('width')
var heightAttr = img.getAttribute('height')
if(!img.metaLoaded) {
// calc placeholder size for initial load
var size = self.mediaItem.size.pageImages.filter(isSameSrc(filename))
var dims = size[0] || {}
var width = dims.width || img.naturalWidth
var height = dims.height || img.naturalHeight
var computedWidth = parseFloat(computedStyle.getPropertyValue('width'), 10) || widthAttr || width
var styleWidth = (computedWidth > maskWidth ? maskWidth : computedWidth) || maskWidth
var ratio = height / width
// used to set placeholder size before image load
img.style.width = styleWidth + 'px'
img.style.height = (ratio * styleWidth) + 'px'
// } else if(img.offsetWidth > maskWidth) {
// img.style.width = maskWidth + 'px'
} else {
if(img.originalWidth) {
img.style.width = img.originalWidth
} else if(widthAttr) {
img.style.width = widthAttr + 'px'
} else {
img.style.removeProperty('width')
}
if(img.originalHeight) {
img.style.height = img.originalHeight
} else if(heightAttr) {
img.style.height = heightAttr + 'px'
} else {
img.style.removeProperty('height')
}
if(maxWidth === 'none') img.style.maxWidth = '100%'
}
}
}
}
}
}
function imageLoaded(e) {
self.updateSpeed = 0;
var retinaSize = RetinaResizeEngine({width:image.element.offsetWidth, height:image.element.offsetHeight, filename:image.src});
originalImageWidth = Math.round(retinaSize.width)
originalImageHeight = Math.round(retinaSize.height)
image.width = originalImageWidth;
image.height = originalImageHeight;
Tween(image, 1, {alpha:1});
self.updateSpeed = STATE.mediaView.transitionDuration();
self.events.dispatchEvent(MEDIA_LOADED, {type:'featuredImage', id:imports.mediaItem.id, width:image.width, height:image.height});
}
function destroy(e) {
_localEvents.removeEventListener(RESIZE, updatePosition);
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, updatePosition);
_localEvents.removeEventListener('destroy', destroy);
_localEvents.removeEventListener('showCursor', showCursor);
_localEvents.removeEventListener('hideCursor', hideCursor);
if(image) image.removeEventListener(LOAD, imageLoaded);
self.removeEventListener(CHILD_ADDED, childAdded);
}
function isVerticalPageBuild() {
if(USER_AGENT === MOBILE) return true;
// if(STATE.overrides.pageMaxAlign === 'center') return true
// this was causing page images to load multiple times ... and extra init()'s to be called
// esp in safari
// if(STATE.mediaView.width() < STATE.mediaView.height(self.section.key)) return true;
var maxPageWidth = STATE.overrides.pageMaxWidth || LAYOUT_MODEL.screenWidthBreakpoint || 1000
if(stage.width < maxPageWidth) return true;
var minTextWidth = 250
return STATE.mediaView.maskWidth() < STATE.mediaView.maskHeight() || (originalImageWidth + imageGap + minTextWidth) > maxPageWidth
// return (originalImageWidth && (STATE.mediaView.maskWidth() < STATE.mediaView.maskX() + originalImageWidth + imageGap + minTextWidth))
}
return self;
}
function VideoView(imports) { // eslint-disable-line
var self = new Sprite({events:imports.localEvents})
self.alpha = 0
self.updateSpeed = 0
self.overflow = 'hidden'
self.id = imports.mediaItem.id
self.type = imports.mediaItem.type
self.dims = imports.size.content
self.section = imports.section
self.state = imports.state
self.mediaItem = imports.mediaItem
if(!imports.mediaItem.thumb.length) {
MEDIA_MODEL[self.id].size.thumb.width = 1200
MEDIA_MODEL[self.id].size.thumb.height = 800
}
if(/mp4/.test(imports.mediaItem.thumb)) {
// alternative for animated gifs
var poster = new Sprite({type:'video'})
poster.element.setAttribute('muted', true)
poster.element.setAttribute('autoplay', true)
poster.element.setAttribute('loop', true)
poster.element.setAttribute('playsinline', true)
poster.element.setAttribute('type', 'video/mp4')
} else {
var poster = new Bitmap()
}
poster.alpha = 0
poster.zIndex = 1
var autoplay
var mask = new Sprite()
mask.element.className = "video.mask"
var caption
var video
var bigPlayIcon = new Bitmap()
var loader
var originalPosterWidth = imports.size.thumb.width
var originalPosterHeight = imports.size.thumb.height
var posterWidth = 0
var posterHeight = 0
var posterX = 0
var posterY = 0
var maskWidth = 0
var maskHeight = 0
var originalVideoWidth = imports.size.content.width
var originalVideoHeight = imports.size.content.height
var videoWidth = 0
var videoHeight = 0
var videoX = 0
var videoY = 0
var videoLoaded = false
var videoMetadataLoaded = false
var posterLoaded = false
var _captionLocal
var _localEvents = imports.localEvents
var vimeoCursorMask
var state = imports.state
var hudTimeout
function hasLightboxButton() {
return STATE.lightboxSection &&
!LAYOUT_MODEL.lightboxGalleryBtnDisable &&
!LAYOUT_MODEL.lightboxVideoDisable
}
var captionText = getCaptionText(imports.mediaItem)
if(captionText && STATE.overrides.captionMobileOverrides) {
var scale = 1
var icon = new Svg()
icon.left = 0
icon.top = 0
icon.rotate = 0
icon.path = new Path()
icon.path.scale = scale
icon.width = 15 * scale
icon.height = 15 * scale
icon.path.d = svgPaths.navInfo[LAYOUT_MODEL.navbarIconSet]
icon.path.strokeWidth = LAYOUT_MODEL.navbarIconSet === 'thin' ? 1 : 0
icon.path.fill = LAYOUT_MODEL.navbarIconSet === 'thin' ? 'none' : LAYOUT_MODEL.navbarColor
icon.path.stroke = LAYOUT_MODEL.navbarIconSet === 'thin' ? LAYOUT_MODEL.navbarColor : 'none'
icon.addChild(icon.path)
var mobileCaptionIcon = buildAlignedButton({
alignHorizontal:'right',
alignVertical:'top',
horizontalOffset:25,
verticalOffset:20,
blendMode:'normal',
font:'Helvetica',
fontSize:12,
fontColor:'#999999'
})
mobileCaptionIcon.zIndex = 1
mobileCaptionIcon.addChild(icon)
mobileCaptionIcon.addEventListener('click', function(e) {
if(caption) {
if(caption.isShowing) {
caption.hide()
} else {
var captionText = getCaptionText(imports.mediaItem)
caption.text = plainTextToHtml(captionText)
caption.show(updateCaptionStyle)
}
}
})
self.addChild(mobileCaptionIcon)
}
if(hasLightboxButton() && STATE.lightboxButtonsEnabled()) {
/*
var lightboxGalleryBtnAlignHorizontal
var lightboxGalleryBtnAlignVertical
var lightboxGalleryBtnHorizontalOffset
var lightboxGalleryBtnVerticalOffset
var lightboxGalleryBtnBlendMode
var lightboxGalleryBtnFont
var lightboxGalleryBtnFontSize
var lightboxGalleryBtnFontColor
var lightboxGalleryBtnRemoveText
var lightboxGalleryBtnAddText
*/
if(!self.mediaItem.disableLightbox) {
var mediaItemIndex = STATE.lightboxSection.media.indexOf(self.mediaItem.id)
var lightboxBtn = buildAlignedButton({
alignHorizontal:LAYOUT_MODEL.lightboxGalleryBtnAlignHorizontal || 'left',
alignVertical:LAYOUT_MODEL.lightboxGalleryBtnAlignVertical || 'top',
horizontalOffset:percentToPixels(LAYOUT_MODEL.lightboxGalleryBtnHorizontalOffset, stage.height),
verticalOffset:percentToPixels(LAYOUT_MODEL.lightboxGalleryBtnVerticalOffset, stage.height),
blendMode:LAYOUT_MODEL.lightboxGalleryBtnBlendMode || 'difference',
font:LAYOUT_MODEL.lightboxGalleryBtnFont || 'Helvetica',
fontSize:LAYOUT_MODEL.lightboxGalleryBtnFontSize || 12,
fontColor:LAYOUT_MODEL.lightboxGalleryBtnFontColor || '#999999'
})
lightboxBtn.zIndex = 1
lightboxBtn.text = mediaItemIndex > -1 ? (LAYOUT_MODEL.lightboxGalleryBtnRemoveText || '- Lightbox') : (LAYOUT_MODEL.lightboxGalleryBtnAddText || '+ Lightbox')
lightboxBtn.addEventListener('click', function(e) {
var idx = STATE.lightboxSection.media.indexOf(self.mediaItem.id)
var action
if(idx > -1) {
lightboxBtn.text = (LAYOUT_MODEL.lightboxGalleryBtnAddText || '+ Lightbox')
action = 'remove'
} else {
lightboxBtn.text = (LAYOUT_MODEL.lightboxGalleryBtnRemoveText || '- Lightbox')
action = 'add'
}
self.events.dispatchEvent('lightboxUpdateItem', {
action:action,
id:self.mediaItem.id
})
lightboxBtn.cursor = 'pointer'
})
self.addChild(lightboxBtn)
if(imports.section.isLightbox && !LAYOUT_MODEL.lightboxGalleryDownloadBtnDisable) {
var downloadBtn = buildAlignedButton({
alignHorizontal:LAYOUT_MODEL.lightboxDownloadBtnAlignHorizontal || 'right',
alignVertical:LAYOUT_MODEL.lightboxDownloadBtnAlignVertical || 'top',
horizontalOffset:percentToPixels(LAYOUT_MODEL.lightboxDownloadBtnHorizontalOffset, stage.height),
verticalOffset:percentToPixels(LAYOUT_MODEL.lightboxDownloadBtnVerticalOffset, stage.height),
blendMode:LAYOUT_MODEL.lightboxDownloadBtnBlendMode || 'difference',
font:LAYOUT_MODEL.lightboxDownloadBtnFont || 'Helvetica',
fontSize:LAYOUT_MODEL.lightboxDownloadBtnFontSize || 12,
fontColor:LAYOUT_MODEL.lightboxDownloadBtnFontColor || '#999999'
})
downloadBtn.text = LAYOUT_MODEL.lightboxDownloadBtnText || '↓'
downloadBtn.zIndex = 1
downloadBtn.addEventListener('click', function(e) {
self.events.dispatchEvent('lightboxDownloadOverlayOpen')
})
self.addChild(downloadBtn)
}
}
}
if(!isSlideshowGallery(self.section) && imports.mediaItem.attachment && !LAYOUT_MODEL.attachmentGalleryBtnDisable) {
// if(true) {
var attachmentBtn = buildAttachmentButton({
alignHorizontal:LAYOUT_MODEL.attachmentGalleryBtnAlignHorizontal || 'right',
alignVertical:LAYOUT_MODEL.attachmentGalleryBtnAlignVertical || 'top',
horizontalOffset:percentToPixels(LAYOUT_MODEL.attachmentGalleryBtnHorizontalOffset, stage.height),
verticalOffset:percentToPixels(LAYOUT_MODEL.attachmentGalleryBtnVerticalOffset, stage.height),
blendMode:LAYOUT_MODEL.attachmentGalleryBtnBlendMode || 'difference',
font:LAYOUT_MODEL.attachmentGalleryBtnFont || 'Helvetica',
fontSize:LAYOUT_MODEL.attachmentGalleryBtnFontSize || 12,
fontColor:LAYOUT_MODEL.attachmentGalleryBtnFontColor || '#999999',
iconColor:LAYOUT_MODEL.attachmentGalleryBtnFontColor || '#999999',
icon: svgPaths.cloud,
text: LAYOUT_MODEL.attachmentGalleryBtnText
})
attachmentBtn.zIndex = 1
attachmentBtn.addEventListener('click', function(e) {
self.events.dispatchEvent('attachmentDownload', imports.mediaItem.attachment)
})
self.addChild(attachmentBtn)
}
mask.overflow = 'hidden'
bigPlayIcon.width = 70
bigPlayIcon.height = 70
bigPlayIcon.alpha = 0
bigPlayIcon.zIndex = 4
self.addEventListener(CHILD_ADDED, childAdded)
self.events.addEventListener(PAUSE_MEDIA, pauseMedia)
self.events.addEventListener(DESTROY_MEDIA, destroyMedia)
self.events.addEventListener(ADMIN_MOUSE_DOWN, vimeoPointerEventsOff)
self.events.addEventListener(ADMIN_MOUSE_UP, vimeoPointerEventsOn)
_localEvents.addEventListener(RESIZE, updatePosition)
_localEvents.addEventListener(LAYOUT_MODEL_CHANGE, function() {
if(video) {
if(isVimeo(imports.mediaItem)) {
if(STATE.overrides.videoLoop) {
video.setLoop('true')
} else {
video.setLoop('false')
}
} else if(STATE.overrides.videoLoop) {
video.element.setAttribute("loop", true)
} else {
video.element.removeAttribute("loop")
}
}
updatePosition()
})
_localEvents.addEventListener('mediaSizeUpdate', updatePosition)
_localEvents.addEventListener(MEDIA_MODEL_CHANGE, updateMedia)
_localEvents.addEventListener('mediaAutoPlay', mediaAutoPlay)
_localEvents.addEventListener('spacebarTogglePlay', spacebarTogglePlay)
_localEvents.addEventListener('destroy', destroy)
_localEvents.addEventListener('showCursor', showCursor)
_localEvents.addEventListener('hideCursor', hideCursor)
var captionText = getCaptionText(imports.mediaItem)
if(!caption && captionText !== '') {
caption = new Caption()
caption.container.zIndex = 3
_captionLocal = imports.mediaItem.overrides || {}
_localEvents.addEventListener('showCaption', showCaption)
_localEvents.addEventListener('hideCaption', hideCaption)
_localEvents.addEventListener('checkCaption', checkCaptionOnScrollStop)
updateCaptionText(captionText)
// setTimeout(updateCaptionStyle, self.updateSpeed * 1000)
}
function showCursor() {
if(!isSlideshowGallery(self.section)) {
poster.element.navigationCursor = true
mask.element.navigationCursor = true
}
if(video) video.element.navigationCursor = poster.element.navigationCursor
if(vimeoCursorMask) {
vimeoCursorMask.top.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.right.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.bottom.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.left.element.navigationCursor = poster.element.navigationCursor
}
}
function hideCursor() {
poster.element.navigationCursor = false
mask.element.navigationCursor = false
if(video) video.element.navigationCursor = poster.element.navigationCursor
if(vimeoCursorMask) {
vimeoCursorMask.top.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.right.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.bottom.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.left.element.navigationCursor = poster.element.navigationCursor
}
}
function childAdded() {
STATE.section(self.section)
if(!isSlideshowGallery(self.section)) {
poster.element.navigationCursor = true
mask.element.navigationCursor = true
}
poster.element.addEventListener('contextmenu', disable)
poster.element.addEventListener('dragstart', disable)
self.element.style['user-select'] = 'none'
mask.element.style['user-select'] = 'none'
poster.element.style['user-select'] = 'none'
bigPlayIcon.addEventListener(CLICK, bigPlayClick)
if(STATE.overrides.imageVideoLoaderType === 'spinner') {
loader = new LoadingIndicator({color:imports.loaderColor})
loader.zIndex = 2
mask.addChild(loader)
}
self.addChild(mask)
mask.addChild(poster)
mask.addChild(bigPlayIcon)
}
function disable(e) {
var disableRightClick = SETTINGS_MODEL.disableRightClick === undefined || SETTINGS_MODEL.disableRightClick
if(disableRightClick) {
e.preventDefault()
}
}
self.load = function load() {
STATE.section(self.section)
self.loaded = true
self.playState = STATE.overrides.videoAutoPlay ? 'playing' : 'paused'
if(captionText !== '') {
self.addChild(caption.container)
updateCaptionStyle()
}
if(showPosterImage(imports.mediaItem)) {
if(/mp4/.test(imports.mediaItem.thumb)) {
poster.element.addEventListener(METADATA_LOADED, function(e) {
imageLoaded()
this.muted = true
this.play()
})
poster.src = cdnMediaPath(imports.mediaItem.thumb, imports.mediaItem.demoFile)
} else {
poster.addEventListener(LOAD, imageLoaded)
if(imports.mediaItem.thumb.length) {
poster.src = cdnMediaPath(imports.mediaItem.thumb, imports.mediaItem.demoFile)
} else {
poster.src = ICONS + "videoLarge2.png"
}
}
} else if(!video) {
createVideoPlayer()
if(!STATE.overrides.videoAutoPlay || USER_AGENT === MOBILE || USER_AGENT === TABLET) {
video.setSource(imports.mediaItem.content, false)
}
showCaption(state)
}
}
self.unload = function unload() {
// mask.removeChild(video)
// video = null
}
self.play = function(autoplay) {
// make sure all other videos are paused before playing this video
_localEvents.dispatchEvent(PAUSE_MEDIA)
setTimeout(function() {
STATE.section(self.section)
autoplay = autoplay !== undefined ? autoplay : STATE.overrides.videoAutoPlay
if(video && video.src) {
video.play()
} else if(video && !video.src) {
video.setSource(imports.mediaItem.content, autoplay)
// if(isPod() || isPad()) video.play()
} else if(!video) {
createVideoPlayer()
video.setSource(imports.mediaItem.content, autoplay)
}
if(loader) {
loader.removeLoader()
loader.zIndex = 0
}
// if(STATE.overrides.videoAutoPlay) {
Tween(bigPlayIcon, UPDATE_SPEED, {alpha:0, onComplete:function(){
bigPlayIcon.display = 'none'
}})
// }
if(isSlideshowGallery(self.section) && !LAYOUT_MODEL.landingMediaUnmuteBtn) {
if(typeof video.disableUnmuteButton === 'function') video.disableUnmuteButton()
if(!isVimeo(imports.mediaItem)) video.hud.disable()
}
}, 0)
}
self.pause = function() {
if(video) video.pause()
}
self.destroy = function() {
destroyMedia()
}
self.autoPlay = function() {
// if((USER_AGENT === MOBILE && STATE.overrides.mobileAutoPlay) || (!isPod() && !isPad())) {
self.play(true)
if(USER_AGENT !== MOBILE) updatePosition()
// }
}
function spacebarTogglePlay(e) {
if(e === self.id) {
if(!video || video.paused) {
self.play(true /* autoplay */)
} else if(video && !video.paused && video.src) {
video.pause()
}
} else if(video && video.src) {
// not sure if this is needed
// legacy and causing issues with vimeo "postMessage"
// trying to set "pause" before the iframe loads
if(!video.paused) video.pause()
}
}
function mediaAutoPlay(e) {
// if((USER_AGENT === MOBILE && STATE.overrides.mobileAutoPlay) || (!isPod() && !isPad())) {
if(e === self.id) {
self.play()
updatePosition()
} else if(video && video.src) {
// not sure if this is needed
// legacy and causing issues with vimeo "postMessage"
// trying to set "pause" before the iframe loads
if(!video.paused) video.pause()
}
// if(e !== self.id && video && video.src && !video.paused) video.pause()
}
function vimeoPointerEventsOff() {
if(isVimeo(imports.mediaItem)) {
video.pointerEvents = 'none'
}
}
function vimeoPointerEventsOn() {
if(isVimeo(imports.mediaItem)) {
video.pointerEvents = 'auto'
}
}
function bigPlayIconLoaded() {
STATE.section(self.section)
bigPlayIcon.transition = 0
bigPlayIcon.width = 70
bigPlayIcon.height = 70
alignBigPlay()
if(!STATE.overrides.videoAutoPlay) {
setTimeout(function() {
Tween(bigPlayIcon, UPDATE_SPEED, {alpha:1})
}, 10)
}
}
function alignBigPlay() {
bigPlayIcon.transition = 0
setTimeout(function() {
bigPlayIcon.x = poster.x + ((poster.width - 70) * 0.5)
bigPlayIcon.y = poster.y + ((poster.height - 70) * 0.5)
}, 10)
}
function pauseMedia() {
if(videoLoaded && !isSlideshowGallery(self.section)) {
if(video) video.pause()
self.events.removeEventListener(TRANSITION_END, createVideoPlayer)
if(isVimeo(imports.mediaItem)) {
bigPlayIcon.display = 'block'
}
video.removeKeyListener()
}
}
function destroyMedia(e) {
if(video) {
pauseMedia(e)
self.events.removeEventListener(PAUSE_MEDIA, pauseMedia)
mask.removeChild(video)
video.destroy()
self.events.removeEventListener(DESTROY_MEDIA, destroyMedia)
}
}
function buildMask() {
var _mask = new Sprite()
_mask.element.className = "vimeoMask"
_mask.element.navigationCursor = poster.element.navigationCursor
// mask.backgroundColor = 'rgba(255,0,0,0.3)'
return _mask
}
function buildVimeoCursorMask() {
return {
top:buildMask(),
right:buildMask(),
bottom:buildMask(),
left:buildMask()
}
}
function createVideoPlayer() {
STATE.section(self.section)
var vimeoOpts = {
events:_localEvents
}
if(USER_AGENT === MOBILE && STATE.overrides.mobileAutoPlay) {
vimeoOpts.thumbBuild = true
}
if(isVimeo(imports.mediaItem) && !video) {
video = new VimeoPlayer(vimeoOpts)
video.element.navigationCursor = poster.element.navigationCursor
self.video = video
video.addEventListener(VIMEO_METADATA_LOADED, onVimeoMetadataLoaded)
mask.addChild(video)
if(!isPod() && !isSlideshowGallery(self.section)) {
vimeoCursorMask = buildVimeoCursorMask()
mask.addChild(vimeoCursorMask.top)
mask.addChild(vimeoCursorMask.right)
mask.addChild(vimeoCursorMask.bottom)
mask.addChild(vimeoCursorMask.left)
vimeoCursorMask.top.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.right.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.bottom.element.navigationCursor = poster.element.navigationCursor
vimeoCursorMask.left.element.navigationCursor = poster.element.navigationCursor
}
// hack to get user to click vimeo vid on mobile
if(USER_AGENT === MOBILE) {
video.zIndex = 20
video.alpha = 0.01
} else {
video.alpha = 0.01
}
} else if(!video) {
video = new VideoPlayer({alwaysMuted:isSlideshowGallery(self.section), parent:mask, events:imports.localEvents})
if(/disabled/.test(LAYOUT_MODEL.navCursorType) || isSlideshowGallery(self.section)) {
video.addEventListener(CLICK, function(e) {
if(!video.element.paused && video.element.muted && video.unmuteBtn.display === 'block') {
video.unmuteClick()
} else if(!video.element.paused && video.element.muted) {
video.hud.unmute()
} else {
video.togglePlay(e)
}
})
} else if(isPod() || isPad()) {
video.addEventListener(CLICK, function(e) {
video.hud.show()
clearTimeout(hudTimeout)
hudTimeout = setTimeout(function() {
if(!video.paused) video.hud.hide()
}, 3000)
})
video.hud.addEventListener(CLICK, function(e) {
video.hud.show()
clearTimeout(hudTimeout)
hudTimeout = setTimeout(function() {
if(!video.paused) video.hud.hide()
}, 3000)
})
}
video.element.navigationCursor = poster.element.navigationCursor
self.video = video
video.addEventListener(METADATA_LOADED, metadataLoaded, false)
video.addEventListener(ERROR, loadError, false)
mask.addChild(video)
video.display = 'none'
video.alpha = 0
if(STATE.overrides.videoLoop && !isSlideshowGallery(self.section)) video.element.setAttribute("loop", true)
}
video.addEventListener(PAUSED, paused)
video.addEventListener(PLAY, playEvent)
video.addEventListener('playbackEnd', playbackEnd)
}
function paused() {
if(isPod()) {
video.display = 'none'
}
resizeVideo('paused')
}
function playEvent() {
STATE.section(self.section)
if(USER_AGENT === MOBILE && STATE.overrides.mobileAutoPlay) {
video.display = 'block'
video.alpha = 0.01
} else if(isPod()) {
video.display = 'block'
video.alpha = 1
}
resizeVideo('playing')
self.events.dispatchEvent(PLAY)
}
function playbackEnd() {
if(isVimeo(imports.mediaItem)) {
bigPlayIcon.display = 'block'
resizeVideo('ended')
}
self.events.dispatchEvent('playbackEnd')
}
function bigPlayClick() {
if(loader) {
Tween(loader, UPDATE_SPEED, {alpha:1})
}
createVideoPlayer()
// autoplay true
self.play(true)
// if(isPod() || isPad()) {
// video.element.addEventListener('webkitendfullscreen', playbackEnd)
// }
if(!isVimeo(imports.mediaItem) && video && (isPod() || isPad())) {
clearTimeout(hudTimeout)
hudTimeout = setTimeout(function() {
if(!video.paused) video.hud.hide()
}, 3000)
}
}
function metadataLoaded(e) {
videoMetadataLoaded = true
if(!isSlideshowGallery(self.section) && !imports.mediaItem.hideControls) video.hud.enable()
video.removeEventListener(METADATA_LOADED, metadataLoaded, false)
video.removeEventListener(ERROR, loadError, false)
initializePlay(e.target)
video.display = 'block'
originalVideoWidth = e.target.videoWidth
originalVideoHeight = e.target.videoHeight
MEDIA_MODEL[self.id].size.content.width = e.target.videoWidth
MEDIA_MODEL[self.id].size.content.height = e.target.videoHeight
self.dispatchEvent(MEDIA_LOADED, {type:'video', id:imports.mediaItem.id, width:e.target.videoWidth, height:e.target.videoHeight})
self.events.dispatchEvent(MEDIA_LOADED, {type:'video', id:imports.mediaItem.id, width:e.target.videoWidth, height:e.target.videoHeight})
}
function onVimeoMetadataLoaded(e) {
videoMetadataLoaded = true
video.removeEventListener(VIMEO_METADATA_LOADED, onVimeoMetadataLoaded)
originalVideoWidth = this.videoWidth
originalVideoHeight = this.videoHeight
MEDIA_MODEL[self.id].size.content.width = this.videoWidth
MEDIA_MODEL[self.id].size.content.height = this.videoHeight
initializePlay(this)
setTimeout(function(){
updatePosition(e)
// ***** removed this MEDIA_LOADED event *****
// because it was eventually firing another updatePosition
// not sure if it's still needed for something
self.dispatchEvent(MEDIA_LOADED, {type:'vimeo', id:imports.mediaItem.id, width:originalVideoWidth, height:originalVideoHeight})
self.events.dispatchEvent(MEDIA_LOADED, {type:'vimeo', id:imports.mediaItem.id, width:originalVideoWidth, height:originalVideoHeight})
}, 200)
}
function loadError() {
if(loader) {
loader.removeLoader()
mask.removeChild(loader)
}
}
function initializePlay(reference) {
videoLoaded = true
self.videoLoaded = true
self.updateSpeed = 0
if(originalVideoWidth !== reference.videoWidth) originalVideoWidth = reference.videoWidth
if(originalVideoHeight !== reference.videoHeight) originalVideoHeight = reference.videoHeight
updatePosition()
updateStyle()
if(loader) {
loader.removeLoader()
mask.removeChild(loader)
}
Tween(poster, UPDATE_SPEED, {alpha:0, onComplete:function(){
poster.display = 'none'
}})
}
function updateStyle() {
STATE.section(self.section)
if(isSlideshowGallery(self.section) && STATE.overrides.transitionType === 'fade') {
self.backgroundColor = 'transparent'
} else if(USER_AGENT === MOBILE) {
Tween(self, self.updateSpeed, {backgroundColor:LAYOUT_MODEL.containerColorMobile || STATE.mediaView.backgroundColor()})
} else if(USER_AGENT === TABLET) {
Tween(self, self.updateSpeed, {backgroundColor:LAYOUT_MODEL.containerColorTablet || STATE.mediaView.backgroundColor()})
} else {
Tween(self, self.updateSpeed, {backgroundColor:STATE.mediaView.backgroundColor()})
}
if(caption) setTimeout(updateCaptionStyle, self.updateSpeed * 1000)
}
function updateCaptionStyle() {
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type
caption.container.transition = 0
if(firstValid(_captionLocal.captionCloseButton, STATE.overrides.captionCloseButton)) {
caption.showCloseButton()
} else {
caption.hideCloseButton()
}
var alignVars = {
onInit:function() {
if(caption.scroll) {
caption.scroll.hide()
}
},
onComplete:function() {
if(caption.scroll) {
caption.scroll.show()
caption.scroll.resize()
}
}
}
var bgColor = _captionLocal.captionBackgroundRectColor || STATE.overrides.captionBackgroundRectColor
var bgAlpha = firstValid(_captionLocal.captionBackgroundAlpha, STATE.overrides.captionBackgroundAlpha)
caption.backgroundColor = toRgba(bgColor, bgAlpha)
caption.fontFamily = _captionLocal.captionFont || STATE.overrides.captionFont
caption.fontSize = stage.width < LAYOUT_MODEL.screenWidthBreakpoint ?
(_captionLocal.captionFontSizeBreakpoint || STATE.overrides.captionFontSizeBreakpoint || _captionLocal.captionFontSize || STATE.overrides.captionFontSize) :
(_captionLocal.captionFontSize || STATE.overrides.captionFontSize)
caption.fontColor = _captionLocal.captionFontColor || STATE.overrides.captionFontColor
if(firstValid(_captionLocal.captionAutoPosition, STATE.overrides.captionAutoPosition) !== false) {
var padding = 20
var captionText = getCaptionText(imports.mediaItem)
layoutCalcs.captionView.size(captionText, padding)
caption.width = layoutCalcs.captionView.width
caption.height = layoutCalcs.captionView.height
alignVars.width = layoutCalcs.captionView.width
alignVars.height = layoutCalcs.captionView.height
alignVars.hRange = self.width
alignVars.vRange = self.height
alignVars.hAlign = 'center'
alignVars.vAlign = 'bottom'
alignVars.hOffset = 0
alignVars.vOffset = 33
caption.textAlign = 'center'
caption.paddingTop = padding
caption.paddingRight = padding
caption.paddingBottom = padding
caption.paddingLeft = padding
caption.buildScroll({
color:STATE.overrides.captionScrollbarColor,
hover:STATE.overrides.captionScrollbarHover,
align:STATE.overrides.captionTextAlignVertical,
side:STATE.overrides.captionScrollbarAlignment,
alpha:STATE.overrides.captionScrollbarBgAlpha,
width:STATE.overrides.captionScrollbarWidth,
offsetX:STATE.overrides.captionScrollbarHorizontalOffset,
offsetY:STATE.overrides.captionScrollbarVerticalOffset
})
} else {
caption.width = firstValid(_captionLocal.captionWidth, STATE.overrides.captionWidth)
caption.height = firstValid(_captionLocal.captionHeight, STATE.overrides.captionHeight)
alignVars.width = firstValid(_captionLocal.captionWidth, STATE.overrides.captionWidth)
alignVars.height = firstValid(_captionLocal.captionHeight, STATE.overrides.captionHeight)
if((isSlideshowGallery(self.section) && /fill|fitWidth/.test(STATE.overrides.slideshowScaleType)) || (!isSlideshowGallery(self.section) && /fill/.test(STATE.overrides.imageScaleType))) {
alignVars.hOrigin = 0
alignVars.vOrigin = 0
alignVars.hRange = maskWidth // layoutCalcs.mediaView.width()
alignVars.vRange = maskHeight // layoutCalcs.mediaView.height(self.section.key)
} else if(/unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || /^hScroll/.test(STATE.overrides.transitionType) || _captionLocal.captionAnchorTo === 'media item' || STATE.overrides.captionAnchorTo === 'media item') {
var isVimeoDefault = isVimeo(imports.mediaItem) && STATE.overrides.vimeoDefault
alignVars.hOrigin = Math.round((STATE.overrides.videoAutoPlay || isVimeoDefault) ? STATE.mediaView.maskX() + videoX : STATE.mediaView.maskX() + posterX)
alignVars.vOrigin = Math.round((STATE.overrides.videoAutoPlay || isVimeoDefault) ? STATE.mediaView.maskY(self.section.key) + videoY : STATE.mediaView.maskY(self.section.key) + posterY)
alignVars.hRange = (STATE.overrides.videoAutoPlay || isVimeoDefault) ? videoWidth : posterWidth
alignVars.vRange = (STATE.overrides.videoAutoPlay || isVimeoDefault) ? videoHeight : posterHeight
} else if(_captionLocal.captionAnchorTo === 'media area' || STATE.overrides.captionAnchorTo === 'media area') {
alignVars.hOrigin = 0
alignVars.vOrigin = 0
alignVars.hRange = layoutCalcs.mediaView.width()
alignVars.vRange = layoutCalcs.mediaView.height(self.section.key)
}
alignVars.hAlign = _captionLocal.captionAlignHorizontal || STATE.overrides.captionAlignHorizontal
alignVars.vAlign = _captionLocal.captionAlignVertical || STATE.overrides.captionAlignVertical
alignVars.hOffset = firstValid(_captionLocal.captionOffsetX, STATE.overrides.captionOffsetX)
alignVars.vOffset = firstValid(_captionLocal.captionOffsetY, STATE.overrides.captionOffsetY)
caption.textAlign = _captionLocal.captionTextAlign || STATE.overrides.captionTextAlign
caption.paddingTop = firstValid(_captionLocal.captionPaddingTop, STATE.overrides.captionPaddingTop)
caption.paddingRight = firstValid(_captionLocal.captionPaddingRight, STATE.overrides.captionPaddingRight)
caption.paddingBottom = firstValid(_captionLocal.captionPaddingBottom, STATE.overrides.captionPaddingBottom)
caption.paddingLeft = firstValid(_captionLocal.captionPaddingLeft, STATE.overrides.captionPaddingLeft)
caption.buildScroll({
color:_captionLocal.captionScrollbarColor || STATE.overrides.captionScrollbarColor,
hover:_captionLocal.captionScrollbarHover || STATE.overrides.captionScrollbarHover,
align:_captionLocal.captionTextAlignVertical || STATE.overrides.captionTextAlignVertical,
side:_captionLocal.captionScrollbarAlignment || STATE.overrides.captionScrollbarAlignment,
alpha:firstValid(_captionLocal.captionScrollbarBgAlpha, STATE.overrides.captionScrollbarBgAlpha),
width:firstValid(_captionLocal.captionScrollbarWidth, STATE.overrides.captionScrollbarWidth),
offsetX:firstValid(_captionLocal.captionScrollbarHorizontalOffset, STATE.overrides.captionScrollbarHorizontalOffset),
offsetY:firstValid(_captionLocal.captionScrollbarVerticalOffset, STATE.overrides.captionScrollbarVerticalOffset)
})
}
Align(caption.container, self.updateSpeed, alignVars)
}
function checkCaptionOnScrollStop(e) {
if(USER_AGENT !== MOBILE || STATE.overrides.captionMobileOverrides) {
updateCaptionStyle()
showCaption(e)
} else {
caption.text = ''
caption.hide()
if(caption.scroll) caption.scroll.destroy()
}
}
function updateCaptionText(e) {
STATE.section(self.section)
if(/media/.test(_captionLocal.captionAnchorTo) || /media/.test(STATE.overrides.captionAnchorTo)) {
caption.text = plainTextToHtml(e)
} else {
caption.hide()
if(caption.scroll) caption.scroll.destroy()
}
}
function anchorIsMedia(anchor) {
return /media/.test(anchor)
}
function showCaption(newState) {
if(USER_AGENT !== MOBILE || STATE.overrides.captionMobileOverrides) {
var isSlideshowCaption = isSlideshowGallery(self.section) && LAYOUT_MODEL.slideshowCaptions
var captionDefault = firstValid(imports.mediaItem.overrides.captionDefault, STATE.overrides.captionDefault)
if((posterLoaded || !showPosterImage(imports.mediaItem) || (autoplay && videoMetadataLoaded) || isSlideshowCaption) && newState && caption && (captionDefault || newState.mode.indexOf('caption') > -1)) {
state = newState
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type
var captionText = getCaptionText(imports.mediaItem)
caption.text = plainTextToHtml(captionText)
var anchorToMedia = anchorIsMedia(firstValid(imports.mediaItem.overrides.captionAnchorTo, STATE.overrides.captionAnchorTo))
if((!showPosterImage(imports.mediaItem) || posterLoaded) && anchorToMedia && (isSlideshowCaption || (state && state.mode && (captionDefault || state.mode.indexOf('caption') > -1)))) {
caption.show(updateCaptionStyle)
}
}
}
}
function hideCaption() {
caption.hide()
if(caption.scroll) caption.scroll.destroy()
}
self.hide = function() {
if(self.alpha === 1) {
Tween(self, UPDATE_SPEED, {alpha:0, onComplete:function(){
self.display = 'none'
}})
}
}
self.show = function() {
if(self.alpha === 0) {
self.display = 'block'
Tween(self, UPDATE_SPEED, {alpha:1})
}
}
function updatePosition() {
STATE.section(self.section)
if(poster && LAYOUT_MODEL.imageRendering.optimizeQuality) poster.style['image-rendering'] = 'optimizeQuality'
if(poster && LAYOUT_MODEL.imageRendering.webkitOptimizeContrast) poster.style['image-rendering'] = '-webkit-optimize-contrast'
if(poster && BROWSER_NAME === 'Safari' && LAYOUT_MODEL.imageRendering.webkitBackfaceVisibility) poster.style['-webkit-backface-visibility'] = 'hidden'
layoutCalcs.activeMediaType = self.type
maskWidth = STATE.mediaView.maskWidth(self.width)
maskHeight = STATE.mediaView.maskHeight(self.height, self.section.key)
alignBigPlay()
showCaption(state)
Tween(mask, self.updateSpeed, {x:STATE.mediaView.maskX(), y:STATE.mediaView.maskY(self.section.key), width:maskWidth, height:maskHeight, onComplete:function(){
alignBigPlay()
}})
if(loader) {
positionLoader()
}
if(isVimeo(imports.mediaItem) && isPod()) {
/*dont do nuthin*/
} else if(!posterLoaded) {
if(loader) {
Tween(loader, UPDATE_SPEED, {alpha:1})
}
}
if(posterLoaded && !videoLoaded) {
resizePoster()
}
if(videoLoaded) {
resizeVideo()
}
}
self.updatePosition = updatePosition
function imageLoaded() {
self.updateSpeed = 0
posterLoaded = true
updatePosition()
resizePoster()
if(loader) {
Tween(loader, UPDATE_SPEED, {alpha:0})
}
self.events.dispatchEvent(MEDIA_LOADED, {type:'posterImage', id:imports.mediaItem.id, width:originalPosterWidth, height:originalPosterHeight})
self.updateSpeed = UPDATE_SPEED
bigPlayIcon.addEventListener(LOAD, bigPlayIconLoaded)
bigPlayIcon.src = ICONS + 'play@2x.png'
showCaption(state)
if(BROWSER_NAME === 'Safari' && /hScroll/.test(STATE.overrides.transitionType)) {
// poster.element.setAttribute('data-pin-no-hover', true)
poster.element.setAttribute('nopin', 'nopin')
}
}
function resizePoster() {
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type
maskWidth = STATE.mediaView.maskWidth(self.width)
maskHeight = STATE.mediaView.maskHeight(self.height, self.section.key)
var resize = Resize({}, 0, {
type:STATE.mediaView.imageScaleType(),
width:originalPosterWidth,
height:originalPosterHeight,
hRange:maskWidth,
vRange:maskHeight,
hAlign:STATE.mediaView.hAlign(),
vAlign:STATE.mediaView.vAlign(),
disableOrientationCheck:getOrientationCheck(self.type)
})
posterWidth = Math.ceil(resize.scale.width)
posterHeight = Math.ceil(resize.scale.height)
posterX = Math.floor(resize.align.x)
posterY = Math.floor(resize.align.y)
Tween(poster, self.updateSpeed, {
x: posterX,
y: posterY,
width: posterWidth,
height: posterHeight,
onComplete:function(){
setTimeout(function(){
STATE.section(self.section)
if(isSlideshowGallery(self.section)) {
/*dont show image*/
} else {
Tween(poster, STATE.mediaView.transitionDuration(), {alpha:1, ease:'cubic-bezier(0.7, 0, 0.3, 1)'})
}
}, 1000)
}
})
if(caption) updateCaptionStyle()
// if(caption) showCaption(state)
}
function resizeVideo(state) {
STATE.section(self.section)
layoutCalcs.activeMediaType = self.type
if(state) self.playState = state
video.display = 'block'
setTimeout(function() {
video.display = 'block'
}, 1000)
maskWidth = STATE.mediaView.maskWidth(self.width)
maskHeight = STATE.mediaView.maskHeight(self.height, self.section.key)
var resize = Resize({}, 0, {
type:STATE.mediaView.videoScaleType(isVimeo(imports.mediaItem)),
width:originalVideoWidth,
height:originalVideoHeight,
hRange:maskWidth,
vRange:maskHeight,
hAlign:STATE.mediaView.hAlign(),
vAlign:STATE.mediaView.vAlign(),
disableOrientationCheck:getOrientationCheck(self.type)
})
videoX = Math.floor(resize.align.x)
videoY = Math.floor(resize.align.y)
videoWidth = Math.ceil(resize.scale.width)
videoHeight = Math.ceil(resize.scale.height)
if(videoWidth && videoHeight) {
Tween(video, 0, {
x: videoX,
y: videoY,
width: videoWidth,
height: videoHeight,
onComplete:function(){
// setTimeout(function(){
Tween(video, 0, {alpha:1, ease:'cubic-bezier(0.7, 0, 0.3, 1)'})
// }, 1000)
}
})
video.setSize(videoWidth, videoHeight, self.updateSpeed)
resizeVimeoMask(resize)
if(video.hud) {
var hudX = Math.floor(resize.align.x)
var hudY = Math.floor(resize.align.y)
var hudWidth = videoWidth
var hudHeight = videoHeight
if(videoWidth > STATE.mediaView.maskWidth() && STATE.overrides.transitionType !== 'hScroll') {
hudX = 0
hudWidth = STATE.mediaView.maskWidth()
hudHeight = STATE.mediaView.maskHeight(undefined, self.section.key)
} else if(videoHeight > STATE.mediaView.maskHeight(undefined, self.section.key)) {
hudY = 0
hudWidth = STATE.mediaView.maskWidth()
hudHeight = STATE.mediaView.maskHeight(undefined, self.section.key)
}
video.hud.resize(self.updateSpeed, hudX, hudY, hudWidth, hudHeight)
var unmuteBtnX = resize.align.x > 0 ? resize.align.x : 0
var unmuteBtnY = resize.align.y > 0 ? resize.align.y : 0
video.unmuteBtn.x = Math.round(unmuteBtnX) + 20
video.unmuteBtn.y = Math.round(unmuteBtnY) + 20
}
if(caption) updateCaptionStyle()
}
}
function vimeoPlayMask() {
return {
banner: {width:0, height:0},
hdpopup: {width:170, height:180},
shareCtrls: {width:50, height:180},
videoCtrls: {width:videoWidth, height:50}
}
}
function vimeoPauseMask() {
return {
banner: {width:550, height:180},
hdpopup: {width:170, height:180},
shareCtrls: {width:50, height:180},
videoCtrls: {width:videoWidth, height:50}
}
}
function vimeoEndMask() {
return {
banner: {width:550, height:180},
hdpopup: {width:170, height:180},
shareCtrls: {width:50, height:180},
videoCtrls: {width:videoWidth, height:50}
}
}
function getVimeoMask() {
if(self.playState === 'ended') {
return vimeoEndMask()
}
if(self.playState === 'paused') {
return vimeoPauseMask()
}
return vimeoPlayMask()
}
function resizeVimeoMask(resize) {
if(vimeoCursorMask) {
var vimeoHud = getVimeoMask()
if(isPad()) {
// due to mobile behavior the play api call does not work
// so the mask size for this play state was wrong
vimeoHud.banner.width = 540
vimeoHud.banner.height = 170
}
var cMaskW = (videoWidth - vimeoHud.banner.width) * 0.5
var cMaskH = (videoHeight - vimeoHud.banner.height) * 0.5
vimeoCursorMask.top.x = resize.align.x
vimeoCursorMask.top.y = resize.align.y
vimeoCursorMask.top.width = videoWidth - vimeoHud.shareCtrls.width
vimeoCursorMask.top.height = cMaskH
vimeoCursorMask.right.x = resize.align.x + videoWidth - cMaskW
vimeoCursorMask.right.y = resize.align.y + vimeoHud.shareCtrls.height
vimeoCursorMask.right.width = cMaskW
vimeoCursorMask.right.height = videoHeight - vimeoHud.shareCtrls.height - vimeoHud.hdpopup.height
vimeoCursorMask.bottom.x = resize.align.x
vimeoCursorMask.bottom.y = resize.align.y + videoHeight - cMaskH
vimeoCursorMask.bottom.width = videoWidth - vimeoHud.hdpopup.width
vimeoCursorMask.bottom.height = cMaskH - vimeoHud.videoCtrls.height
vimeoCursorMask.left.x = resize.align.x
vimeoCursorMask.left.y = resize.align.y
vimeoCursorMask.left.width = cMaskW
vimeoCursorMask.left.height = videoHeight - vimeoHud.videoCtrls.height
}
}
function updateMedia(e) {
if(e.id === imports.mediaItem.id) {
if(imports.mediaItem.thumb !== e.thumb) {
console.log('posterImage changed!')
}
if(imports.mediaItem.content !== e.content) {
console.log('src changed!')
}
}
}
function positionLoader() {
STATE.section(self.section)
if(loader) {
loader.transition = 0
loader.x = ((STATE.mediaView.maskWidth(self.width) - loader.width) * 0.5)
loader.y = ((STATE.mediaView.maskHeight(self.height, self.section.key) - loader.height) * 0.5)
}
}
function destroy() {
self.events.removeEventListener(PAUSE_MEDIA, pauseMedia)
self.events.removeEventListener(DESTROY_MEDIA, destroyMedia)
self.events.removeEventListener(TRANSITION_END, createVideoPlayer)
self.events.removeEventListener(ADMIN_MOUSE_DOWN, vimeoPointerEventsOff)
self.events.removeEventListener(ADMIN_MOUSE_UP, vimeoPointerEventsOn)
_localEvents.removeEventListener(RESIZE, updatePosition)
_localEvents.removeEventListener(LAYOUT_MODEL_CHANGE, updatePosition)
_localEvents.removeEventListener('mediaSizeUpdate', updatePosition)
_localEvents.removeEventListener(MEDIA_MODEL_CHANGE, updateMedia)
_localEvents.removeEventListener('mediaAutoPlay', mediaAutoPlay)
_localEvents.removeEventListener('spacebarTogglePlay', spacebarTogglePlay)
_localEvents.removeEventListener('destroy', destroy)
_localEvents.removeEventListener('showCursor', showCursor)
_localEvents.removeEventListener('hideCursor', hideCursor)
poster.removeEventListener(LOAD, imageLoaded)
if(video) {
video.element.removeEventListener('webkitendfullscreen', playbackEnd)
if(isVimeo(imports.mediaItem)) {
video.removeEventListener(VIMEO_METADATA_LOADED, onVimeoMetadataLoaded)
} else {
video.element.removeEventListener(METADATA_LOADED, metadataLoaded, false)
}
video.destroy()
}
self.removeEventListener(CHILD_ADDED, childAdded)
}
return self
}
function OverlayController(vars) {
var self = new ControllerProxy({parentView:vars.mediaView.mask, parentController:vars.parentController, events:vars.siteEvents});
var mode
var sectionChange = false
var section
var assetId
var path
var settings
var mediaItems
var event
var mouseOverThumbsOnce = false
var isModeChange = false
var _localEvents = vars.localEvents
var thumbsOpen
var layoutChange = false
var sectionKey
var scrollbarParent
self.overlayView = new OverlayView(vars);
self.overlayView.zIndex = STATE.overlayView.zIndex;
self.lazyLoaderUpdate = function() {
// this is needed for calling from a scroll event in the section controller
if(self.thumbs && self.thumbs.lazyLoader) self.thumbs.lazyLoader.update()
}
if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior) || isInMediaOverlay()) {
scrollbarParent = vars.mediaView
vars.mediaView.addChild(self.overlayView)
} else {
scrollbarParent = vars.siteView
vars.siteView.addChild(self.overlayView);
}
_localEvents.addEventListener('UPDATE_CONTENT_HEIGHT', function(info) {
if(section) {
sectionKey = section.key
STATE.section(section)
}
if(STATE.overrides.thumbnailType === 'strip') {
self.overlayView.contentHeight = STATE.mediaView.zoneHeight(sectionKey)
self.overlayView.updatePosition()
} else if(info.thumbs) {
self.overlayView.contentHeight = info.thumbs
self.overlayView.updatePosition()
}
})
vars.siteEvents.addEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
// if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
// overlayControllerSiteUriChange called directly from MediaController
self.uriChange = overlayControllerSiteUriChange
// vars.siteEvents.addEventListener(SECTIONS_MODEL_CHANGE, unifiedSectionUpdate);
// } else {
// vars.siteEvents.addEventListener(SITE_URI_CHANGE, overlayControllerSiteUriChange);
vars.siteEvents.addEventListener(SECTIONS_MODEL_CHANGE, sectionUpdate);
// }
vars.siteEvents.addEventListener(SETTINGS_MODEL_CHANGE, settingsUpdate);
function updateOverlayViewPosition() {
if(self.thumbs && self.thumbs.getTotalHeight()) self.overlayView.contentHeight = self.thumbs.getTotalHeight()
self.overlayView.updatePosition()
}
function showThumbnails() {
self.overlayView.show()
if(self.thumbs) self.thumbs.show()
// if(/strip/gi.test(STATE.overrides.thumbnailType)) {
// self.thumbs.show()
// } else {
// self.overlayView.show()
// self.thumbs.show()
// }
}
function hideThumbnails() {
self.overlayView.hide()
self.thumbs.hide()
// if(/strip/gi.test(STATE.overrides.thumbnailType)) {
// self.thumbs.hide()
// } else {
// self.overlayView.hide()
// self.thumbs.hide()
// }
}
vars.siteEvents.addEventListener('UPDATE_CONTENT_HEIGHT', updateOverlayViewPosition);
vars.siteEvents.addEventListener('holdersBuilt', function() {
highlightThumb()
setScrollPosition()
})
self.destroy = function() {
if(self.thumbs) {
if(self.thumbs.scroll) self.thumbs.scroll.destroy()
if(self.thumbs.staticNav) self.thumbs.removeStaticNav()
}
if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
vars.mediaView.mask.removeChild(self.overlayView)
} else {
vars.siteView.removeChild(self.overlayView);
}
vars.siteEvents.removeEventListener(LAYOUT_MODEL_CHANGE, layoutModelChange);
// if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
// overlayControllerSiteUriChange called directly from MediaController
self.uriChange = overlayControllerSiteUriChange
// vars.siteEvents.removeEventListener(SECTIONS_MODEL_CHANGE, unifiedSectionUpdate);
// } else {
// vars.siteEvents.removeEventListener(SITE_URI_CHANGE, overlayControllerSiteUriChange);
vars.siteEvents.removeEventListener(SECTIONS_MODEL_CHANGE, sectionUpdate);
// }
vars.siteEvents.removeEventListener(SETTINGS_MODEL_CHANGE, settingsUpdate);
vars.siteEvents.removeEventListener('UPDATE_CONTENT_HEIGHT', updateOverlayViewPosition);
vars.siteEvents.removeEventListener('holdersBuilt', function() {
thumbHoldersBuilt()
setScrollPosition()
})
}
function unifiedSectionUpdate(e) {
if(e && e.field === 'thumb') {
sectionChange = true
self.overlayView.updatePosition(e);
checkThumbs({mode:mode, section:section});
if(self.thumbs) self.thumbs.resize();
}
}
function sectionUpdate(e) {
if(section) {
var updateSection = getSectionById(e.id)
var isSubSectionOfParent = updateSection && updateSection.key.indexOf(section.key) > -1
if(e && e.field === 'thumb' || e.section === section || isSubSectionOfParent) {
sectionChange = true
section = e.section ? e.section : section;
self.overlayView.section = section
self.overlayView.updatePosition(e);
checkThumbs({mode:mode, section:section});
if(self.thumbs) self.thumbs.resize();
}
section = e.section ? e.section : section;
self.overlayView.section = section
} else if(self.thumbs) {
//self.thumbs.hide()
hideThumbnails()
if(self.thumbs.scroll) self.thumbs.scroll.destroy()
self.overlayView.removeChild(self.thumbs);
delete self.thumbs;
}
}
function settingsUpdate(e) {
if(self.inquiry) {
self.inquiry.updateInquiryInfo();
}
}
function layoutModelChange(e) {
if(e && self.share) {
self.share.updateStyle(e);
self.share.updatePosition(e);
}
if(e && self.inquiry) {
self.inquiry.updateStyle(e);
self.inquiry.updatePosition(e);
}
if(e && /overlay/.test(e.id) && (STATE.overrides.thumbnailDock === 'overlay' || /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType))) {
sectionChange = true;
self.overlayView.updatePosition(e);
if(e.action === 'changeTemplate') {
// checkThumbs triggerd by SectionController build
} else {
layoutChange = true
checkThumbs({mode:mode, section:section});
}
}
if(e && /attachmentThumbnail|paginated|static|thumbnail|menuWidth|menuAlignHorizontal|menuOffsetX|sitePaddingTop|sitePaddingRight|sitePaddingBottom|sitePaddingLeft/i.test(e.id)) {
sectionChange = true;
self.overlayView.updatePosition(e);
if(e.action === 'changeTemplate') {
// checkThumbs triggerd by SectionController build
} else {
layoutChange = true
checkThumbs({mode:mode, section:section});
}
if(self.thumbs) self.thumbs.resize();
}
}
self.resize = function(e) {
self.overlayView.updatePosition(e);
if(self.share) self.share.updatePosition(e);
if(self.inquiry) self.inquiry.updatePosition(e);
if(self.thumbs) self.thumbs.resize();
}
function overlayControllerSiteUriChange(e) {
if(e.info.isMediaViewStateChange || e.info.isModeChange) self.overlayView.updatePosition(e);
if(e.assetId) assetId = e.assetId;
if(e.section) STATE.section(e.section)
if(STATE.siteView.unifiedPageScroll() && /strip/.test(STATE.overrides.thumbnailType)) {
self.overlayView.position = 'fixed'
} else {
self.overlayView.position = 'absolute'
}
if(/inquiry|share|foto/.test(e.mode)) {
self.overlayView.contentHeight = STATE.mediaView.zoneHeight(e.section.key)
self.overlayView.show()
checkShare(e)
checkInquiry(e)
checkFotomoto(e)
} else {
// in case these overlays need to hide
checkShare(e)
checkInquiry(e)
checkFotomoto(e)
}
checkThumbs(e)
}
function checkFotomoto(e) {
if(e.section && e.mode.indexOf('fotomoto') > -1) {
var media = csvToArray(e.section.media);
var mediaItem = getMediaById(media[e.assetId]);
if(window.FOTOMOTO && mediaItem && mediaItem.type === IMAGE) {
window.FOTOMOTO.API.showWindow(10, SETTINGS_MODEL.cdnSslUri + '/' + mediaItem.content);
}
setTimeout(function() {
vars.siteEvents.dispatchEvent('clearFotomotoMode', 'fotomoto');
}, 100);
return true
}
return false
}
function setScrollPosition(e) {
if(self.thumbs) STATE.section(self.thumbs.section)
if(STATE.overrides.siteDisplayBehavior !== 'unifiedSiteScrollVertical') {
if(self.thumbs && !self.thumbs.scroll && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)) {
if(info && info.isSectionChange && !info.isModeChange && hasMode('thumbs', mode)) {
if(STATE.siteView.unifiedPageScroll()) {
window.scrollTo(0, 0)
}
} else if(info && !info.isSectionChange && info.isModeChange && hasMode('thumbs', mode)) {
if(STATE.siteView.unifiedPageScroll()) {
window.scrollTo(0, self.thumbs.savedScrollY || 0)
} else {
self.thumbs.mask.scrollY = self.thumbs.savedScrollY || 0
}
}
}
}
if(self.thumbs && /strip/.test(STATE.overrides.thumbnailType) && hasMode('thumbs', mode)) {
if(self.thumbs.scroll && !self.thumbs.mouseHover) {
self.thumbs.scroll.percent = assetId / (mediaItems.length - 1);
self.thumbs.scroll.update(UPDATE_SPEED);
if(self.thumbs.lazyLoader) self.thumbs.lazyLoader.update()
} else if(STATE.overrides.thumbnailType === 'strip') {
var percent = assetId / (mediaItems.length - 1)
if(/top|bottom/.test(STATE.overrides.thumbnailSide)) {
var scrollRange = self.thumbs.mask.grid.width - self.thumbs.mask.width
Anim.to(self.thumbs.mask, UPDATE_SPEED, {scrollLeft:Math.round(scrollRange * percent), scrollTop:0, ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
// onComplete
if(self.thumbs && self.thumbs.lazyLoader) self.thumbs.lazyLoader.update()
}});
} else {
var scrollRange = self.thumbs.mask.grid.height - self.thumbs.mask.height
Anim.to(self.thumbs.mask, UPDATE_SPEED, {scrollLeft:0, scrollTop:Math.round(scrollRange * percent), ease:TOUCH_DEVICE ? 'outQuart' : 'inOutCubic', onComplete:function(){
// onComplete
if(self.thumbs && self.thumbs.lazyLoader) self.thumbs.lazyLoader.update()
}});
}
}
}
}
function checkThumbs(e) {
/*
this function needs to be extremely simple
and merely obey the uri
if thumbs is in the uri then you build and turn them on
else you turn them off
*/
// if(mode !== e.mode && section === e.section) {
// isModeChange = true;
// }
mode = e.mode || '';
section = e.section || section;
self.overlayView.section = section
isModeChange = e.info ? e.info.isModeChange : mode !== e.mode && section === e.section
info = e.info ? e.info : {}
if(e.assetId > -1) assetId = e.assetId;
path = e.path || path;
if(e.section) mediaItems = e.section.mediaItems || mediaItems;
if(/fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType) && /thumbs/.test(mode)) {
vars.siteEvents.dispatchEvent(PAUSE_MEDIA);
setTimeout(function(){
if(vars.mediaView.scroll) {
vars.mediaView.scroll.hide();
}
}, 20)
} else if(/fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)) {
setTimeout(function(){
if(vars.mediaView.scroll) {
vars.mediaView.scroll.show();
//vars.mediaView.scroll.update();
}
}, 0)
}
if(self.thumbs && self.thumbs.section !== section) {
savedThumbsPosition = undefined
}
if(self.thumbs && (self.thumbs.section !== section || sectionChange || layoutChange)) {
// we only remove if its a section change
// should also be for layout changes??
//
//self.thumbs.hide()
//hideThumbnails()
if(self.thumbs.scroll) self.thumbs.scroll.destroy()
if(self.thumbs.lazyLoader) delete self.thumbs.lazyLoader
self.overlayView.removeChild(self.thumbs);
delete self.thumbs;
}
mediaItems = e.section.media
.filter(function(id) {
return id !== null // strange situation where null was in media array
})
.filter(function(id) {
return !isSpacer(getSectionById(id))
})
.map(function(mediaId) {
var mediaItem = mediaId < 10000 ?
fakeMediaItemFromSub(getSectionById(mediaId)) :
JSON.parse(JSON.stringify(getMediaById(mediaId)))
return mediaItem
})
.filter(function(mediaItem) {
return !!mediaItem && !mediaItem.slideshow
})
// wrong media item comes up when clicking on thumb. #1398
mediaItems.filter(function(mediaItem) {
return mediaItem.type !== 'link'
})
.forEach(function(mediaItem, id) {
mediaItem.assetId = id
})
if(e.section && e.section.thumb) {
settings = e.section.thumb;
if(!self.thumbs && mode.indexOf('thumbs') > -1 && mediaItems.length) {
if(STATE.overrides.thumbnailType === 'hPaginatedGrid') {
self.thumbs = new PaginatedThumbs({
assetId:assetId,
path:path,
mediaItems:mediaItems,
settings:settings,
events:vars.siteEvents,
localEvents:vars.localEvents,
parent:vars.siteView,
scrollbarParent: scrollbarParent,
section:section,
thumbnailOnly: STATE.overrides.thumbnailOnly,
isIndexSection: /*e.info ? e.info.isIndexSection :*/ isIndexSection(section)
})
self.overlayView.contentHeight = STATE.mediaView.zoneHeight(e.section.key)
} else {
self.thumbs = new ThumbsModule({
assetId:assetId,
path:path,
mediaItems:mediaItems,
settings:settings,
events:vars.siteEvents,
localEvents:vars.localEvents,
parent:vars.siteView,
scrollbarParent: scrollbarParent,
section:section,
thumbnailOnly: STATE.overrides.thumbnailOnly,
isIndexSection: /*e.info ? e.info.isIndexSection : */ isIndexSection(section)
});
self.overlayView.contentHeight = STATE.overrides.thumbnailType === 'strip' && STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' ?
STATE.mediaView.zoneHeight(e.section.key) :
self.thumbs.getTotalHeight()
}
self.thumbs.section = section;
self.thumbs.settings = settings;
self.overlayView.addChild(self.thumbs);
}
if(self.thumbs) {
if(isInMediaOverlay()) {
// media overlay - need to filter this out before unified check
parallax.init(self.thumbs.mask.element)
} else if(STATE.siteView.unifiedPageScroll() || /^unified/.test(STATE.overrides.siteDisplayBehavior)) {
// max scroll or unifited page scroll
parallax.init(window)
} else {
// legacy
parallax.init(self.thumbs.mask.element)
}
}
if(self.thumbs && mode.indexOf('thumbs') > -1 && (!self.thumbs.toggleState() || sectionChange)) {
setTimeout(function() {
stripDisplaceChange();
setScrollPosition(e)
// self.thumbs.show();
showThumbnails()
// this is set to UPDATE_SPEED intentionally
// window scroll cannot work until siteview height has been set
// was also set to 0 due to some image flash issue that mattsarr reported but did not have a git issue for
}, UPDATE_SPEED * 1300)
} else if(self.thumbs && self.thumbs.toggleState() && mode.indexOf('thumbs') === -1) {
if(isModeChange) {
stripDisplaceChange();
if(STATE.siteView.unifiedPageScroll() ||
(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior) && layoutCalcs.sectionDisplayMode === 'multiple') ||
STATE.overrides.thumbnailType === 'strip') {
// self.thumbs.hide();
hideThumbnails()
} else {
// Image Flickering when making new image selection from thumbs #1052
// does not work for unifiedPageScroll due to scrolling entire site before overlay close
// arbitrary delay for hiding the thumbnails after media jumpToAsset
var hideDelay = UPDATE_SPEED * 500
setTimeout(function() {
// self.thumbs.hide();
hideThumbnails()
// wait till jumpToAsset happens in MediaNavigation
// dont need to honor transitionDuration since this is from thumbs to gallery
// instead of image to image
}, 0) //hideDelay)
//
// removed hideDelay due to - Top thumb row flashing on selection #1518
// since MediaNavigation now uses transition / alpha = 0
//
// }, STATE.mediaView.transitionDuration() * 1000)
}
} else {
vars.siteEvents.addEventListener(TRANSITION_START, mediaTransitionStart);
}
}
}
setTimeout(function() {
highlightThumb(e)
if(mode.indexOf('thumbs') > -1) setScrollPosition(e)
}, 20)
isModeChange = false
sectionChange = false
layoutChange = false
}
function stripDisplaceChange() {
if(STATE.overrides.thumbnailType === 'strip' && STATE.overrides.thumbnailDock === 'displace') {
vars.siteEvents.dispatchEvent('thumbStripDisplaceChange');
}
}
function mediaTransitionStart() {
vars.siteEvents.removeEventListener(TRANSITION_START, mediaTransitionStart);
if(LAYOUT_MODEL.overlayAlpha === 1) {
vars.siteEvents.dispatchEvent('OPAQUE_OVERLAY_CLOSE');
}
// self.thumbs.hide();
hideThumbnails()
}
function highlightThumb() {
if(self.thumbs) {
if(assetId > -1) {
self.thumbs.highlight(assetId);
} else {
self.thumbs.highlight(-1);
}
}
}
function checkShare(e) {
if(e.mode.indexOf('share') > -1) {
if(!self.share) {
self.share = new ShareView(Object.assign({}, vars, {section: e.section}))
self.share.pointerEvents = 'auto'
self.overlayView.addChild(self.share)
}
self.share.updateContent(e)
self.share.show()
return true
} else if(self.share) {
self.share.hide()
}
return false
}
function checkInquiry(e) {
if(e.mode.indexOf('inquiry') > -1) {
if(!self.inquiry) {
self.inquiry = new InquiryView(Object.assign({}, vars, {section: e.section}))
self.inquiry.pointerEvents = 'auto'
self.overlayView.addChild(self.inquiry)
}
self.inquiry.updateContent(e)
self.inquiry.show()
return true
} else if(self.inquiry) {
self.inquiry.hide()
}
return false
}
function getFirstThumb(sub) {
if(sub.customThumb) {
return {name:sub.customThumb, size:sub.customThumbSize}
} else if(sub.media) {
for(var i = 0; i < sub.media.length; i++) {
if(sub.media[i] > 9999) {
var firstItem = getMediaById(sub.media[i])
if(firstItem.thumb) {
return {name:firstItem.thumb, size:firstItem.size.thumb, demoFile:firstItem.demoFile}
} else if(firstItem.type === 'image') {
return {name:firstItem.content, size:firstItem.size.content, demoFile:firstItem.demoFile}
}
}
}
}
return {name:'', size:{width:0, height:0}}
}
function fakeMediaItemFromSub(sub) {
var item
if(sub) {
var mediaItem = getMediaById(sub.media[0])
var customThumb = getFirstThumb(sub)
if(isOnlyLinkItem(mediaItem, sub)) {
// for legacy custom first link in new index galleries
// bubbles first link media items up to thumbnails
item = JSON.parse(JSON.stringify(mediaItem))
item.size.thumb = customThumb.size
item.thumb = customThumb.name
item.demoFile = customThumb.demoFile
//if parent gallery has subTitle attach it to custom link
item.subTitle = sub.subTitle
} else {
item = {
size:{
content:{
width:0,
height:0
},
thumb:{
width:customThumb.size.width,
height:customThumb.size.height
},
featuredImage:{
width:0,
height:0
},
bytes:0
},
slideshow: sub.slideshow,
label:sub.label,
subTitle:sub.subTitle,
alias:sub.alias,
title:'',
type:'link',
content:sub.indexLink || sub.key.replace(/ /g, '-'),
thumb:customThumb.name,
linkTarget:sub.linkTarget || '_self',
caption:'',
overrides:{
thumbScaleFactor: sub.overrides.thumbScaleFactor
},
featuredImage:'',
filters:[],
dateAdded: new Date().toISOString(),
demoFile:customThumb.demoFile
}
}
}
return sub && sub.visible ? item : false
}
return self;
}
/* global Tween, ViewProxy, STATE, BROWSER_NAME, CHILD_ADDED, UPDATE_SPEED, LAYOUT_MODEL */
function OverlayView(vars) { //eslint-disable-line
var self = new ViewProxy({events:vars.events})
self.zIndex = STATE.overlayView.zIndex
// not sure why this was set to overflow:hidden
// removing for the new paginated thumb nav arrows
self.overflow = /hPaginatedGrid/.test(STATE.overrides.thumbnailType) ? 'initial' : 'hidden'
self.pointerEvents = /hMasonryHScroll/.test(STATE.overrides.thumbnailType) ? 'auto' : 'none'
self.display = 'none'
self.updateSpeed = 0
if(BROWSER_NAME === 'Safari') {
// to prevent transition flicker in Safari #1052
self.style['-webkit-backface-visibility'] = 'hidden'
self.style.transform = 'translateZ(0)'
}
self.element.setAttribute('class', 'OverlayView')
self.addEventListener(CHILD_ADDED, function() {
self.updatePosition()
})
self.show = function() {
self.display = 'block'
Tween(self, UPDATE_SPEED, {alpha:1})
}
self.hide = function() {
Tween(self, UPDATE_SPEED, {alpha:0, onComplete:function() {
self.display = 'none'
}})
}
var UPDATE_CONTENT_HEIGHT_DELAY = 20
self.updatePosition = function() {
setTimeout(function() {
if(self.section) {
self.sectionKey = self.section.key
STATE.section(self.section)
}
if(STATE.overrides.siteDisplayGalleryOnlyOverlay && layoutCalcs.mediaOverlayState === 'open') {
// capture this condition
// dont resize thumbnails when "Gallery Only" Overlay is open
} else {
self.overflow = /hPaginatedGrid/.test(STATE.overrides.thumbnailType) ? 'initial' : 'hidden'
var overlayHeight =
/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior) ||
((STATE.siteView.unifiedPageScroll() || /unified/.test(LAYOUT_MODEL.siteDisplayBehavior)) && /overlay/.test(self.section.displayBehavior) && STATE.overrides.siteDisplayGalleryOnlyOverlay /* && !isIndexSection(getParentSection(self.section))*/)
? self.contentHeight || 0
: STATE.overlayView.zoneHeight()
if(STATE.overrides.siteDisplayBehavior === 'unifiedSiteScrollVertical' && /strip/.test(STATE.overrides.thumbnailType)) {
overlayHeight = STATE.mediaView.zoneHeight(self.sectionKey)
}
Tween.defer(self, 0, {
x:STATE.overlayView.x(),
y:STATE.overlayView.y(self.sectionKey),
width:STATE.overlayView.zoneWidth(),
height:overlayHeight
})
self.updateSpeed = UPDATE_SPEED
}
}, UPDATE_CONTENT_HEIGHT_DELAY)
}
return self
}
// public methods
// .resize
// .show
// .hide
// .lazyLoader
// .toggleState
// .highlight
// pub prop
// .mask <- just the sprite
// .section
function PaginatedThumbs(vars) {
// curPage <- index of the array
// mask <- sprite (public)
// calculate how many thumbs fit per "page"
// divide thumbs into an array of arrays where
// each nested array represents the content of
// a single thumbs page
//
// create a page for the thumbsmodule to sit in
//
// get static nav instantiation from site controller
// create a prev/next navigation to transition the pages
var self = new Sprite()
var mask = new Sprite()
var container
var thumbsModules
var totalThumbs
var curPage = 0
var pagesItems
var toggleState
var containerX
self.pointerEvents = 'auto'
STATE.section(vars.section)
function getNumberOfColumns(zoneWidth, maxCols, gap) {
var thumbWidth = THUMB_SIZES[STATE.overrides.thumbnailSize].width + gap
var cols = Math.floor((zoneWidth + gap) / thumbWidth)
if(cols < maxCols) maxCols = cols < 1 ? 1 : cols
return maxCols ? maxCols : cols
}
function getNumberOfRows(zoneHeight, gap) {
var thumbHeight = THUMB_SIZES[STATE.overrides.thumbnailSize].height + gap
return Math.floor((zoneHeight + gap) / thumbHeight)
}
function getZoneWidth() {
var horizontalMargin = percentToPixels(STATE.overrides.thumbnailHorizontalMargin, stage.width)
return STATE.mediaView.zoneWidth() - (horizontalMargin * 2)
}
function getZoneHeight() {
var verticalMargin = percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height)
return STATE.mediaView.zoneHeight(vars.section.key) - (verticalMargin * 2)
}
function getTotalThumbs() {
STATE.section(vars.section)
var zoneWidth = getZoneWidth()
var zoneHeight = getZoneHeight()
var gap = STATE.overrides.thumbnailGap
return (getNumberOfColumns(zoneWidth, Infinity, gap) * getNumberOfRows(zoneHeight, gap)) || 1
}
self.mask = mask
self.section = vars.section
// facade layer to map to current thumbsModule lazyloader
self.lazyLoader = {
update: function() {
thumbsModules.forEach(function(module) {
module.lazyLoader.update()
})
// var curThumbsModule = thumbsModules[curPage]
// if(curThumbsModule && curThumbsModule.lazyLoader) curThumbsModule.lazyLoader.update()
}
}
self.getTotalHeight = function() {
STATE.section(vars.section)
return thumbsModules ? STATE.mediaView.zoneHeight(self.section.key) : STATE.mediaView.height(self.section.key)
}
function touchNav_Temp(staticNav) {
var touchStartPointX = 0
var moveDistanceX = 0
var moveDistanceY = 0
container.addEventListener(TOUCH_START, function(e) {
touchStartPointX = e.touches[0].pageX - container.x
touchStartPointXRef = e.touches[0].pageX
}, false)
container.addEventListener(TOUCH_MOVE, function(e) {
moveDistanceX = e.touches[0].pageX
moveDistanceY = e.touches[0].pageY
if(Math.abs(moveDistanceX) > Math.abs(moveDistanceY) - 10) {
// prevent vertical page scroll when intent is to swipe thumbs
e.preventDefault()
e.stopPropagation()
}
container.x = moveDistanceX - touchStartPointX
}, false)
container.addEventListener(TOUCH_END, function(e) {
// e.preventDefault()
// e.stopPropagation()
if(moveDistanceX - touchStartPointXRef > 20) {
curPage = curPage - 1 > 0 ? curPage - 1 : 0
var prevPage = thumbsModules[curPage]
// tweening 'translateX' causes strange behavior in Safari where the thumbs hide when outside
// the viewport and show all-at-once when the container has finished it's transition
Tween(container, 0.35, { x: -prevPage.x, ease:EASE.cubic.out, onComplete: function() {
if(curPage === 0) {
staticNav.hide('prev')
staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
staticNav.hide('next')
staticNav.show('prev')
} else {
staticNav.show()
}
self.lazyLoader.update()
containerX = container.x
}})
} else if(moveDistanceX - touchStartPointXRef < -20) {
curPage = curPage + 1 < thumbsModules.length ? curPage + 1 : thumbsModules.length - 1
var nextPage = thumbsModules[curPage]
// tweening 'translateX' causes strange behavior in Safari where the thumbs hide when outside
// the viewport and show all-at-once when the container has finished it's transition
Tween(container, 0.35, { x: -nextPage.x, ease:EASE.cubic.uut, onComplete: function() {
if(curPage === 0) {
staticNav.hide('prev')
staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
staticNav.hide('next')
staticNav.show('prev')
} else {
staticNav.show()
}
self.lazyLoader.update()
containerX = container.x
}})
} else {
var currentPage = thumbsModules[curPage - 1]
Tween(container, 0.35, { x: -currentPage.x, ease:EASE.cubic.uut, onComplete: function() {
if(curPage === 0) {
staticNav.hide('prev')
staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
staticNav.hide('next')
staticNav.show('prev')
} else {
staticNav.show()
}
containerX = container.x
}})
}
touchStartPointX = 0
moveDistanceX = 0
}, false)
container.addEventListener(TOUCH_CANCEL, function(e) {
}, false)
}
function swipeNav_Temp(staticNav) {
var debounceTimer
var timerDuration = 500
containerX = container.x
self.mask.element.addEventListener("wheel", function(e) {
clearTimeout(debounceTimer)
if(Math.abs(e.deltaX) > Math.abs(e.deltaY)) {
var lastPageX = thumbsModules[thumbsModules.length - 1].x
containerX -= Math.round(e.deltaX)
if(containerX < -Math.abs(lastPageX)) {
container.x = -Math.abs(lastPageX)
containerX = -Math.abs(lastPageX)
} else if(containerX < 0) {
container.x = containerX
} else if(containerX >= 0) {
container.x = 0
containerX = 0
}
debounceTimer = setTimeout(function() {
curPage = Math.round((Math.abs(containerX) / lastPageX) * (thumbsModules.length - 1))
var nextPage = thumbsModules[curPage]
Tween(container, 0.35, { x: -nextPage.x, ease:EASE.cubic.inOut, onComplete: function() {
if(curPage === 0) {
staticNav.hide('prev')
staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
staticNav.hide('next')
staticNav.show('prev')
} else {
staticNav.show()
}
self.lazyLoader.update()
containerX = container.x
}})
}, timerDuration)
} else {
// dont move vertically
}
});
}
function handleNavIconDisplay(curPage) {
return function(staticNav) {
if(curPage === 0) {
staticNav.hide('prev')
} else if(curPage === thumbsModules.length - 1) {
staticNav.hide('next')
}
}
}
function buildStaticNav() {
STATE.section(vars.section)
return new StaticNav({
zIndex: 201,
axis: 'x',
align: LAYOUT_MODEL.staticNavAlignment || 'center',
scale: LAYOUT_MODEL.staticNavIconScale || 1,
zone: {
x: 0, //STATE.mediaView.zoneX(),
y: 0, //STATE.mediaView.zoneY(),
width: STATE.mediaView.zoneWidth(),
height: STATE.mediaView.zoneHeight(self.section.key)
},
offset: {
prevX: LAYOUT_MODEL.staticNavPrevOffsetX || 0,
prevY: LAYOUT_MODEL.staticNavPrevOffsetY || 0,
nextX: LAYOUT_MODEL.staticNavNextOffsetX || 0,
nextY: LAYOUT_MODEL.staticNavNextOffsetY || 0
},
paths: {
prev: {
d: svgPaths.arrow3Left,
fill: 'none',
stroke: LAYOUT_MODEL.cursorColor || '#333',
strokeWidth: LAYOUT_MODEL.staticNavStrokeWidth || 1
},
next: {
d: svgPaths.arrow3Right,
fill: 'none',
stroke: LAYOUT_MODEL.cursorColor || '#333',
strokeWidth: LAYOUT_MODEL.staticNavStrokeWidth || 1
}
},
prevClick: function(staticNav) {
curPage = curPage - 1 > 0 ? curPage - 1 : 0
var prevPage = thumbsModules[curPage]
// tweening 'translateX' causes strange behavior in Safari where the thumbs hide when outside
// the viewport and show all-at-once when the container has finished it's transition
Tween(container, 0.35, { x: -prevPage.x, ease:EASE.cubic.inOut, onComplete: function() {
if(curPage === 0) {
staticNav.hide('prev')
staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
staticNav.hide('next')
staticNav.show('prev')
} else {
staticNav.show()
}
self.lazyLoader.update()
containerX = container.x
}})
},
nextClick: function(staticNav) {
curPage = curPage + 1 < thumbsModules.length ? curPage + 1 : thumbsModules.length - 1
var nextPage = thumbsModules[curPage]
// tweening 'translateX' causes strange behavior in Safari where the thumbs hide when outside
// the viewport and show all-at-once when the container has finished it's transition
Tween(container, 0.35, { x: -nextPage.x, ease:EASE.cubic.inOut, onComplete: function() {
if(curPage === 0) {
staticNav.hide('prev')
staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
staticNav.hide('next')
staticNav.show('prev')
} else {
staticNav.show()
}
self.lazyLoader.update()
containerX = container.x
}})
}
})
}
function getPagesItems(mediaItems) {
return mediaItems
.reduce(function(acc, mediaId, i) {
if(i % totalThumbs === 0) acc.push([])
var prevPage = acc[acc.length - 1]
if(prevPage) prevPage.push(mediaId)
return acc
}, [])
}
function buildThumbsModules() {
totalThumbs = getTotalThumbs()
pagesItems = getPagesItems(vars.mediaItems)
STATE.section(vars.section)
return pagesItems
.map(function(mediaItems) {
return new ThumbsModule({
path:vars.path,
mediaItems:mediaItems,
settings:vars.settings,
events:vars.events,
localEvents:vars.localEvents,
parent:vars.parent,
section:vars.section,
paginatedHeight: STATE.mediaView.zoneHeight(self.section.key),
isIndexSection: vars.isIndexSection
})
})
}
function build(container) {
thumbsModules = buildThumbsModules()
container.removeChildren(container)
container.x = 0
return thumbsModules
.reduce(function(el, thumbsModule) {
thumbsModule.show()
el.addChild(thumbsModule)
return el
}, container)
}
if(vars.mediaItems.length > 0) {
// initial build needs "new Sprite" for container
container = build(new Sprite())
container.zIndex = 1
container.element.className = 'paginated container'
self.mask.element.className = 'paginated mask'
self.mask.width = STATE.mediaView.zoneWidth()
self.mask.height = STATE.mediaView.zoneHeight(self.section.key)
self.layout = function() {
thumbsModules.forEach(function(module, i) {
module.resize()
module.x = i * STATE.mediaView.zoneWidth()
})
}
self.transition = new PaginatedSlideTransition({mediaView:self, mediaViewContainer:container, event:vars.events})
self.resize = function() {
build(container)
if(curPage > thumbsModules.length - 1) curPage = thumbsModules.length - 1
if(self.staticNav) {
self.staticNav.resize({
x: 0, //STATE.overlayView.x(),
y: 0, //STATE.overlayView.y(),
width: STATE.overlayView.zoneWidth(),
height: STATE.mediaView.zoneHeight(self.section.key)
})
if(!thumbsModules.length || thumbsModules.length === 1) {
self.staticNav.hide()
} else if(curPage === 0) {
self.staticNav.hide('prev')
self.staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
self.staticNav.hide('next')
self.staticNav.show('prev')
} else {
self.staticNav.show()
}
}
self.layout()
if(thumbsModules[curPage]) Tween(container, 0.35, { x: -thumbsModules[curPage].x })
}
self.removeStaticNav = function() {
self.removeChild(self.staticNav)
}
self.staticNav = buildStaticNav()
self.swipeNav = swipeNav_Temp(self.staticNav)
self.touchNav = touchNav_Temp(self.staticNav)
if(!thumbsModules.length || thumbsModules.length === 1) {
self.staticNav.hide()
} else if(curPage === 0) {
self.staticNav.hide('prev')
self.staticNav.show('next')
} else if(curPage === thumbsModules.length - 1) {
self.staticNav.hide('next')
self.staticNav.show('prev')
} else {
self.staticNav.show()
}
self.resize()
}
self.show = function() {
// show arrows
self.display = 'block'
thumbsModules.forEach(function(module, i) {
module.show()
})
toggleState = true
}
self.hide = function() {
// hide arrows
thumbsModules.forEach(function(module) {
module.hide()
})
setTimeout(function() {
self.display = 'none'
}, UPDATE_SPEED * 1000)
toggleState = false
}
self.toggleState = function() {
return toggleState
}
self.highlight = function() {
if(container) {
var currentPage = container.children[curPage]
if(currentPage) currentPage.highlight()
}
}
self.mask.addChild(container)
self.addChild(self.mask)
self.addChild(self.staticNav)
return self
}
function PaginatedSlideTransition(imports) {
var _container = imports.mediaViewContainer,
_localEvents = imports.localEvents,
_mediaView = imports.mediaView;
function transition(assetId, transitionDuration) {
STATE.section(_mediaView.section)
var transitionDuration = transitionDuration !== undefined ? transitionDuration : STATE.mediaView.transitionDuration();
_localEvents.dispatchEvent(TRANSITION_START);
var ease = TOUCH_DEVICE ? EASE.quart.out : EASE.cubic.inOut;
var asset = _container.children[assetId];
if(asset) {
var assetX = asset.x;
var assetY = asset.y;
Tween(_container, transitionDuration, {translateX:-assetX, translateY:-assetY, ease:ease, onComplete:function(){
_localEvents.dispatchEvent(TRANSITION_END);
if(_mediaView.lazyLoader) _mediaView.lazyLoader.update();
}});
if(USER_AGENT === MOBILE) {
var items = _container.children
for(var i = 0; i < items.length; i++) {
var item = items[i];
item.i = i;
if(i === assetId || i === assetId -1 || i === assetId + 1) {
item.element.style.visibility = 'visible';
} else {
item.element.style.visibility = 'hidden';
}
}
}
}
}
transition.destroy = function destroy() {
// dummy
}
return transition;
}
function ThumbsModule(vars) {
"use strict"
STATE.section(vars.section)
var self = new Sprite({events:vars.events}),
mask,
grid,
gridContainer,
axis = STATE.overrides.thumbnailSide === 'left' || STATE.overrides.thumbnailSide === 'right' || /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType) ? 'y' : 'x',
align = axis === 'y' ? 'top' : 'left',
thumbArr = [],
thumbsStyle,
titleBlockHeight = 0,
titleBlock,
toggle,
dock,
maxGap = STATE.overrides.thumbnailGap,
tile = new Tile({
name:'thumbs',
type:STATE.overrides.thumbnailType,
marginHorizontal: percentToPixels(STATE.overrides.thumbnailHorizontalMargin, stage.width),
marginVertical: percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height),
maintainOrder:/fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType) && STATE.overrides.thumbnailMasonryMaintainOrder,
horizontalMasonry:/hMasonry/.test(STATE.overrides.thumbnailType) && STATE.overrides.thumbnailMasonryEvenRowHeight,
masonryFill:/hMasonry|vMasonry/.test(STATE.overrides.thumbnailType) && STATE.overrides.thumbnailMasonryFill,
gap: STATE.overrides.thumbnailGap
}),
assetId
if(/hMasonryHScroll/.test(STATE.overrides.thumbnailType)) axis = 'x'
vars.localEvents.addEventListener(PAUSE_MEDIA, function(e){
pauseThumbVideos()
})
self.getTotalHeight = function() {
return thumbsStyle ? thumbsStyle.totalHeight : 0
}
self.currentThumb = 1
self.settings = vars.settings
self.section = vars.section
self.tile = tile
// probably need a specific setting in addition to zIndex for allowing logo click thru thumbnails mask instead of only logo zIndex check
// otherwise you get this ---> 'showing cursor underneath all thumbnail pages #1644'
self.pointerEvents = (/^unified/.test(STATE.overrides.siteDisplayBehavior) && LAYOUT_MODEL.globalSmoothScroll && !(USER_AGENT === MOBILE || USER_AGENT === TABLET) && LAYOUT_MODEL.logoZIndex !== '' && LAYOUT_MODEL.logoZIndex < 5) ? 'none' : 'auto'
if(/hMasonryHScroll/.test(STATE.overrides.thumbnailType)) self.pointerEvents = 'auto'
self.isInit = true
self.element.setAttribute('class', 'Thumbs.container')
self.selectable = false
function updateScrollState(scrollY) {
if(self.lazyLoader) self.lazyLoader.update()
if(hasMode('thumbs', layoutCalcs._uriState.mode)) {
self.savedScrollY = scrollY
}
}
self.build = function() {
var hasOffset = vars.mediaItems.reduce(function(acc, item) {
return acc ? acc : (item.overrides.thumbHorizontalOffset || item.overrides.thumbVerticalOffset)
}, false)
var overflow = (hasOffset || STATE.overrides.thumbnailShadow) ? '' : 'hidden'
STATE.section(vars.section)
self.updateSpeed = 0
self.holdersBuilt = false
self.id = 'thumbs'
self.overflow = overflow
self.zIndex = 200
self.alpha = 0
mask = self.mask = new Sprite()
mask.id = 'mask'
mask.overflow = overflow
mask.zIndex = 1
mask.element.setAttribute('class', 'Thumbs.mask')
if(STATE.overrides.thumbnailDock === 'overlay' || /fill|hMasonry|vMasonry|hPaginatedGrid/.test(STATE.overrides.thumbnailType)) {
mask.backgroundColor = toRgba(STATE.overrides.thumbnailOverlayColor, STATE.overrides.thumbnailOverlayAlpha)
}
self.addChild(mask)
self.mask = mask
grid = new Sprite()
grid.id = 'grid'
grid.element.setAttribute('class', 'Thumbs.grid')
grid.element.style.transform = 'translateZ(0)'
if(/hMasonry/.test(STATE.overrides.thumbnailType) && STATE.overrides.thumbnailMasonryFill) {
grid.overflow = overflow
}
mask.grid = grid
gridContainer = new Sprite()
gridContainer.id = 'grid-container'
gridContainer.element.setAttribute('class', 'Thumbs.grid.container')
gridContainer.element.style.transform = 'translateZ(0)'
mask.gridContainer = gridContainer
mask.addChild(gridContainer)
// setup Containerlazy loContainerader
var lazyVars = {Containername:'thumbs'}
if(isPod() || isPad()) {
lazyVars.domElementScroll = true
}
if(STATE.siteView.unifiedPageScroll() && (/native/.test(STATE.overrides.thumbnailScrollType) || LAYOUT_MODEL.globalSmoothScroll) && STATE.overrides.thumbnailType !== 'strip' && BROWSER_NAME !== 'MSIE') {
lazyVars.windowScroll = true
}
if(/slide/.test(LAYOUT_MODEL.thumbLoadEffect)) {
lazyVars.boundaryMultiplier = 0.9
} else if(/hPaginatedGrid/.test(STATE.overrides.thumbnailType)) {
lazyVars.boundaryMultiplier = 2
}
if(MAC_SCROLLBARS && (/native/.test(STATE.overrides.thumbnailScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
lazyVars.domElementScroll = true
} else {
lazyVars.property = 'translate'
}
lazyVars.targetChildren = grid.children
var gridHolder = STATE.overrides.thumbnailType === 'strip' ? grid : gridContainer
self.lazyLoader = new LazyLoader(gridHolder, mask, lazyVars)
self.lazyLoader.name = 'thumbs'
toggle = new Toggle({
target: self,
on: self.hide,
off: self.show
})
var moveDistanceX = 0
var moveDistanceY = 0
var touchStartPointX = 0
var touchStartPointY = 0
var swiping
var scrolling
if(/fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType) && vars.section.thumb && vars.section.thumb.titleBlock) {
titleBlock = buildTitleBlock(vars.section)
//titleBlock.y = percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height)
titleBlockHeight = STATE.overrides.thumbnailTitleBlockTopMargin + titleBlock.element.offsetHeight
titleBlock.y = STATE.overrides.thumbnailTitleBlockTopMargin
mask.gridContainer.addChild(titleBlock)
}
if(isPod() || isPad()) {
if(!/^unified/.test(STATE.overrides.siteDisplayBehavior) || (USER_AGENT === MOBILE || USER_AGENT === TABLET)) {
// dont need scroll for unified page or unified site since the thumbs are full height and the page scrolls
if(axis === 'y') {
mask.element.style.overflowY = 'scroll'
mask.element.style.overflowX = 'hidden'
} else {
mask.element.style.overflowY = 'hidden'
mask.element.style.overflowX = 'scroll'
}
}
mask.element.style['-webkit-overflow-scrolling'] = 'touch'
grid.element.addEventListener('touchstart', function(e) {
moveDistanceX = 0
moveDistanceY = 0
touchStartPointX = e.touches[0].pageX
touchStartPointY = e.touches[0].pageY
})
grid.element.addEventListener('touchmove', function(e) {
moveDistanceX = e.touches[0].pageX - touchStartPointX
moveDistanceY = e.touches[0].pageY - touchStartPointY
if(Mth.abs(moveDistanceX) > Mth.abs(moveDistanceY)) {
if(moveDistanceX > 0) {
// swiping right
if(mask.element.scrollLeft > 0 && mask.element.scrollLeft <= grid.width - STATE.overlayView.zoneWidth()) {
// prevent menu touch events from listening to thumbs touch moves
// when in scrolling limits
e.stopPropagation()
}
} else {
// swiping left
if(axis === 'x') {
// prevent menu touch events from listening to thumbs touch moves
// when in scrolling limits
e.stopPropagation()
}
}
swiping = true
scrolling = false
} else {
scrolling = true
swiping = false
}
updateScrollState(mask.scrollY || window.scrollY)
})
grid.element.addEventListener('touchend', function(e) {
updateScrollState(mask.scrollY || window.scrollY)
})
mask.element.addEventListener("scroll", function(){
updateScrollState(mask.scrollY || window.scrollY)
})
if(STATE.siteView.unifiedPageScroll()) {
window.addEventListener("scroll", function(e){
updateScrollState(mask.scrollY || window.scrollY)
})
}
} else {
if(STATE.siteView.unifiedPageScroll() && /hMasonryHScroll/.test(STATE.overrides.thumbnailType) && (/native/.test(STATE.overrides.thumbnailScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
mask.element.addEventListener("scroll", function(){
updateScrollState(mask.scrollY || window.scrollY)
})
mask.element.style.overflowY = 'hidden'
mask.element.style.overflowX = 'scroll'
} else if(/^unifiedSite/.test(STATE.overrides.siteDisplayBehavior)) {
// native scroll bar
window.addEventListener("scroll", function(e){
updateScrollState(window.scrollY)
})
// } else if(window.fullScreen || document.webkitCurrentFullScreenElement) {
// // hack added for bug #1563
// document.getElementsByClassName('SiteView')[0].addEventListener("scroll", function(e){
// if(self.lazyLoader) {
// self.lazyLoader.update()
// }
// })
} else if(STATE.siteView.unifiedPageScroll() && /fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType) && (/native/.test(STATE.overrides.thumbnailScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
// native scroll bar
// hack added for bug #1563
document.getElementsByClassName('SiteView')[0].addEventListener("scroll", function(e){
// not doing this for now, don't know consequences: updateScrollState(window.scrollY)
if(self.lazyLoader) {
self.lazyLoader.update()
}
})
window.addEventListener("scroll", function(e){
updateScrollState(window.scrollY)
})
} else if(MAC_SCROLLBARS && (/native/.test(STATE.overrides.thumbnailScrollType) || LAYOUT_MODEL.globalSmoothScroll)) {
// native scroll bar
// this overflow doesnt apply for unified page scroll because
// the page height is getting set to the content height
mask.element.addEventListener("scroll", function(){
updateScrollState(mask.scrollY || window.scrollY)
})
if(axis === 'y') {
mask.element.style.overflowY = 'scroll'
mask.element.style.overflowX = 'hidden'
} else {
mask.element.style.overflowY = 'hidden'
mask.element.style.overflowX = 'scroll'
}
} else {
makeCloseHit()
var scrollBarWidth = STATE.overrides.thumbnailType === 'strip' ? 0 : STATE.overrides.thumbnailScrollbarWidth
var scrollBarOffsetX = STATE.overrides.thumbnailScrollbarAlignment === 'right' ? -STATE.overrides.thumbnailScrollbarHorizontalOffset - scrollBarWidth : STATE.overrides.thumbnailScrollbarHorizontalOffset + scrollBarWidth
var scrollAxis = isHorizontalStrip() ? 'x' : 'y'
if(STATE.overrides.thumbnailType === 'strip') {
align = axis === 'y' ? STATE.overrides.thumbnailAlignVertical || 'center' : STATE.overrides.thumbnailAlignHorizontal || 'center'
}
var scrollProps = {
name:'thumbs',
types: ['bar','wheel','touch'],
axis: scrollAxis,
align: align,
zIndex: STATE.overlayView.zIndex + 1,
// margin: percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height),
// marginTop: titleBlock ? 0 : percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height),
// marginBottom: percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height),
color: STATE.overrides.thumbnailScrollbarColor,
hover: STATE.overrides.thumbnailScrollbarHover,
side: STATE.overrides.thumbnailScrollbarAlignment,
alpha: STATE.overrides.thumbnailScrollbarBgAlpha,
width: scrollBarWidth,
offsetX: STATE.overlayView.x() + scrollBarOffsetX,
offsetY: STATE.overlayView.y(vars.section.key) + STATE.overrides.thumbnailScrollbarVerticalOffset,
property: 'translate',
rounded: STATE.overrides.thumbnailScrollbarRounded,
visibility: STATE.overrides.thumbnailScrollbarVisibility,
parent: vars.scrollbarParent
}
if(/fill|hMasonry|vMasonry/.test(STATE.overrides.thumbnailType)) {
scrollProps.marginTop = titleBlock ? STATE.overrides.thumbnailTitleBlockTopMargin : percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height)
scrollProps.marginBottom = percentToPixels(STATE.overrides.thumbnailVerticalMargin, stage.height)
} else {
scrollProps.margin = 0
}
if(/native/.test(STATE.overrides.thumbnailScrollType) || LAYOUT_MODEL.globalSmoothScroll) {
// simulated native scroll bar
scrollProps.margin = 0
scrollProps.color = '#000000'
scrollProps.hover = '#000000'
scrollProps.side = 'right'
scrollProps.alpha = 0
scrollProps.width = scrollBarWidth
scrollProps.offsetX = STATE.overlayView.x() - 10
scrollProps.offsetY = STATE.overlayView.y(vars.section.key)
scrollProps.rounded = true
scrollProps.visibility = 'when scrolling'
}
// gridContainer is a problem for thumb strip
// so we are bypassing is for now since thumb desc isnt used there
// if it is needed then the bounds stuff needs to be applied to
// the ThumbStrip module below ... similar to how it was done for grid
var gridHolder = STATE.overrides.thumbnailType === 'strip' ? grid : gridContainer
self.scroll = new Scroll(gridHolder, mask, scrollProps)
}
}
if(self.scroll) {
self.scroll.addEventListener(SCROLL, function(){
if(self.lazyLoader) {
self.lazyLoader.update()
}
})
self.scroll.addEventListener('WINDOW_SCROLL_TOP', function(){
self.scroll.percent = 0
self.scroll.update(UPDATE_SPEED)
})
}
if(vars.mediaItems.length > 0) makeHolders()
toggle.state = true
self.resize()
toggle.state = false
self.isInit = false
}
function buildTitleBlock(section) {
STATE.section(vars.section)
var titleBlock = new Sprite()
titleBlock.selectable = true
titleBlock.text = section.thumb.titleBlock
titleBlock.fontFamily = LAYOUT_MODEL.thumbnailTitleBlockFont || STATE.overrides.thumbnailTitleFont
titleBlock.fontColor = LAYOUT_MODEL.thumbnailTitleBlockFontColor || STATE.overrides.thumbnailTitleFontColor
titleBlock.fontSize = LAYOUT_MODEL.thumbnailTitleBlock