{"version":3,"file":"/pc/all/libs/boxer.js.map","sources":["/pc/all/libs/boxer.js"],"sourcesContent":["/*\n * Boxer v3.0.3 - 2014-01-12\n * A jQuery plugin for displaying images, videos or content in a modal overlay. Part of the Formstone Library.\n * http://formstone.it/boxer/\n *\n * Copyright 2014 Ben Plum; MIT Licensed\n */\n\n/*\n * Boxer v3.0.0 - 2014-01-04\n * A jQuery plugin for displaying images, videos or content in a modal overlay. Part of the Formstone Library.\n * http://formstone.it/boxer/\n *\n * Copyright 2014 Ben Plum; MIT Licensed\n */\n\n/**\n * @plugin\n * @name Boxer\n * @description A jQuery plugin for displaying images, videos or content in a modal overlay. Part of the Formstone Library.\n * @version 3.0.0\n */\n\n;(function ($, window) {\n\t\"use strict\";\n\n\tvar data = {},\n\t\t\ttrueMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test((window.navigator.userAgent||window.navigator.vendor||window.opera));\n\n\t/**\n\t * @options\n\t * @param callback [function] <$.noop> \"Funciton called after opening instance\"\n\t * @param customClass [string] <''> \"Class applied to instance\"\n\t * @param duration [int] <250> \"Animation duration\"\n\t * @param fixed [boolean] \"Flag for fixed positioning\"\n\t * @param formatter [function] <$.noop> \"Caption format function\"\n\t * @param height [int] <100> \"Initial height (while loading)\"\n\t * @param labels.close [string] <'Close'> \"Close button text\"\n\t * @param labels.count [string] <'of'> \"Gallery count separator text\"\n\t * @param labels.next [string] <'Next'> \"Gallery control text\"\n\t * @param labels.previous [string] <'Previous'> \"Gallery control text\"\n\t * @param margin [int] <50> \"Margin used when sizing (single side)\"\n\t * @param minHeight [int] <100> \"Minimum height of modal\"\n\t * @param minWidth [int] <100> \"Minimum width of modal\"\n\t * @param mobile [boolean] \"Flag to force 'mobile' rendering\"\n\t * @param opacity [number] <0.75> \"Overlay target opacity\"\n\t * @param retina [boolean] \"Use 'retina' sizing (half's natural sizes)\"\n\t * @param requestKey [string] <'boxer'> \"GET variable for ajax / iframe requests\"\n\t * @param top [int] <0> \"Target top position; over-rides centering\"\n\t * @param videoRadio [number] <0.5625> \"Video height / width ratio (9 / 16 = 0.5625)\"\n\t * @param videoWidth [int] <600> \"Video target width\"\n\t * @param width [int] <100> \"Initial height (while loading)\"\n\t */\n\tvar options = {\n\t\tcallback: $.noop,\n\t\tcustomClass: \"\",\n\t\tduration: 250,\n\t\tfixed: false,\n\t\tformatter: $.noop,\n\t\theight: 100,\n\t\tlabels: {\n\t\t\tclose: \"Close\",\n\t\t\tcount: \"of\",\n\t\t\tnext: \"Next\",\n\t\t\tprevious: \"Previous\"\n\t\t},\n\t\tmargin: 50,\n\t\tminHeight: 100,\n\t\tminWidth: 100,\n\t\tmobile: false,\n\t\topacity: 0.75,\n\t\tretina: false,\n\t\trequestKey: \"boxer\",\n\t\ttop: 0,\n\t\tvideoRatio: 0.5625,\n\t\tvideoWidth: 600,\n\t\twidth: 100\n\t};\n\n\t/**\n\t * @events\n\t * @event open.boxer \"Modal opened; triggered on window\"\n\t * @event close.boxer \"Modal closed; triggered on window\"\n\t */\n\n\tvar pub = {\n\n\t\t/**\n\t\t * @method\n\t\t * @name defaults\n\t\t * @description Sets default plugin options\n\t\t * @param opts [object] <{}> \"Options object\"\n\t\t * @example $.boxer(\"defaults\", opts);\n\t\t */\n\t\tdefaults: function(opts) {\n\t\t\toptions = $.extend(options, opts || {});\n\t\t\treturn $(this);\n\t\t},\n\n\t\t/**\n\t\t * @method\n\t\t * @name destroy\n\t\t * @description Removes instance of plugin\n\t\t * @example $.boxer(\"destroy\");\n\t\t */\n\t\tdestroy: function() {\n\t\t\t_onClose();\n\t\t\treturn $(this).off(\".boxer\");\n\t\t},\n\n\t\t/**\n\t\t * @method\n\t\t * @name resize\n\t\t * @description Triggers resize of instance\n\t\t * @example $.boxer(\"resize\");\n\t\t */\n\t\tresize: function(e /* , height, width */) {\n\t\t\t// removing custom size support - will return later\n\t\t\tif (typeof data.$boxer !== \"undefined\") {\n\t\t\t\tif (data.type === \"element\") {\n\t\t\t\t\t_sizeContent(data.$content.find(\">:first-child\"));\n\t\t\t\t} else if (data.type === \"image\") {\n\t\t\t\t\t_sizeImage();\n\t\t\t\t} else if (data.type === \"video\") {\n\t\t\t\t\t_sizeVideo();\n\t\t\t\t}\n\t\t\t\t_size();\n\t\t\t}\n\n\t\t\treturn $(this);\n\t\t}\n\t};\n\n\t/**\n\t * @method private\n\t * @name _init\n\t * @description Initializes plugin\n\t * @param opts [object] \"Initialization options\"\n\t */\n\tfunction _init(opts) {\n\t\toptions.formatter = _formatCaption;\n\t\treturn $(this).on(\"click.boxer\", $.extend({}, options, opts || {}), _build);\n\t}\n\n\t/**\n\t * @method private\n\t * @name _build\n\t * @description Builds target instance\n\t * @param e [object] \"Event data\"\n\t */\n\tfunction _build(e) {\n\t\t// Check target type\n\t\tvar $target = $(this),\n\t\t\t\t$object = e.data.$object,\n\t\t\t\tsource = ($target[0].attributes) ? $target.attr(\"href\") || \"\" : \"\",\n\t\t\t\tcheckExt = source.toLowerCase().split(\".\"),\n\t\t\t\textension = checkExt[ checkExt.length - 1 ],\n\t\t\t\ttype = '', // $target.data(\"type\") || \"\";\n\t\t\t\tisImage = ( (type === \"image\") || (extension === \"jpeg\" || extension === \"jpg\" || extension === \"gif\" || extension === \"png\" || source.substr(0, 10) === \"data:image\") ),\n\t\t\t\tisVideo = ( source.indexOf(\"youtube.com/embed\") > -1 || source.indexOf(\"player.vimeo.com/video\") > -1 ),\n\t\t\t\tisUrl = ( (type === \"url\") || (!isImage && !isVideo && source.substr(0, 4) === \"http\") ),\n\t\t\t\tisElement = ( (type === \"element\") || (!isImage && !isVideo && !isUrl && source.substr(0, 1) === \"#\") ),\n\t\t\t\tisObject = ( (typeof $object !== \"undefined\") );\n\n\t\t// Check if boxer is already active, retain default click\n\t\tif ($(\".mboxer\").length > 0 || !(isImage || isVideo || isUrl || isElement || isObject)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Kill event\n\t\t_killEvent(e);\n\n\t\t// Cache internal data\n\t\tdata = $.extend({}, {\n\t\t\t$window: $(window),\n\t\t\t$body: $(\"body\"),\n\t\t\t$target: $target,\n\t\t\t$object: $object,\n\t\t\tvisible: false,\n\t\t\tresizeTimer: null,\n\t\t\ttouchTimer: null,\n\t\t\tgallery: {\n\t\t\t\tactive: false\n\t\t\t},\n\t\t\tisMobile: (trueMobile || e.data.mobile)\n\t\t}, e.data);\n\n\t\t// Double the margin\n\t\tdata.margin *= 2;\n\t\tdata.containerHeight = data.height;\n\t\tdata.containerWidth = data.width;\n\n\t\tif (isImage) {\n\t\t\tdata.type = \"image\";\n\t\t} else if (isVideo) {\n\t\t\tdata.type = \"video\";\n\t\t} else {\n\t\t\tdata.type = \"element\";\n\t\t}\n\n\t\tif (isImage || isVideo) {\n\t\t\t// Check for gallery\n\t\t\tvar rel = data.$target.attr(\"rel\");\n\t\t\tif (typeof rel !== \"undefined\" && rel !== false) {\n\t\t\t\tdata.gallery.active = true;\n\t\t\t\tdata.gallery.rel = rel;\n\t\t\t\tdata.gallery.$items = $(\"a[rel= \" + data.gallery.rel + \"]\");\n\t\t\t\tdata.gallery.index = data.gallery.$items.index(data.$target);\n\t\t\t\tdata.gallery.total = data.gallery.$items.length - 1;\n\t\t\t}\n\t\t}\n\t\t// Assemble HTML\n\t\tvar html = '';\n\t\tif (!data.isMobile) {\n\t\t\thtml += '
';\n\t\t}\n\t\thtml += '
';\n\t\thtml += '
';\n\t\t\t\thtml += '
' + data.labels.next + '
';\n\t\t\t\thtml += '

' + data.labels.count + ' ' + (data.gallery.total + 1) + '';\n\t\t\t\thtml += '

';\n\t\t\t\thtml += '
';\n\t\t\t} else {\n\t\t\t\thtml += '
';\n\t\t\t}\n\n\t\t\thtml += data.formatter.apply(data.$body, [data.$target]);\n\t\t\thtml += '
'; // caption, meta\n\t\t}\n\t\thtml += '
'; //container, content, boxer\n\t\t// Modify Dom\n\n\t\tdata.$body.append(html);\n\n\n\t\t//if ($('.mboxer').length == 0){\n\t\t//\tdata.$body.append(html);\n\t\t//}\n\n\n\n\t\t// Cache jquery objects\n\t\tdata.$overlay = $(\".boxer-overlay\");\n\t\tdata.$boxer = $(\".mboxer\");\n\t\tdata.$container = data.$boxer.find(\".boxer-container\");\n\t\tdata.$content = data.$boxer.find(\".boxer-content\");\n\t\tdata.$meta = data.$boxer.find(\".boxer-meta\");\n\t\tdata.$position = data.$boxer.find(\".boxer-position\");\n\t\tdata.$caption = data.$boxer.find(\".boxer-caption\");\n\t\tdata.$arrows = data.$boxer.find(\".boxer-arrow\");\n\t\tdata.$animatables = $(\".boxer-overlay, .mboxer, .boxer-container\");\n\t\tdata.paddingVertical = parseInt(data.$boxer.css(\"paddingTop\"), 10) + parseInt(data.$boxer.css(\"paddingBottom\"), 10);\n\t\tdata.paddingHorizontal = parseInt(data.$boxer.css(\"paddingLeft\"), 10) + parseInt(data.$boxer.css(\"paddingRight\"), 10);\n\n\t\t// Center / update gallery\n\t\t_center();\n\t\tif (data.gallery.active) {\n\t\t\t_updateControls();\n\t\t}\n\n\t\t// Bind events\n\t\tdata.$window.on(\"resize.boxer\", pub.resize)\n\t\t\t\t.on(\"keydown.boxer\", _onKeypress);\n\t\tdata.$body.on(\"touchstart.boxer click.boxer\", \".boxer-overlay, .mboxer .boxer-close\", _onClose)\n\t\t\t\t.on(\"touchmove.boxer\", _killEvent);\n\n\t\tif (data.gallery.active) {\n\t\t\tdata.$boxer.on(\"touchstart.boxer click.boxer\", \".boxer-arrow\", _advanceGallery);\n\t\t}\n\n\t\tdata.$overlay.stop().animate({ opacity: data.opacity }, data.duration);\n\t\tdata.$boxer.stop().animate({ opacity: 1 }, data.duration, function() {\n\t\t\tif (isImage) {\n\t\t\t\t_loadImage(source);\n\t\t\t} else if (isVideo) {\n\t\t\t\t_loadVideo(source);\n\t\t\t} else if (isUrl) {\n\t\t\t\t_loadURL(source);\n\t\t\t} else if (isElement) {\n\t\t\t\t_cloneElement(source);\n\t\t\t} else if (isObject) {\n\t\t\t\t_appendObject(data.$object);\n\t\t\t} else {\n\t\t\t\t$.error(\"BOXER: '\" + source + \"' is not valid.\");\n\t\t\t}\n\t\t});\n\n\t\tif (isObject) {\n\t\t\treturn data.$boxer;\n\t\t}\n\t}\n\n\t/**\n\t * @method private\n\t * @name _onClose\n\t * @description Closes active instance\n\t * @param e [object] \"Event data\"\n\t */\n\tfunction _onClose(e) {\n\t\t_killEvent(e);\n\n\t\tif (typeof data.$animatables !== \"undefined\") {\n\t\t\tdata.$animatables.stop().animate({ opacity: 0 }, data.duration, function() {\n\t\t\t\t$(this).remove();\n\t\t\t});\n\n\t\t\t_clearTimer(data.resizeTimer);\n\n\t\t\t// Clean up\n\t\t\tdata.$window.off(\".boxer\");\n\t\t\tdata.$body.off(\".boxer\")\n\t\t\t\t\t.removeClass(\"boxer-open\");\n\n\t\t\tif (data.gallery.active) {\n\t\t\t\tdata.$boxer.off(\".boxer\");\n\t\t\t}\n\n\t\t\tif (data.isMobile) {\n\t\t\t\tif (data.type === \"image\" && data.gallery.active) {\n\t\t\t\t\tdata.$container.off(\".boxer\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdata.$window.trigger(\"close.boxer\");\n\n\t\t\tdata = {};\n\t\t}\n\t}\n\n\t/**\n\t * @method private\n\t * @name _open\n\t * @description Opens active instance\n\t */\n\tfunction _open() {\n\t\tvar position = _position(),\n\t\t\t\tarrowHeight = 0,\n\t\t\t\tdurration = data.isMobile ? 0 : data.duration;\n\n\t\tif (!data.isMobile) {\n\t\t\tarrowHeight = data.$arrows.outerHeight();\n\t\t\tdata.$arrows.css({\n\t\t\t\tmarginTop: ((data.contentHeight - data.metaHeight - arrowHeight) / 2)\n\t\t\t});\n\t\t}\n\n\t\tif (!data.visible && data.isMobile && data.gallery.active) {\n\t\t\tdata.$content.on(\"touchstart.boxer\", \".boxer-image\", _onTouchStart);\n\t\t}\n\n\t\tif (data.isMobile || data.fixed) {\n\t\t\tdata.$body.addClass(\"boxer-open\");\n\t\t}\n\n\t\tdata.$boxer.stop().animate({\n\t\t\tleft: position.left,\n\t\t\ttop: position.top\n\t\t}, durration);\n\t\tdata.$container.show().stop().animate({\n\t\t\theight: data.containerHeight,\n\t\t\twidth: data.containerWidth\n\t\t}, durration, function(e) {\n\t\t\tdata.$content.stop().animate({\n\t\t\t\topacity: 1\n\t\t\t}, data.duration);\n\t\t\tdata.$boxer.removeClass(\"loading\")\n\t\t\t\t\t.find(\".boxer-close\").stop().animate({\n\t\t\t\topacity: 1\n\t\t\t}, data.duration);\n\n\t\t\tdata.visible = true;\n\n\t\t\t// Fire callback + event\n\t\t\tdata.callback.apply(data.$boxer);\n\t\t\tdata.$window.trigger(\"open.boxer\");\n\n\t\t\t// Start preloading\n\t\t\tif (data.gallery.active) {\n\t\t\t\t_preloadGallery();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @method private\n\t * @name _size\n\t * @description Sizes active instance\n\t * @param animate [boolean] \"Flag to animate sizing\"\n\t */\n\tfunction _size(animate) {\n\t\tanimate = animate || false;\n\n\t\tif (data.visible) {\n\t\t\tvar position = _position(),\n\t\t\t\t\tarrowHeight = 0;\n\n\t\t\tif (!data.isMobile) {\n\t\t\t\tarrowHeight = data.$arrows.outerHeight();\n\t\t\t\tdata.$arrows.css({\n\t\t\t\t\tmarginTop: ((data.contentHeight - data.metaHeight - arrowHeight) / 2)\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (animate) {\n\t\t\t\tdata.$boxer.stop().animate({\n\t\t\t\t\tleft: position.left,\n\t\t\t\t\ttop: position.top\n\t\t\t\t}, data.duration);\n\t\t\t\tdata.$container.show().stop().animate({\n\t\t\t\t\theight: data.containerHeight,\n\t\t\t\t\twidth: data.containerWidth\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdata.$boxer.css({\n\t\t\t\t\tleft: position.left,\n\t\t\t\t\ttop: position.top\n\t\t\t\t});\n\t\t\t\tdata.$container.css({\n\t\t\t\t\theight: data.containerHeight,\n\t\t\t\t\twidth: data.containerWidth\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @method private\n\t * @name _center\n\t * @description Centers instance\n\t */\n\n\n\tfunction _center() {\n\t\tvar position = _position();\n\t\tdata.$boxer.css({\n\t\t\tleft: position.left,\n\t\t\ttop: position.top\n\t\t});\n\t}\n\n\t/**\n\t * @method private\n\t * @name _position\n\t * @description Calculates positions\n\t * @return [object] \"Object containing top and left positions\"\n\t */\n\tfunction _position() {\n\t\tif (data.isMobile) {\n\t\t\treturn { left: 0, top: 0 };\n\t\t}\n\n\t\tvar pos = {\n\t\t\tleft: (data.$window.width() - data.containerWidth - data.paddingHorizontal) / 2,\n\t\t\ttop: (data.top <= 0) ? ((data.$window.height() - data.containerHeight - data.paddingVertical) / 2) : data.top\n\t\t};\n\n\t\tif (data.fixed !== true) {\n\t\t\tpos.top += data.$window.scrollTop();\n\t\t}\n\n\t\treturn pos;\n\t}\n\n\t/**\n\t * @method private\n\t * @name _formatCaption\n\t * @description Formats caption\n\t * @param $target [jQuery object] \"Target element\"\n\t */\n\tfunction _formatCaption($target) {\n\t\tvar title = $target.attr(\"title\");\n\t\treturn (title !== \"\" && title !== undefined) ? '

' + title + '

' : \"\";\n\t}\n\n\t/**\n\t * @method private\n\t * @name _loadImage\n\t * @description Loads source image\n\t * @param source [string] \"Source image URL\"\n\t */\n\tfunction _loadImage(source) {\n\t\t// Cache current image\n\t\tdata.$image = $(\"\");\n\n\t\tdata.$image.one(\"load.boxer\", function() {\n\t\t\tvar naturalSize = _naturalSize(data.$image);\n\n\t\t\tdata.naturalHeight = naturalSize.naturalHeight;\n\t\t\tdata.naturalWidth = naturalSize.naturalWidth;\n\n\t\t\tif (data.retina) {\n\t\t\t\tdata.naturalHeight /= 2;\n\t\t\t\tdata.naturalWidth /= 2;\n\t\t\t}\n\n\t\t\tdata.$content.prepend(data.$image);\n\t\t\tif (data.$caption.html() === \"\") {\n\t\t\t\tdata.$caption.hide();\n\t\t\t} else {\n\t\t\t\tdata.$caption.show();\n\t\t\t}\n\n\t\t\t// Size content to be sure it fits the viewport\n\t\t\t_sizeImage();\n\t\t\t_open();\n\t\t}).attr(\"src\", source)\n\t\t\t\t.addClass(\"boxer-image\");\n\n\t\t// If image has already loaded into cache, trigger load event\n\t\tif (data.$image[0].complete || data.$image[0].readyState === 4) {\n\t\t\tdata.$image.trigger(\"load\");\n\t\t}\n\t}\n\n\t/**\n\t * @method private\n\t * @name _sizeImage\n\t * @description Sizes image to fit in viewport\n\t * @param count [int] \"Number of resize attempts\"\n\t */\n\tfunction _sizeImage() {\n\t\tvar count = 0;\n\n\t\tdata.windowHeight = data.viewportHeight = data.$window[0].innerHeight || $(window).height();\n\t\tdata.windowWidth = data.viewportWidth = data.$window[0].innerWidth || $(window).width();\n\n\t\tdata.containerHeight = Infinity;\n\t\tdata.contentHeight = 0;\n\t\tdata.containerWidth = Infinity;\n\t\tdata.contentWidth = 0;\n\n\t\tdata.imageMarginTop = 0;\n\t\tdata.imageMarginLeft = 0;\n\n\t\twhile (data.containerHeight > data.viewportHeight && count < 2) {\n\t\t\tdata.imageHeight = (count === 0) ? data.naturalHeight : data.$image.outerHeight();\n\t\t\tdata.imageWidth = (count === 0) ? data.naturalWidth : data.$image.outerWidth();\n\t\t\tdata.metaHeight = (count === 0) ? 0 : data.metaHeight;\n\n\t\t\tif (count === 0) {\n\t\t\t\tdata.ratioHorizontal = data.imageHeight / data.imageWidth;\n\t\t\t\tdata.ratioVertical = data.imageWidth / data.imageHeight;\n\n\t\t\t\tdata.isWide = (data.imageWidth > data.imageHeight);\n\t\t\t}\n\n\t\t\t// Double check min and max\n\t\t\tif (data.imageHeight < data.minHeight) {\n\t\t\t\tdata.minHeight = data.imageHeight;\n\t\t\t}\n\t\t\tif (data.imageWidth < data.minWidth) {\n\t\t\t\tdata.minWidth = data.imageWidth;\n\t\t\t}\n\n\t\t\tif (data.isMobile) {\n\t\t\t\t// Get meta height before sizing\n\t\t\t\tdata.$meta.css({\n\t\t\t\t\twidth: data.windowWidth\n\t\t\t\t});\n\t\t\t\tdata.metaHeight = data.$meta.outerHeight(true);\n\n\t\t\t\t// Content match viewport\n\t\t\t\tdata.contentHeight = data.viewportHeight;\n\t\t\t\tdata.contentWidth = data.viewportWidth;\n\n\t\t\t\t// Container match viewport, less padding\n\t\t\t\tdata.containerHeight = data.viewportHeight - data.paddingVertical;\n\t\t\t\tdata.containerWidth = data.viewportWidth - data.paddingHorizontal;\n\n\t\t\t\t_fitImage();\n\n\t\t\t\tdata.imageMarginTop = (data.containerHeight - data.targetImageHeight - data.metaHeight) / 2;\n\t\t\t\tdata.imageMarginLeft = (data.containerWidth - data.targetImageWidth) / 2;\n\t\t\t} else {\n\t\t\t\t// Viewport match window, less margin, padding and meta\n\t\t\t\tif (count === 0) {\n\t\t\t\t\tdata.viewportHeight -= (data.margin + data.paddingVertical);\n\t\t\t\t\tdata.viewportWidth -= (data.margin + data.paddingHorizontal);\n\t\t\t\t}\n\t\t\t\tdata.viewportHeight -= data.metaHeight;\n\n\t\t\t\t_fitImage();\n\n\t\t\t\tdata.containerHeight = data.contentHeight = data.targetImageHeight;\n\t\t\t\tdata.containerWidth = data.contentWidth = data.targetImageWidth;\n\t\t\t}\n\n\t\t\t// Modify DOM\n\t\t\tdata.$content.css({\n\t\t\t\theight: (data.isMobile) ? data.contentHeight : \"auto\",\n\t\t\t\twidth: data.contentWidth\n\t\t\t});\n\t\t\tdata.$meta.css({\n\t\t\t\twidth: data.contentWidth\n\t\t\t});\n\t\t\tdata.$image.css({\n\t\t\t\theight: data.targetImageHeight,\n\t\t\t\twidth: data.targetImageWidth,\n\t\t\t\tmarginTop: data.imageMarginTop,\n\t\t\t\tmarginLeft: data.imageMarginLeft\n\t\t\t});\n\n\t\t\tif (!data.isMobile) {\n\t\t\t\tdata.metaHeight = data.$meta.outerHeight(true);\n\t\t\t\tdata.containerHeight += data.metaHeight;\n\t\t\t}\n\n\t\t\tcount ++;\n\t\t}\n\t}\n\n\t/**\n\t * @method private\n\t * @name _fitImage\n\t * @description Calculates target image size\n\t */\n\tfunction _fitImage() {\n\t\tvar height = (!data.isMobile) ? data.viewportHeight : data.containerHeight - data.metaHeight,\n\t\t\t\twidth = (!data.isMobile) ? data.viewportWidth : data.containerWidth;\n\n\t\tif (data.isWide) {\n\t\t\t//WIDE\n\t\t\tdata.targetImageWidth = width;\n\t\t\tdata.targetImageHeight = data.targetImageWidth * data.ratioHorizontal;\n\n\t\t\tif (data.targetImageHeight > height) {\n\t\t\t\tdata.targetImageHeight = height;\n\t\t\t\tdata.targetImageWidth = data.targetImageHeight * data.ratioVertical;\n\t\t\t}\n\t\t} else {\n\t\t\t//TALL\n\t\t\tdata.targetImageHeight = height;\n\t\t\tdata.targetImageWidth = data.targetImageHeight * data.ratioVertical;\n\n\t\t\tif (data.targetImageWidth > width) {\n\t\t\t\tdata.targetImageWidth = width;\n\t\t\t\tdata.targetImageHeight = data.targetImageWidth * data.ratioHorizontal;\n\t\t\t}\n\t\t}\n\n\t\t// MAX\n\t\tif (data.targetImageWidth > data.imageWidth || data.targetImageHeight > data.imageHeight) {\n\t\t\tdata.targetImageHeight = data.imageHeight;\n\t\t\tdata.targetImageWidth = data.imageWidth;\n\t\t}\n\n\t\t// MIN\n\t\tif (data.targetImageWidth < data.minWidth || data.targetImageHeight < data.minHeight) {\n\t\t\tif (data.targetImageWidth < data.minWidth) {\n\t\t\t\tdata.targetImageWidth = data.minWidth;\n\t\t\t\tdata.targetImageHeight = data.targetImageWidth * data.ratioHorizontal;\n\t\t\t} else {\n\t\t\t\tdata.targetImageHeight = data.minHeight;\n\t\t\t\tdata.targetImageWidth = data.targetImageHeight * data.ratioVertical;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @method private\n\t * @name _loadVideo\n\t * @description Loads source video\n\t * @param source [string] \"Source video URL\"\n\t */\n\tfunction _loadVideo(source) {\n\t\tdata.$videoWrapper = $('
');\n\t\tdata.$video = $('