{"version":3,"sources":["wwwroot/scripts/youli.updateimagedialog.js","wwwroot/scripts/youli.common.s3fileupload.js","wwwroot/scripts/vendor/imagesloaded.pkgd.js","wwwroot/scripts/vendor/masonry.pkgd.js"],"names":["$","fn","updateImageDialog","options","self","this","settings","extend","HiddenValueSelector","HiddenCropToTopSelector","ImageFieldSelector","SuccessHandler","undefined","S3RefreshURL","CropCurrentImage","CropType","TargetImageFieldWidth","TargetImageFieldHeight","ModalImageFieldWidth","ModalImageFieldHeight","IncludeUnsplash","HelpTipMessage","ShowCropToFitCheckbox","CropToFitHoverText","ValidFileTypes","unsplashClientId","$grid","UploadSuccess","data","textStatus","xhr","find","attr","YouLi","Common","Utils","AddParametersToURL","encodeURIComponent","S3FileUpload","NewFileKey","removeClass","addClass","val","UploadError","ajaxOptions","thrownError","status","uploadAttemptsCount","ajax","url","type","dataType","contentType","complete","response","responseJSON","success","UI","ShowStandardDialog","KeyPrefix","newKeyPrefix","newUUID","Uuid","Policy","policy","PolicySignature","policySignature","SingleFileSelected","document","querySelector","UploadComplete","alert","HideButtonLoading","UpdateImagesFromUnsplash","searchTerm","hide","show","get","XMLHttpRequest","list","each","masonry","fadeOut","length","AppendUnsplashImage","imagesLoaded","progress","fadeIn","results","image","target","newImageContainer","class","newImage","src","urls","thumb","raw","links","download_location","newGridItem","appendTo","newAttribution","html","user","name","append","SelectionDone","selectedImageURL","selectedImageDownloadLocation","trigger","existingImageNewURL","startsWith","cropToFit","is","RefreshImagePreview","modal","lastSearchTerm","previewImageSelector","cropTargetPreview","addWithCrop","targetSelectedImage","RefreshImagePreviewInsidePopup","Init","text","css","width","height","off","on","cslide","itemSelector","columnWidth","percentPosition","prop","toLowerCase","e","files","ShowButtonLoading","event","keyCode","popover","jQuery","UploadFile","element","overrideSuccessHandler","overrideErrorHandler","overrideCompleteHandler","overrideProgressHandler","listElement","redirect","FormData","SuccessURL","dataString","selectedFile","ACL","MimeType","GetFileExtension","AccessKey","dataset","uploadType","UploadUrl","passedInElement","myXhr","ajaxSettings","upload","addEventListener","progressHandler","eval","successHandler","error","errorHandler","completeHandler","cache","processData","statusCode","FileTypeDescription","MaxFileSize","validFileTypes","size","Validation","IsValidFileType","lengthComputable","percentComplete","Math","round","loaded","total","global","factory","define","amd","module","exports","EvEmitter","window","proto","prototype","eventName","listener","events","_events","listeners","indexOf","push","once","onceEvents","_onceEvents","index","splice","emitEvent","args","i","onceListeners","isOnce","apply","allOff","removeAllListeners","require","console","a","b","ImagesLoaded","elem","onAlways","querySelectorAll","elements","obj","ary","Array","isArray","makeArray","getImages","jqDeferred","Deferred","setTimeout","check","bind","Object","create","images","forEach","addElementImages","nodeName","addImage","background","addElementBackgroundImages","nodeType","elementNodeTypes","childImgs","img","children","child","1","9","11","LoadingImage","Background","Image","style","getComputedStyle","reURL","matches","exec","backgroundImage","addBackground","loadingImage","_this","onProgress","message","progressedCount","hasAnyBroken","isLoaded","notify","debug","log","isComplete","jqMethod","getIsImageComplete","confirm","naturalWidth","proxyImage","handleEvent","method","onload","unbindEvents","onerror","removeEventListener","makeJQueryPlugin","callback","promise","jQueryBridget","arraySlice","slice","logError","namespace","PluginClass","option","opts","isPlainObject","arg0","$elems","methodName","returnValue","pluginMethodStr","instance","charAt","value","methodCall","call","arguments","_init","updateJQuery","bridget","getSize","getStyleSize","num","parseFloat","isNaN","measurements","measurementsLength","getStyle","isBoxSizeOuter","isSetup","div","createElement","padding","borderStyle","borderWidth","boxSizing","body","documentElement","appendChild","removeChild","setup","display","innerWidth","innerHeight","outerWidth","outerHeight","getZeroSize","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesSelector","matchesMethod","ElemProto","Element","prefixes","selector","fizzyUIUtils","utils","modulo","removeFrom","getParent","parentNode","getQueryElement","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","threshold","timeoutName","timeout","clearTimeout","docReady","readyState","toDashed","str","replace","match","$1","$2","htmlInit","WidgetClass","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","getAttribute","JSON","parse","className","Outlayer","Item","docElemStyle","transitionProperty","transition","transformProperty","transform","transitionEndEvent","WebkitTransition","vendorProperties","transitionDuration","transitionDelay","layout","position","x","y","_create","constructor","_transn","ingProperties","clean","onEnd","elemStyle","getPosition","isOriginLeft","_getOption","isOriginTop","xValue","yValue","layoutSize","parseInt","layoutPosition","xPadding","xProperty","xResetProperty","getXValue","yPadding","yProperty","yResetProperty","getYValue","isHorizontal","_transitionTo","curX","curY","compareX","compareY","didNotMove","setPosition","isTransitioning","transX","transY","transitionStyle","getTranslate","to","onTransitionEnd","isCleaning","goTo","moveTo","_nonTransition","_removeStyles","_transition","from","enableTransition","transitionProps","duration","staggerDelay","onwebkitTransitionEnd","ontransitionend","onotransitionend","dashedVendorProperties","-webkit-transform","propertyName","isEmptyObj","disableTransition","removeTransitionStyles","cleanStyle","cleanTransitionStyle","stagger","delay","removeElem","remove","reveal","isHidden","getHideRevealTransitionEndProperty","onRevealTransitionEnd","hiddenStyle","visibleStyle","styleProperty","optionStyle","opacity","onHideTransitionEnd","destroy","left","right","top","bottom","noop","GUID","instances","queryElement","$element","defaults","id","outlayerGUID","containerStyle","initLayout","originLeft","originTop","resize","resizeContainer","subclass","Parent","SubClass","oldOption","compatOptions","horizontal","layoutInstant","reloadItems","stamps","stamp","bindResize","items","_itemize","itemElems","_filterFindItemElements","item","getItemElements","map","_resetLayout","_manageStamps","isInstant","_isLayoutInited","layoutItems","_getMeasurement","_getItemsForLayout","_layoutItems","_postLayout","filter","isIgnored","_emitCompleteOnItems","queue","_getItemLayoutPosition","isLayoutInstant","_processLayoutQueue","updateStagger","_positionItem","time","unit","mult","msUnits","getMilliseconds","_getContainerSize","_setContainerMeasure","measure","isWidth","elemSize","max","onComplete","dispatchEvent","count","doneCount","tick","emitArgs","$event","Event","ignore","getItem","unignore","_find","unstamp","_getBoundingRect","_manageStamp","boundingRect","getBoundingClientRect","_boundingRect","_getElementOffset","thisRect","isResizeBound","unbindResize","onresize","needsResizeLayout","addItems","appended","prepended","previousItems","revealItemElements","getItems","hideItemElements","removeItems","removeData","Layout","ms","s","Masonry","fitWidth","measureColumns","colYs","cols","maxY","horizontalColIndex","getContainerWidth","firstItem","firstItemElem","containerWidth","gutter","excess","container","remainder","colSpan","min","colPosition","horizontalOrder","col","setHeight","setMax","_getTopColPosition","colGroup","_getTopColGroup","minimumY","groupCount","_getColGroupY","groupColYs","_getHorizontalColPosition","hasSize","stampSize","offset","firstX","lastX","firstCol","floor","lastCol","stampMaxY","_getContainerFitWidth","unusedCols","previousWidth"],"mappings":"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","file":"site-updateimagedialog.min.js","sourcesContent":["(function ($) {\r\n\r\n $.fn.updateImageDialog = function (options) {\r\n var self = $(this);\r\n\r\n var settings = $.extend({\r\n HiddenValueSelector: \"#ImageURL\",\r\n HiddenCropToTopSelector: \"\",\r\n ImageFieldSelector: \".edit-form-image\",\r\n SuccessHandler: undefined,\r\n S3RefreshURL: \"\",\r\n CropCurrentImage: true,\r\n CropType: \"entropy\",\r\n TargetImageFieldWidth: 100,\r\n TargetImageFieldHeight: 100,\r\n ModalImageFieldWidth: 100,\r\n ModalImageFieldHeight: 100,\r\n IncludeUnsplash: true,\r\n HelpTipMessage: \"\",\r\n ShowCropToFitCheckbox: false,\r\n CropToFitHoverText: \"\",\r\n ValidFileTypes: undefined\r\n }, options);\r\n \r\n var unsplashClientId = \"65f64eeaa6d3a0b53537d09fd977ac2bb484db2d8065e9c9c4ffa6617bc82e1b\";\r\n\r\n var $grid = null;\r\n\r\n self.uploadAttemptsCount = 0;\r\n\r\n function UploadSuccess(data, textStatus, xhr) {\r\n\r\n self.find(\"#CurrentImage\").attr(\"src\", YouLi.Common.Utils.AddParametersToURL(\"https://ylt-images.imgix.net/\" + encodeURIComponent(YouLi.Common.S3FileUpload.NewFileKey), \"fit=crop&crop=\" + settings.CropType + (settings.ModalImageFieldHeight == \"auto\" ? \"\" : \"&h=\" + settings.ModalImageFieldHeight) + \"&w=\" + settings.ModalImageFieldWidth));\r\n\r\n self.find(\".thumbnail-image-selectable.selected\").removeClass(\"selected\");\r\n self.find(\"#CurrentImage\").addClass(\"selected\").removeClass(\"hidden\").attr(\"data-imageurl\", encodeURIComponent(YouLi.Common.S3FileUpload.NewFileKey));\r\n\r\n self.find(\"#file\").val(\"\"); /* clear file selection to allow the same file to be selected again and trigger upload */\r\n\r\n // Nb: loading button will be cleared when new image is loaded\r\n }\r\n\r\n function UploadError(xhr, ajaxOptions, thrownError) {\r\n\r\n if (xhr.status == 403 && self.uploadAttemptsCount == 0) {\r\n // forbidden - try to refresh policy\r\n $.ajax({\r\n url: settings.S3RefreshURL,\r\n type: \"GET\",\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n complete: function (response) {\r\n if (response.status != 200 || (response.responseJSON != undefined && response.responseJSON.success == false)) {\r\n YouLi.Common.UI.ShowStandardDialog(\"An error occurred. Please refresh the page to try again.\");\r\n }\r\n else {\r\n YouLi.Common.S3FileUpload.KeyPrefix = response.responseJSON.newKeyPrefix + response.responseJSON.newUUID;\r\n YouLi.Common.S3FileUpload.Uuid = response.responseJSON.newUUID;\r\n YouLi.Common.S3FileUpload.Policy = response.responseJSON.policy;\r\n YouLi.Common.S3FileUpload.PolicySignature = response.responseJSON.policySignature;\r\n\r\n // retry upload\r\n self.uploadAttemptsCount++;\r\n YouLi.Common.S3FileUpload.SingleFileSelected(document.querySelector(\".edit-image-modal input[type='file']\"), settings.ValidFileTypes, UploadSuccess, UploadError, UploadComplete);\r\n }\r\n }\r\n\r\n });\r\n }\r\n else {\r\n alert(\"There was an error attempting to upload the file. (\" + thrownError + \")\");\r\n self.uploadAttemptsCount++;\r\n self.find(\"#file\").val(\"\"); /* clear file selection to allow the same file to be selected again and trigger upload */\r\n YouLi.Common.UI.HideButtonLoading(self.find(\".btn-done\"));\r\n }\r\n }\r\n\r\n function UploadComplete(data, textStatus, xhr) {\r\n }\r\n\r\n function UpdateImagesFromUnsplash(searchTerm) {\r\n\r\n var url = \"\";\r\n\r\n self.find(\"#UnsplashImages\").hide();\r\n self.find(\"#UnsplashImagesNone\").hide();\r\n self.find(\"#UnsplashImagesLoader\").show();\r\n\r\n if (searchTerm === undefined) {\r\n // get the YouLiveToTravel user's images\r\n $.get(\"https://api.unsplash.com/collections/1347059/photos?client_id=\" + unsplashClientId + \"&page=1&per_page=20\", function (response, textStatus, XMLHttpRequest) {\r\n var list = self.find(\"#UnsplashImages\");\r\n\r\n self.find(\"#UnsplashImages .grid-item\").each(function () {\r\n $grid.masonry('remove', this);\r\n });\r\n\r\n self.find(\"#UnsplashImagesLoader\").fadeOut(function () {\r\n\r\n if (response.length > 0) {\r\n self.find(\"#UnsplashImages\").show();\r\n\r\n $.each(response, function () {\r\n AppendUnsplashImage(this, list);\r\n });\r\n\r\n $grid.imagesLoaded().progress(function () {\r\n $grid.masonry('layout');\r\n });\r\n }\r\n else {\r\n self.find(\"#UnsplashImagesNone\").fadeIn();\r\n }\r\n });\r\n\r\n });\r\n }\r\n else {\r\n // Search using search term\r\n $.get(\"https://api.unsplash.com/search/photos?client_id=\" + unsplashClientId + \"&page=1&per_page=20&query=\" + searchTerm, function (response, textStatus, XMLHttpRequest) {\r\n var list = self.find(\"#UnsplashImages\");\r\n\r\n self.find(\"#UnsplashImages .grid-item\").each(function () {\r\n $grid.masonry('remove', this);\r\n });\r\n\r\n self.find(\"#UnsplashImagesLoader\").fadeOut(function () {\r\n\r\n if (response.results.length > 0) {\r\n self.find(\"#UnsplashImages\").show();\r\n\r\n $.each(response.results, function () {\r\n AppendUnsplashImage(this, list);\r\n });\r\n\r\n $grid.imagesLoaded().progress(function () {\r\n $grid.masonry('layout');\r\n });\r\n }\r\n else {\r\n self.find(\"#UnsplashImagesNone\").fadeIn();\r\n }\r\n\r\n });\r\n\r\n });\r\n }\r\n\r\n }\r\n\r\n function AppendUnsplashImage(image, target) {\r\n newImageContainer = $('
', {\r\n class: \"grid-item-image-container\"\r\n });\r\n\r\n newImage = $('', {\r\n src: image.urls.thumb,\r\n class: \"img-responsive thumbnail-image-selectable\",\r\n });\r\n newImage.attr(\"data-imageurl\", image.urls.raw);\r\n newImage.attr(\"data-source\", \"unsplash\");\r\n newImage.attr(\"data-download-link\", image.links.download_location + \"?client_id=\" + unsplashClientId);\r\n\r\n newGridItem = $('
', {\r\n class: 'grid-item col-xs-6 col-sm-4',\r\n });\r\n newImage.appendTo(newImageContainer);\r\n\r\n newAttribution = $('
', {\r\n class: \"unsplash-attribution hidden-xs\",\r\n });\r\n newAttribution.html(\"\");\r\n newAttribution.appendTo(newImageContainer);\r\n\r\n newImageContainer.appendTo(newGridItem);\r\n\r\n target.append(newGridItem).masonry('appended', newGridItem);\r\n }\r\n\r\n\r\n function SelectionDone() {\r\n \r\n var selectedImageURL = self.find(\"img.selected\").attr(\"data-imageurl\");\r\n var selectedImageDownloadLocation = self.find(\"img.selected\").attr(\"data-download-link\");\r\n $(settings.HiddenValueSelector).val(selectedImageURL).trigger(\"change\");\r\n var existingImageNewURL = selectedImageURL;\r\n\r\n var isFullImageURL = self.find(\".thumbnail-image-selectable.selected\").attr(\"data-source\") == \"unsplash\" || selectedImageURL.startsWith(\"http\");\r\n if (!isFullImageURL) {\r\n existingImageNewURL = \"https://ylt-images.imgix.net/\" + selectedImageURL;\r\n }\r\n\r\n if (settings.ShowCropToFitCheckbox) {\r\n var cropToFit = self.find(\"#ImageCheckboxCropToFit\").is(\":checked\");\r\n $(settings.HiddenCropToTopSelector).val(cropToFit);\r\n }\r\n\r\n RefreshImagePreview(settings.ImageFieldSelector, settings.CropCurrentImage, false);\r\n\r\n // prepare for next time the dialog gets loaded\r\n self.find(\".existing-image\").attr(\"src\", YouLi.Common.Utils.AddParametersToURL(existingImageNewURL, \"fit=crop&crop=\" + settings.CropType + (settings.ModalImageFieldHeight == \"auto\" ? \"\" : \"&h=\" + settings.ModalImageFieldHeight) + \"&w=\" + settings.ModalImageFieldWidth));\r\n self.find(\".existing-image\").attr(\"data-imageurl\", existingImageNewURL);\r\n\r\n // Trigger Unsplash download location\r\n $.get(selectedImageDownloadLocation);\r\n\r\n if (settings.SuccessHandler !== undefined) {\r\n settings.SuccessHandler();\r\n }\r\n\r\n // YOULI-1776 if the following modal hide is done before the above success handler call, the removal of the modal-open class sometimes isn't triggered (the modal backdrop callback function isn't triggered), so let's just\r\n // do it after that line. The reason appears to be because the success handler for avatar saving shows and hides the backdrop in itself.\r\n self.modal(\"hide\");\r\n }\r\n\r\n var lastSearchTerm = \"\";\r\n\r\n function RefreshImagePreview(previewImageSelector, cropTargetPreview, addWithCrop) {\r\n\r\n //This function will refresh image preview either inside the popup or the target image outside the popup based on parameters passed\r\n var selectedImageURL = self.find(\"img.selected\").attr(\"data-imageurl\");\r\n\r\n var targetSelectedImage = selectedImageURL;\r\n\r\n var isFullImageURL = self.find(\".thumbnail-image-selectable.selected\").attr(\"data-source\") == \"unsplash\" || selectedImageURL.startsWith(\"http\");\r\n \r\n if (!isFullImageURL) {\r\n if (cropTargetPreview) {\r\n targetSelectedImage = YouLi.Common.Utils.AddParametersToURL(\"https://ylt-images.imgix.net/\" + selectedImageURL, \"fit=crop&crop=\" + settings.CropType + (settings.TargetImageFieldHeight == \"auto\" ? \"\" : \"&h=\" + settings.TargetImageFieldHeight + \"&w=\" + settings.TargetImageFieldWidth));\r\n }\r\n else {\r\n targetSelectedImage = \"https://ylt-images.imgix.net/\" + selectedImageURL;\r\n if (addWithCrop) { // will add width crop even if the crop to fit is not checked for the image embeded in popup\r\n targetSelectedImage = YouLi.Common.Utils.AddParametersToURL(\"https://ylt-images.imgix.net/\" + selectedImageURL, \"fit=crop&crop=\" + settings.CropType + \"&w=\" + settings.TargetImageFieldWidth);\r\n }\r\n }\r\n }\r\n\r\n else {\r\n if (cropTargetPreview) {\r\n targetSelectedImage = YouLi.Common.Utils.AddParametersToURL(targetSelectedImage, \"ixlib=rb-0.3.5&q=80&fm=jpg&crop=\" + settings.CropType + \"&cs=tinysrgb\" + (settings.TargetImageFieldHeight == \"auto\" ? \"\" : \"&h=\" + settings.TargetImageFieldHeight + \"&w=\" + settings.TargetImageFieldWidth + \"&fit=crop\"));\r\n }\r\n else {\r\n targetSelectedImage = YouLi.Common.Utils.AddParametersToURL(targetSelectedImage, \"ixlib=rb-0.3.5&q=80&fm=jpg&crop=\" + settings.CropType + \"&cs=tinysrgb&w=1080&fit=max\"); // reduce down the size for display\r\n if (addWithCrop) {\r\n targetSelectedImage = YouLi.Common.Utils.AddParametersToURL(targetSelectedImage, \"ixlib=rb-0.3.5&q=80&fm=jpg&crop=\" + settings.CropType + \"&cs=tinysrgb&w=1080&fit=max\" + \"&w=\" + settings.TargetImageFieldWidth);\r\n }\r\n }\r\n }\r\n\r\n $(previewImageSelector).attr(\"src\", targetSelectedImage);\r\n }\r\n\r\n function RefreshImagePreviewInsidePopup() {\r\n if (settings.ShowCropToFitCheckbox) {\r\n var cropToFit = self.find(\"#ImageCheckboxCropToFit\").is(\":checked\");\r\n RefreshImagePreview(self.find(\".existing-image\"), cropToFit, true);\r\n }\r\n }\r\n\r\n $(function () {\r\n YouLi.Common.UI.Init();\r\n\r\n if (settings.ShowCropToFitCheckbox) {\r\n //$('.update-image-crop-check').append(\"
\")\r\n self.find('.update-image-crop-check').removeClass('hidden')\r\n } else {\r\n //$('.update-image-crop-check').remove('.control--checkbox')\r\n self.find('.update-image-crop-check').addClass('hidden')\r\n }\r\n\r\n if (!settings.IncludeUnsplash) {\r\n self.find(\"#SearchPhotos\").addClass(\"hidden\");\r\n }\r\n\r\n if (settings.HelpTipMessage !== \"\") {\r\n self.find(\"#UploadImageHelpText\").removeClass(\"hidden\").find(\".helper-box-text\").text(settings.HelpTipMessage);\r\n }\r\n\r\n // Initialise size of current image\r\n self.find(\".edit-image-modal .thumbnail-image\").css({\r\n \"width\": settings.ModalImageFieldWidth,\r\n \"height\": settings.ModalImageFieldHeight\r\n });\r\n\r\n self.off(\"show.bs.modal\").on(\"show.bs.modal\", function () {\r\n self.find(\".thumbnail-image-selectable.selected\").removeClass(\"selected\");\r\n self.find(\".existing-image\").addClass(\"selected\"); // initially select existing image\r\n self.find(\"#edit-image-modal-content\").cslide();\r\n\r\n self.find(\"#SearchTerm\").val(\"\");\r\n\r\n self.find(\"#CurrentImage\").off(\"load\").on(\"load\", function () {\r\n $(this).removeClass(\"hidden\");\r\n YouLi.Common.UI.HideButtonLoading(self.find(\".btn-done\"));\r\n });\r\n\r\n $grid = self.find('.grid').masonry({\r\n itemSelector: '.grid-item', // use a separate class for itemSelector, other than .col-\r\n columnWidth: '.grid-sizer',\r\n percentPosition: true\r\n });\r\n\r\n UpdateImagesFromUnsplash();\r\n self.find('.grid').masonry('layout');\r\n\r\n lastSearchTerm = \"\";\r\n\r\n });\r\n\r\n // YOULI-1776 the removal of the modal-open class isn't being triggered sometimes (the modal backdrop callback function isn't triggered), so let's just\r\n // clear it here.\r\n self.off(\"hide.bs.modal\").on(\"hide.bs.modal\", function () {\r\n $(\"body\").removeClass('modal-open');\r\n });\r\n\r\n self.off('shown.bs.modal').on('shown.bs.modal', function () {\r\n if ($(settings.HiddenCropToTopSelector).val()) {\r\n self.find(\"#ImageCheckboxCropToFit\").prop('checked', $(settings.HiddenCropToTopSelector).val().toLowerCase() === 'true');\r\n RefreshImagePreviewInsidePopup();\r\n }\r\n });\r\n\r\n self.off(\"change\", \".edit-image-modal input[type='file']\").on(\"change\", \".edit-image-modal input[type='file']\", function (e) {\r\n if (this.files.length >= 1) {\r\n YouLi.Common.UI.ShowButtonLoading(self.find(\".btn-done\"));\r\n\r\n // Get a fresh S3 policy every time (so a user can upload the same file more than once, e.g. after changing it on their computer)\r\n $.ajax({\r\n url: settings.S3RefreshURL,\r\n type: \"GET\",\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n complete: function (response) {\r\n if (response.status != 200 || (response.responseJSON != undefined && response.responseJSON.success == false)) {\r\n YouLi.Common.UI.ShowStandardDialog(\"An error occurred. Please refresh the page to try again.\");\r\n }\r\n else {\r\n YouLi.Common.S3FileUpload.KeyPrefix = response.responseJSON.newKeyPrefix + response.responseJSON.newUUID;\r\n YouLi.Common.S3FileUpload.Uuid = response.responseJSON.newUUID;\r\n YouLi.Common.S3FileUpload.Policy = response.responseJSON.policy;\r\n YouLi.Common.S3FileUpload.PolicySignature = response.responseJSON.policySignature;\r\n\r\n self.uploadAttemptsCount = 0;\r\n\r\n if (!YouLi.Common.S3FileUpload.SingleFileSelected(e.target, settings.ValidFileTypes, UploadSuccess, UploadError, UploadComplete)) {\r\n YouLi.Common.UI.HideButtonLoading(self.find(\".btn-done\"));\r\n }\r\n }\r\n }\r\n\r\n });\r\n }\r\n });\r\n\r\n self.off(\"blur\", \"#SearchTerm\").on(\"blur\", \"#SearchTerm\", function () {\r\n\r\n // run search IF it hasn't already been run for this search term\r\n if (lastSearchTerm != $(this).val()) {\r\n UpdateImagesFromUnsplash($(this).val());\r\n lastSearchTerm = $(this).val();\r\n }\r\n });\r\n\r\n self.off(\"keyup\", \"#SearchTerm\").on(\"keyup\", \"#SearchTerm\", function (event) {\r\n if (event.keyCode == 13) {\r\n // run search IF it hasn't already been run for this search term\r\n if (lastSearchTerm != $(this).val()) {\r\n UpdateImagesFromUnsplash($(this).val());\r\n lastSearchTerm = $(this).val();\r\n }\r\n }\r\n });\r\n\r\n self.off(\"click\", \".thumbnail-image-selectable\").on(\"click\", \".thumbnail-image-selectable\", function () {\r\n self.find(\".thumbnail-image-selectable.selected\").removeClass(\"selected\")\r\n $(this).addClass(\"selected\");\r\n });\r\n\r\n self.off(\"click\", \".edit-image-modal-footer .btn-done\").on(\"click\", \".edit-image-modal-footer .btn-done\", function () {\r\n SelectionDone();\r\n });\r\n\r\n self.off(\"dblclick\", \".edit-image-modal .thumbnail-image-selectable\").on(\"dblclick\", \".edit-image-modal .thumbnail-image-selectable\", function () {\r\n SelectionDone();\r\n });\r\n\r\n self.off(\"change\", \"#ImageCheckboxCropToFit\").on(\"change\", \"#ImageCheckboxCropToFit\", function () {\r\n RefreshImagePreviewInsidePopup();\r\n });\r\n\r\n if (settings.CropToFitHoverText) {\r\n $(\".update-image-crop-check\")\r\n .attr(\"data-toggle\", \"popover\")\r\n .attr(\"data-container\", \"body\")\r\n .attr(\"data-placement\", \"bottom\")\r\n .attr(\"data-trigger\", \"hover\")\r\n .attr(\"data-content\", settings.CropToFitHoverText)\r\n .popover();\r\n }\r\n });\r\n\r\n return this;\r\n };\r\n\r\n}(jQuery));","var YouLi = YouLi ? YouLi : {};\r\nYouLi.Common = YouLi.Common ? YouLi.Common : {};\r\nYouLi.Common.S3FileUpload = YouLi.Common.S3FileUpload ? YouLi.Common.S3FileUpload : {};\r\n\r\n(function (YouLi) {\r\n (function (Common) {\r\n (function (S3FileUpload) {\r\n\r\n YouLi.Common.S3FileUpload.UploadUrl = \"\";\r\n YouLi.Common.S3FileUpload.SuccessURL = \"\";\r\n YouLi.Common.S3FileUpload.KeyPrefix = \"\";\r\n YouLi.Common.S3FileUpload.ACL = \"\";\r\n YouLi.Common.S3FileUpload.Uuid = \"\";\r\n YouLi.Common.S3FileUpload.AccessKey = \"\";\r\n YouLi.Common.S3FileUpload.Policy = \"\";\r\n YouLi.Common.S3FileUpload.PolicySignature = \"\";\r\n YouLi.Common.S3FileUpload.NewFileKey = \"\";\r\n\r\n // defaults\r\n YouLi.Common.S3FileUpload.FileTypeDescription = \"image\";\r\n YouLi.Common.S3FileUpload.MaxFileSize = 8000000;\r\n YouLi.Common.S3FileUpload.ValidFileTypes = [\"image/gif\", \"image/jpeg\", \"image/png\", \"image/ico\", \"image/x-icon\"];\r\n\r\n YouLi.Common.S3FileUpload.SingleFileSelected = function (element, validFileTypes, overrideSuccessHandler, overrideErrorHandler, overrideCompleteHandler, overrideProgressHandler, listElement) {\r\n \r\n var selectedFile = element.files[0];\r\n\r\n if (!validFileTypes) {\r\n validFileTypes = YouLi.Common.S3FileUpload.ValidFileTypes; // use default if not provided\r\n }\r\n\r\n if (selectedFile) {\r\n \r\n if (selectedFile.size > YouLi.Common.S3FileUpload.MaxFileSize)\r\n {\r\n alert(\"File must be max \" + (YouLi.Common.S3FileUpload.MaxFileSize / 1000000) + \"MB in size\");\r\n return false;\r\n }\r\n else if (!YouLi.Validation.IsValidFileType(selectedFile, validFileTypes))\r\n {\r\n alert(\"File must be a valid \" + YouLi.Common.S3FileUpload.FileTypeDescription);\r\n return false;\r\n }\r\n\r\n UploadFile(element, overrideSuccessHandler, overrideErrorHandler, overrideCompleteHandler, overrideProgressHandler, listElement);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function UploadFile(element, overrideSuccessHandler, overrideErrorHandler, overrideCompleteHandler, overrideProgressHandler, listElement) {\r\n\r\n var redirect = \"\";\r\n\r\n if (typeof FormData === \"undefined\") {\r\n // Redirect to an empty page is required for IE < 10\r\n redirect = YouLi.Common.S3FileUpload.SuccessURL;\r\n }\r\n\r\n var dataString = new FormData();\r\n\r\n var selectedFile = element.files[0];\r\n\r\n YouLi.Common.S3FileUpload.NewFileKey = YouLi.Common.S3FileUpload.KeyPrefix + selectedFile.name;\r\n\r\n dataString.append(\"key\", YouLi.Common.S3FileUpload.NewFileKey);\r\n dataString.append(\"acl\", YouLi.Common.S3FileUpload.ACL);\r\n dataString.append(\"Content-Type\", YouLi.Common.Utils.MimeType(YouLi.Common.Utils.GetFileExtension(selectedFile.name)));\r\n dataString.append(\"x-amz-meta-uuid\", YouLi.Common.S3FileUpload.Uuid);\r\n dataString.append(\"AWSAccessKeyId\", YouLi.Common.S3FileUpload.AccessKey);\r\n dataString.append(\"Policy\", YouLi.Common.S3FileUpload.Policy);\r\n dataString.append(\"Signature\", YouLi.Common.S3FileUpload.PolicySignature);\r\n dataString.append(\"success_action_redirect\", redirect);\r\n dataString.append('file', selectedFile);\r\n\r\n if (element.dataset.uploadType != \"avatar\") {\r\n if (listElement !== undefined) {\r\n $(listElement).find(\"#FileProgress\").css(\"width\", '0%').attr('aria-valuenow', 0);\r\n $(listElement).find(\".progress\").removeClass(\"hidden\");\r\n }\r\n else {\r\n $(\"#FileProgress\").css(\"width\", '0%').attr('aria-valuenow', 0);\r\n $(\".progress\").removeClass(\"hidden\");\r\n }\r\n }\r\n\r\n $.ajax({\r\n url: YouLi.Common.S3FileUpload.UploadUrl,\r\n type: 'POST',\r\n xhr: function () { // Custom XMLHttpRequest\r\n var myXhr = $.ajaxSettings.xhr();\r\n if (myXhr.upload) { // Check if upload property exists\r\n myXhr.upload.addEventListener('progress', (function (passedInElement) {\r\n return function (e) { overrideProgressHandler !== undefined ? overrideProgressHandler(e, passedInElement) : progressHandler(e, passedInElement); };\r\n })(listElement), false); // For handling the progress of the upload\r\n }\r\n return myXhr;\r\n },\r\n //Ajax events\r\n success: function (data, textStatus, xhr) {\r\n if (overrideSuccessHandler !== undefined) {\r\n eval(overrideSuccessHandler(data, textStatus, xhr, listElement));\r\n }\r\n else {\r\n successHandler(data, textStatus, xhr);\r\n }\r\n },\r\n error: overrideErrorHandler !== undefined ? overrideErrorHandler : errorHandler,\r\n complete: function (data, textStatus, xhr) {\r\n if (overrideCompleteHandler !== undefined) {\r\n eval(overrideCompleteHandler(data, textStatus, xhr, listElement));\r\n }\r\n else {\r\n completeHandler(data, textStatus, xhr);\r\n }\r\n },\r\n // Form data\r\n data: dataString,\r\n //Options to tell jQuery not to process data or worry about content-type.\r\n cache: false,\r\n contentType: false,\r\n processData: false\r\n }).addEventListener;\r\n }\r\n\r\n progressHandler = function (e) {\r\n if (e.lengthComputable) {\r\n var percentComplete = Math.round(e.loaded * 100 / e.total);\r\n $(\"#FileProgress\").css(\"width\", percentComplete + '%').attr('aria-valuenow', percentComplete);\r\n $('#FileProgress span').text(percentComplete + \"%\");\r\n }\r\n else {\r\n $('#FileProgress span').text('unable to compute');\r\n }\r\n }\r\n\r\n function completeHandler() {\r\n $(\".progress\").addClass(\"hidden\");\r\n }\r\n\r\n function successHandler(data) {\r\n if (data && data.statusCode == 200) {\r\n alert(\"Success\");\r\n }\r\n }\r\n\r\n function errorHandler(xhr, ajaxOptions, thrownError) {\r\n alert(\"There was an error attempting to upload the file. (\" + thrownError + \")\");\r\n }\r\n\r\n }(YouLi.Common.S3FileUpload ? YouLi.Common.S3FileUpload : {}));\r\n }(YouLi.Common ? YouLi.Common : {}));\r\n}(YouLi ? YouLi : {}));","/*!\r\n * imagesLoaded PACKAGED v4.1.3\r\n * JavaScript is all like \"You images are done yet or what?\"\r\n * MIT License\r\n */\r\n\r\n/**\r\n * EvEmitter v1.1.0\r\n * Lil' event emitter\r\n * MIT License\r\n */\r\n\r\n/* jshint unused: true, undef: true, strict: true */\r\n\r\n( function( global, factory ) {\r\n // universal module definition\r\n /* jshint strict: false */ /* globals define, module, window */\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD - RequireJS\r\n define( 'ev-emitter/ev-emitter',factory );\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS - Browserify, Webpack\r\n module.exports = factory();\r\n } else {\r\n // Browser globals\r\n global.EvEmitter = factory();\r\n }\r\n\r\n}( typeof window != 'undefined' ? window : this, function() {\r\n\r\n\r\n\r\nfunction EvEmitter() {}\r\n\r\nvar proto = EvEmitter.prototype;\r\n\r\nproto.on = function( eventName, listener ) {\r\n if ( !eventName || !listener ) {\r\n return;\r\n }\r\n // set events hash\r\n var events = this._events = this._events || {};\r\n // set listeners array\r\n var listeners = events[ eventName ] = events[ eventName ] || [];\r\n // only add once\r\n if ( listeners.indexOf( listener ) == -1 ) {\r\n listeners.push( listener );\r\n }\r\n\r\n return this;\r\n};\r\n\r\nproto.once = function( eventName, listener ) {\r\n if ( !eventName || !listener ) {\r\n return;\r\n }\r\n // add event\r\n this.on( eventName, listener );\r\n // set once flag\r\n // set onceEvents hash\r\n var onceEvents = this._onceEvents = this._onceEvents || {};\r\n // set onceListeners object\r\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\r\n // set flag\r\n onceListeners[ listener ] = true;\r\n\r\n return this;\r\n};\r\n\r\nproto.off = function( eventName, listener ) {\r\n var listeners = this._events && this._events[ eventName ];\r\n if ( !listeners || !listeners.length ) {\r\n return;\r\n }\r\n var index = listeners.indexOf( listener );\r\n if ( index != -1 ) {\r\n listeners.splice( index, 1 );\r\n }\r\n\r\n return this;\r\n};\r\n\r\nproto.emitEvent = function( eventName, args ) {\r\n var listeners = this._events && this._events[ eventName ];\r\n if ( !listeners || !listeners.length ) {\r\n return;\r\n }\r\n var i = 0;\r\n var listener = listeners[i];\r\n args = args || [];\r\n // once stuff\r\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\r\n\r\n while ( listener ) {\r\n var isOnce = onceListeners && onceListeners[ listener ];\r\n if ( isOnce ) {\r\n // remove listener\r\n // remove before trigger to prevent recursion\r\n this.off( eventName, listener );\r\n // unset once flag\r\n delete onceListeners[ listener ];\r\n }\r\n // trigger listener\r\n listener.apply( this, args );\r\n // get next listener\r\n i += isOnce ? 0 : 1;\r\n listener = listeners[i];\r\n }\r\n\r\n return this;\r\n};\r\n\r\nproto.allOff =\r\nproto.removeAllListeners = function() {\r\n delete this._events;\r\n delete this._onceEvents;\r\n};\r\n\r\nreturn EvEmitter;\r\n\r\n}));\r\n\r\n/*!\r\n * imagesLoaded v4.1.3\r\n * JavaScript is all like \"You images are done yet or what?\"\r\n * MIT License\r\n */\r\n\r\n( function( window, factory ) { 'use strict';\r\n // universal module definition\r\n\r\n /*global define: false, module: false, require: false */\r\n\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD\r\n define( [\r\n 'ev-emitter/ev-emitter'\r\n ], function( EvEmitter ) {\r\n return factory( window, EvEmitter );\r\n });\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS\r\n module.exports = factory(\r\n window,\r\n require('ev-emitter')\r\n );\r\n } else {\r\n // browser global\r\n window.imagesLoaded = factory(\r\n window,\r\n window.EvEmitter\r\n );\r\n }\r\n\r\n})( typeof window !== 'undefined' ? window : this,\r\n\r\n// -------------------------- factory -------------------------- //\r\n\r\nfunction factory( window, EvEmitter ) {\r\n\r\n\r\n\r\nvar $ = window.jQuery;\r\nvar console = window.console;\r\n\r\n// -------------------------- helpers -------------------------- //\r\n\r\n// extend objects\r\nfunction extend( a, b ) {\r\n for ( var prop in b ) {\r\n a[ prop ] = b[ prop ];\r\n }\r\n return a;\r\n}\r\n\r\n// turn element or nodeList into an array\r\nfunction makeArray( obj ) {\r\n var ary = [];\r\n if ( Array.isArray( obj ) ) {\r\n // use object if already an array\r\n ary = obj;\r\n } else if ( typeof obj.length == 'number' ) {\r\n // convert nodeList to array\r\n for ( var i=0; i < obj.length; i++ ) {\r\n ary.push( obj[i] );\r\n }\r\n } else {\r\n // array of single index\r\n ary.push( obj );\r\n }\r\n return ary;\r\n}\r\n\r\n// -------------------------- imagesLoaded -------------------------- //\r\n\r\n/**\r\n * @param {Array, Element, NodeList, String} elem\r\n * @param {Object or Function} options - if function, use as callback\r\n * @param {Function} onAlways - callback function\r\n */\r\nfunction ImagesLoaded( elem, options, onAlways ) {\r\n // coerce ImagesLoaded() without new, to be new ImagesLoaded()\r\n if ( !( this instanceof ImagesLoaded ) ) {\r\n return new ImagesLoaded( elem, options, onAlways );\r\n }\r\n // use elem as selector string\r\n if ( typeof elem == 'string' ) {\r\n elem = document.querySelectorAll( elem );\r\n }\r\n\r\n this.elements = makeArray( elem );\r\n this.options = extend( {}, this.options );\r\n\r\n if ( typeof options == 'function' ) {\r\n onAlways = options;\r\n } else {\r\n extend( this.options, options );\r\n }\r\n\r\n if ( onAlways ) {\r\n this.on( 'always', onAlways );\r\n }\r\n\r\n this.getImages();\r\n\r\n if ( $ ) {\r\n // add jQuery Deferred object\r\n this.jqDeferred = new $.Deferred();\r\n }\r\n\r\n // HACK check async to allow time to bind listeners\r\n setTimeout( function() {\r\n this.check();\r\n }.bind( this ));\r\n}\r\n\r\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\r\n\r\nImagesLoaded.prototype.options = {};\r\n\r\nImagesLoaded.prototype.getImages = function() {\r\n this.images = [];\r\n\r\n // filter & find items if we have an item selector\r\n this.elements.forEach( this.addElementImages, this );\r\n};\r\n\r\n/**\r\n * @param {Node} element\r\n */\r\nImagesLoaded.prototype.addElementImages = function( elem ) {\r\n // filter siblings\r\n if ( elem.nodeName == 'IMG' ) {\r\n this.addImage( elem );\r\n }\r\n // get background image on element\r\n if ( this.options.background === true ) {\r\n this.addElementBackgroundImages( elem );\r\n }\r\n\r\n // find children\r\n // no non-element nodes, #143\r\n var nodeType = elem.nodeType;\r\n if ( !nodeType || !elementNodeTypes[ nodeType ] ) {\r\n return;\r\n }\r\n var childImgs = elem.querySelectorAll('img');\r\n // concat childElems to filterFound array\r\n for ( var i=0; i < childImgs.length; i++ ) {\r\n var img = childImgs[i];\r\n this.addImage( img );\r\n }\r\n\r\n // get child background images\r\n if ( typeof this.options.background == 'string' ) {\r\n var children = elem.querySelectorAll( this.options.background );\r\n for ( i=0; i < children.length; i++ ) {\r\n var child = children[i];\r\n this.addElementBackgroundImages( child );\r\n }\r\n }\r\n};\r\n\r\nvar elementNodeTypes = {\r\n 1: true,\r\n 9: true,\r\n 11: true\r\n};\r\n\r\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\r\n var style = getComputedStyle( elem );\r\n if ( !style ) {\r\n // Firefox returns null if in a hidden iframe https://bugzil.la/548397\r\n return;\r\n }\r\n // get url inside url(\"...\")\r\n var reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\r\n var matches = reURL.exec( style.backgroundImage );\r\n while ( matches !== null ) {\r\n var url = matches && matches[2];\r\n if ( url ) {\r\n this.addBackground( url, elem );\r\n }\r\n matches = reURL.exec( style.backgroundImage );\r\n }\r\n};\r\n\r\n/**\r\n * @param {Image} img\r\n */\r\nImagesLoaded.prototype.addImage = function( img ) {\r\n var loadingImage = new LoadingImage( img );\r\n this.images.push( loadingImage );\r\n};\r\n\r\nImagesLoaded.prototype.addBackground = function( url, elem ) {\r\n var background = new Background( url, elem );\r\n this.images.push( background );\r\n};\r\n\r\nImagesLoaded.prototype.check = function() {\r\n var _this = this;\r\n this.progressedCount = 0;\r\n this.hasAnyBroken = false;\r\n // complete if no images\r\n if ( !this.images.length ) {\r\n this.complete();\r\n return;\r\n }\r\n\r\n function onProgress( image, elem, message ) {\r\n // HACK - Chrome triggers event before object properties have changed. #83\r\n setTimeout( function() {\r\n _this.progress( image, elem, message );\r\n });\r\n }\r\n\r\n this.images.forEach( function( loadingImage ) {\r\n loadingImage.once( 'progress', onProgress );\r\n loadingImage.check();\r\n });\r\n};\r\n\r\nImagesLoaded.prototype.progress = function( image, elem, message ) {\r\n this.progressedCount++;\r\n this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\r\n // progress event\r\n this.emitEvent( 'progress', [ this, image, elem ] );\r\n if ( this.jqDeferred && this.jqDeferred.notify ) {\r\n this.jqDeferred.notify( this, image );\r\n }\r\n // check if completed\r\n if ( this.progressedCount == this.images.length ) {\r\n this.complete();\r\n }\r\n\r\n if ( this.options.debug && console ) {\r\n console.log( 'progress: ' + message, image, elem );\r\n }\r\n};\r\n\r\nImagesLoaded.prototype.complete = function() {\r\n var eventName = this.hasAnyBroken ? 'fail' : 'done';\r\n this.isComplete = true;\r\n this.emitEvent( eventName, [ this ] );\r\n this.emitEvent( 'always', [ this ] );\r\n if ( this.jqDeferred ) {\r\n var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\r\n this.jqDeferred[ jqMethod ]( this );\r\n }\r\n};\r\n\r\n// -------------------------- -------------------------- //\r\n\r\nfunction LoadingImage( img ) {\r\n this.img = img;\r\n}\r\n\r\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\r\n\r\nLoadingImage.prototype.check = function() {\r\n // If complete is true and browser supports natural sizes,\r\n // try to check for image status manually.\r\n var isComplete = this.getIsImageComplete();\r\n if ( isComplete ) {\r\n // report based on naturalWidth\r\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\r\n return;\r\n }\r\n\r\n // If none of the checks above matched, simulate loading on detached element.\r\n this.proxyImage = new Image();\r\n this.proxyImage.addEventListener( 'load', this );\r\n this.proxyImage.addEventListener( 'error', this );\r\n // bind to image as well for Firefox. #191\r\n this.img.addEventListener( 'load', this );\r\n this.img.addEventListener( 'error', this );\r\n this.proxyImage.src = this.img.src;\r\n};\r\n\r\nLoadingImage.prototype.getIsImageComplete = function() {\r\n return this.img.complete && this.img.naturalWidth !== undefined;\r\n};\r\n\r\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\r\n this.isLoaded = isLoaded;\r\n this.emitEvent( 'progress', [ this, this.img, message ] );\r\n};\r\n\r\n// ----- events ----- //\r\n\r\n// trigger specified handler for event type\r\nLoadingImage.prototype.handleEvent = function( event ) {\r\n var method = 'on' + event.type;\r\n if ( this[ method ] ) {\r\n this[ method ]( event );\r\n }\r\n};\r\n\r\nLoadingImage.prototype.onload = function() {\r\n this.confirm( true, 'onload' );\r\n this.unbindEvents();\r\n};\r\n\r\nLoadingImage.prototype.onerror = function() {\r\n this.confirm( false, 'onerror' );\r\n this.unbindEvents();\r\n};\r\n\r\nLoadingImage.prototype.unbindEvents = function() {\r\n this.proxyImage.removeEventListener( 'load', this );\r\n this.proxyImage.removeEventListener( 'error', this );\r\n this.img.removeEventListener( 'load', this );\r\n this.img.removeEventListener( 'error', this );\r\n};\r\n\r\n// -------------------------- Background -------------------------- //\r\n\r\nfunction Background( url, element ) {\r\n this.url = url;\r\n this.element = element;\r\n this.img = new Image();\r\n}\r\n\r\n// inherit LoadingImage prototype\r\nBackground.prototype = Object.create( LoadingImage.prototype );\r\n\r\nBackground.prototype.check = function() {\r\n this.img.addEventListener( 'load', this );\r\n this.img.addEventListener( 'error', this );\r\n this.img.src = this.url;\r\n // check if image is already complete\r\n var isComplete = this.getIsImageComplete();\r\n if ( isComplete ) {\r\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\r\n this.unbindEvents();\r\n }\r\n};\r\n\r\nBackground.prototype.unbindEvents = function() {\r\n this.img.removeEventListener( 'load', this );\r\n this.img.removeEventListener( 'error', this );\r\n};\r\n\r\nBackground.prototype.confirm = function( isLoaded, message ) {\r\n this.isLoaded = isLoaded;\r\n this.emitEvent( 'progress', [ this, this.element, message ] );\r\n};\r\n\r\n// -------------------------- jQuery -------------------------- //\r\n\r\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\r\n jQuery = jQuery || window.jQuery;\r\n if ( !jQuery ) {\r\n return;\r\n }\r\n // set local variable\r\n $ = jQuery;\r\n // $().imagesLoaded()\r\n $.fn.imagesLoaded = function( options, callback ) {\r\n var instance = new ImagesLoaded( this, options, callback );\r\n return instance.jqDeferred.promise( $(this) );\r\n };\r\n};\r\n// try making plugin\r\nImagesLoaded.makeJQueryPlugin();\r\n\r\n// -------------------------- -------------------------- //\r\n\r\nreturn ImagesLoaded;\r\n\r\n});\r\n","/*!\r\n * Masonry PACKAGED v4.2.0\r\n * Cascading grid layout library\r\n * http://masonry.desandro.com\r\n * MIT License\r\n * by David DeSandro\r\n */\r\n\r\n/**\r\n * Bridget makes jQuery widgets\r\n * v2.0.1\r\n * MIT license\r\n */\r\n\r\n/* jshint browser: true, strict: true, undef: true, unused: true */\r\n\r\n( function( window, factory ) {\r\n // universal module definition\r\n /*jshint strict: false */ /* globals define, module, require */\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD\r\n define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {\r\n return factory( window, jQuery );\r\n });\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS\r\n module.exports = factory(\r\n window,\r\n require('jquery')\r\n );\r\n } else {\r\n // browser global\r\n window.jQueryBridget = factory(\r\n window,\r\n window.jQuery\r\n );\r\n }\r\n\r\n}( window, function factory( window, jQuery ) {\r\n'use strict';\r\n\r\n// ----- utils ----- //\r\n\r\nvar arraySlice = Array.prototype.slice;\r\n\r\n// helper function for logging errors\r\n// $.error breaks jQuery chaining\r\nvar console = window.console;\r\nvar logError = typeof console == 'undefined' ? function() {} :\r\n function( message ) {\r\n console.error( message );\r\n };\r\n\r\n// ----- jQueryBridget ----- //\r\n\r\nfunction jQueryBridget( namespace, PluginClass, $ ) {\r\n $ = $ || jQuery || window.jQuery;\r\n if ( !$ ) {\r\n return;\r\n }\r\n\r\n // add option method -> $().plugin('option', {...})\r\n if ( !PluginClass.prototype.option ) {\r\n // option setter\r\n PluginClass.prototype.option = function( opts ) {\r\n // bail out if not an object\r\n if ( !$.isPlainObject( opts ) ){\r\n return;\r\n }\r\n this.options = $.extend( true, this.options, opts );\r\n };\r\n }\r\n\r\n // make jQuery plugin\r\n $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\r\n if ( typeof arg0 == 'string' ) {\r\n // method call $().plugin( 'methodName', { options } )\r\n // shift arguments by 1\r\n var args = arraySlice.call( arguments, 1 );\r\n return methodCall( this, arg0, args );\r\n }\r\n // just $().plugin({ options })\r\n plainCall( this, arg0 );\r\n return this;\r\n };\r\n\r\n // $().plugin('methodName')\r\n function methodCall( $elems, methodName, args ) {\r\n var returnValue;\r\n var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\r\n\r\n $elems.each( function( i, elem ) {\r\n // get instance\r\n var instance = $.data( elem, namespace );\r\n if ( !instance ) {\r\n logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\r\n pluginMethodStr );\r\n return;\r\n }\r\n\r\n var method = instance[ methodName ];\r\n if ( !method || methodName.charAt(0) == '_' ) {\r\n logError( pluginMethodStr + ' is not a valid method' );\r\n return;\r\n }\r\n\r\n // apply method, get return value\r\n var value = method.apply( instance, args );\r\n // set return value if value is returned, use only first value\r\n returnValue = returnValue === undefined ? value : returnValue;\r\n });\r\n\r\n return returnValue !== undefined ? returnValue : $elems;\r\n }\r\n\r\n function plainCall( $elems, options ) {\r\n $elems.each( function( i, elem ) {\r\n var instance = $.data( elem, namespace );\r\n if ( instance ) {\r\n // set options & init\r\n instance.option( options );\r\n instance._init();\r\n } else {\r\n // initialize new instance\r\n instance = new PluginClass( elem, options );\r\n $.data( elem, namespace, instance );\r\n }\r\n });\r\n }\r\n\r\n updateJQuery( $ );\r\n\r\n}\r\n\r\n// ----- updateJQuery ----- //\r\n\r\n// set $.bridget for v1 backwards compatibility\r\nfunction updateJQuery( $ ) {\r\n if ( !$ || ( $ && $.bridget ) ) {\r\n return;\r\n }\r\n $.bridget = jQueryBridget;\r\n}\r\n\r\nupdateJQuery( jQuery || window.jQuery );\r\n\r\n// ----- ----- //\r\n\r\nreturn jQueryBridget;\r\n\r\n}));\r\n\r\n/**\r\n * EvEmitter v1.0.3\r\n * Lil' event emitter\r\n * MIT License\r\n */\r\n\r\n/* jshint unused: true, undef: true, strict: true */\r\n\r\n( function( global, factory ) {\r\n // universal module definition\r\n /* jshint strict: false */ /* globals define, module, window */\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD - RequireJS\r\n define( 'ev-emitter/ev-emitter',factory );\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS - Browserify, Webpack\r\n module.exports = factory();\r\n } else {\r\n // Browser globals\r\n global.EvEmitter = factory();\r\n }\r\n\r\n}( typeof window != 'undefined' ? window : this, function() {\r\n\r\n\r\n\r\nfunction EvEmitter() {}\r\n\r\nvar proto = EvEmitter.prototype;\r\n\r\nproto.on = function( eventName, listener ) {\r\n if ( !eventName || !listener ) {\r\n return;\r\n }\r\n // set events hash\r\n var events = this._events = this._events || {};\r\n // set listeners array\r\n var listeners = events[ eventName ] = events[ eventName ] || [];\r\n // only add once\r\n if ( listeners.indexOf( listener ) == -1 ) {\r\n listeners.push( listener );\r\n }\r\n\r\n return this;\r\n};\r\n\r\nproto.once = function( eventName, listener ) {\r\n if ( !eventName || !listener ) {\r\n return;\r\n }\r\n // add event\r\n this.on( eventName, listener );\r\n // set once flag\r\n // set onceEvents hash\r\n var onceEvents = this._onceEvents = this._onceEvents || {};\r\n // set onceListeners object\r\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\r\n // set flag\r\n onceListeners[ listener ] = true;\r\n\r\n return this;\r\n};\r\n\r\nproto.off = function( eventName, listener ) {\r\n var listeners = this._events && this._events[ eventName ];\r\n if ( !listeners || !listeners.length ) {\r\n return;\r\n }\r\n var index = listeners.indexOf( listener );\r\n if ( index != -1 ) {\r\n listeners.splice( index, 1 );\r\n }\r\n\r\n return this;\r\n};\r\n\r\nproto.emitEvent = function( eventName, args ) {\r\n var listeners = this._events && this._events[ eventName ];\r\n if ( !listeners || !listeners.length ) {\r\n return;\r\n }\r\n var i = 0;\r\n var listener = listeners[i];\r\n args = args || [];\r\n // once stuff\r\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\r\n\r\n while ( listener ) {\r\n var isOnce = onceListeners && onceListeners[ listener ];\r\n if ( isOnce ) {\r\n // remove listener\r\n // remove before trigger to prevent recursion\r\n this.off( eventName, listener );\r\n // unset once flag\r\n delete onceListeners[ listener ];\r\n }\r\n // trigger listener\r\n listener.apply( this, args );\r\n // get next listener\r\n i += isOnce ? 0 : 1;\r\n listener = listeners[i];\r\n }\r\n\r\n return this;\r\n};\r\n\r\nreturn EvEmitter;\r\n\r\n}));\r\n\r\n/*!\r\n * getSize v2.0.2\r\n * measure size of elements\r\n * MIT license\r\n */\r\n\r\n/*jshint browser: true, strict: true, undef: true, unused: true */\r\n/*global define: false, module: false, console: false */\r\n\r\n( function( window, factory ) {\r\n 'use strict';\r\n\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD\r\n define( 'get-size/get-size',[],function() {\r\n return factory();\r\n });\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS\r\n module.exports = factory();\r\n } else {\r\n // browser global\r\n window.getSize = factory();\r\n }\r\n\r\n})( window, function factory() {\r\n'use strict';\r\n\r\n// -------------------------- helpers -------------------------- //\r\n\r\n// get a number from a string, not a percentage\r\nfunction getStyleSize( value ) {\r\n var num = parseFloat( value );\r\n // not a percent like '100%', and a number\r\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\r\n return isValid && num;\r\n}\r\n\r\nfunction noop() {}\r\n\r\nvar logError = typeof console == 'undefined' ? noop :\r\n function( message ) {\r\n console.error( message );\r\n };\r\n\r\n// -------------------------- measurements -------------------------- //\r\n\r\nvar measurements = [\r\n 'paddingLeft',\r\n 'paddingRight',\r\n 'paddingTop',\r\n 'paddingBottom',\r\n 'marginLeft',\r\n 'marginRight',\r\n 'marginTop',\r\n 'marginBottom',\r\n 'borderLeftWidth',\r\n 'borderRightWidth',\r\n 'borderTopWidth',\r\n 'borderBottomWidth'\r\n];\r\n\r\nvar measurementsLength = measurements.length;\r\n\r\nfunction getZeroSize() {\r\n var size = {\r\n width: 0,\r\n height: 0,\r\n innerWidth: 0,\r\n innerHeight: 0,\r\n outerWidth: 0,\r\n outerHeight: 0\r\n };\r\n for ( var i=0; i < measurementsLength; i++ ) {\r\n var measurement = measurements[i];\r\n size[ measurement ] = 0;\r\n }\r\n return size;\r\n}\r\n\r\n// -------------------------- getStyle -------------------------- //\r\n\r\n/**\r\n * getStyle, get style of element, check for Firefox bug\r\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\r\n */\r\nfunction getStyle( elem ) {\r\n var style = getComputedStyle( elem );\r\n if ( !style ) {\r\n logError( 'Style returned ' + style +\r\n '. Are you running this code in a hidden iframe on Firefox? ' +\r\n 'See http://bit.ly/getsizebug1' );\r\n }\r\n return style;\r\n}\r\n\r\n// -------------------------- setup -------------------------- //\r\n\r\nvar isSetup = false;\r\n\r\nvar isBoxSizeOuter;\r\n\r\n/**\r\n * setup\r\n * check isBoxSizerOuter\r\n * do on first getSize() rather than on page load for Firefox bug\r\n */\r\nfunction setup() {\r\n // setup once\r\n if ( isSetup ) {\r\n return;\r\n }\r\n isSetup = true;\r\n\r\n // -------------------------- box sizing -------------------------- //\r\n\r\n /**\r\n * WebKit measures the outer-width on style.width on border-box elems\r\n * IE & Firefox<29 measures the inner-width\r\n */\r\n var div = document.createElement('div');\r\n div.style.width = '200px';\r\n div.style.padding = '1px 2px 3px 4px';\r\n div.style.borderStyle = 'solid';\r\n div.style.borderWidth = '1px 2px 3px 4px';\r\n div.style.boxSizing = 'border-box';\r\n\r\n var body = document.body || document.documentElement;\r\n body.appendChild( div );\r\n var style = getStyle( div );\r\n\r\n getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\r\n body.removeChild( div );\r\n\r\n}\r\n\r\n// -------------------------- getSize -------------------------- //\r\n\r\nfunction getSize( elem ) {\r\n setup();\r\n\r\n // use querySeletor if elem is string\r\n if ( typeof elem == 'string' ) {\r\n elem = document.querySelector( elem );\r\n }\r\n\r\n // do not proceed on non-objects\r\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\r\n return;\r\n }\r\n\r\n var style = getStyle( elem );\r\n\r\n // if hidden, everything is 0\r\n if ( style.display == 'none' ) {\r\n return getZeroSize();\r\n }\r\n\r\n var size = {};\r\n size.width = elem.offsetWidth;\r\n size.height = elem.offsetHeight;\r\n\r\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\r\n\r\n // get all measurements\r\n for ( var i=0; i < measurementsLength; i++ ) {\r\n var measurement = measurements[i];\r\n var value = style[ measurement ];\r\n var num = parseFloat( value );\r\n // any 'auto', 'medium' value will be 0\r\n size[ measurement ] = !isNaN( num ) ? num : 0;\r\n }\r\n\r\n var paddingWidth = size.paddingLeft + size.paddingRight;\r\n var paddingHeight = size.paddingTop + size.paddingBottom;\r\n var marginWidth = size.marginLeft + size.marginRight;\r\n var marginHeight = size.marginTop + size.marginBottom;\r\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\r\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\r\n\r\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\r\n\r\n // overwrite width and height if we can get it from style\r\n var styleWidth = getStyleSize( style.width );\r\n if ( styleWidth !== false ) {\r\n size.width = styleWidth +\r\n // add padding and border unless it's already including it\r\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\r\n }\r\n\r\n var styleHeight = getStyleSize( style.height );\r\n if ( styleHeight !== false ) {\r\n size.height = styleHeight +\r\n // add padding and border unless it's already including it\r\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\r\n }\r\n\r\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\r\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\r\n\r\n size.outerWidth = size.width + marginWidth;\r\n size.outerHeight = size.height + marginHeight;\r\n\r\n return size;\r\n}\r\n\r\nreturn getSize;\r\n\r\n});\r\n\r\n/**\r\n * matchesSelector v2.0.2\r\n * matchesSelector( element, '.selector' )\r\n * MIT license\r\n */\r\n\r\n/*jshint browser: true, strict: true, undef: true, unused: true */\r\n\r\n( function( window, factory ) {\r\n /*global define: false, module: false */\r\n 'use strict';\r\n // universal module definition\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD\r\n define( 'desandro-matches-selector/matches-selector',factory );\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS\r\n module.exports = factory();\r\n } else {\r\n // browser global\r\n window.matchesSelector = factory();\r\n }\r\n\r\n}( window, function factory() {\r\n 'use strict';\r\n\r\n var matchesMethod = ( function() {\r\n var ElemProto = window.Element.prototype;\r\n // check for the standard method name first\r\n if ( ElemProto.matches ) {\r\n return 'matches';\r\n }\r\n // check un-prefixed\r\n if ( ElemProto.matchesSelector ) {\r\n return 'matchesSelector';\r\n }\r\n // check vendor prefixes\r\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\r\n\r\n for ( var i=0; i < prefixes.length; i++ ) {\r\n var prefix = prefixes[i];\r\n var method = prefix + 'MatchesSelector';\r\n if ( ElemProto[ method ] ) {\r\n return method;\r\n }\r\n }\r\n })();\r\n\r\n return function matchesSelector( elem, selector ) {\r\n return elem[ matchesMethod ]( selector );\r\n };\r\n\r\n}));\r\n\r\n/**\r\n * Fizzy UI utils v2.0.4\r\n * MIT license\r\n */\r\n\r\n/*jshint browser: true, undef: true, unused: true, strict: true */\r\n\r\n( function( window, factory ) {\r\n // universal module definition\r\n /*jshint strict: false */ /*globals define, module, require */\r\n\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD\r\n define( 'fizzy-ui-utils/utils',[\r\n 'desandro-matches-selector/matches-selector'\r\n ], function( matchesSelector ) {\r\n return factory( window, matchesSelector );\r\n });\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS\r\n module.exports = factory(\r\n window,\r\n require('desandro-matches-selector')\r\n );\r\n } else {\r\n // browser global\r\n window.fizzyUIUtils = factory(\r\n window,\r\n window.matchesSelector\r\n );\r\n }\r\n\r\n}( window, function factory( window, matchesSelector ) {\r\n\r\n\r\n\r\nvar utils = {};\r\n\r\n// ----- extend ----- //\r\n\r\n// extends objects\r\nutils.extend = function( a, b ) {\r\n for ( var prop in b ) {\r\n a[ prop ] = b[ prop ];\r\n }\r\n return a;\r\n};\r\n\r\n// ----- modulo ----- //\r\n\r\nutils.modulo = function( num, div ) {\r\n return ( ( num % div ) + div ) % div;\r\n};\r\n\r\n// ----- makeArray ----- //\r\n\r\n// turn element or nodeList into an array\r\nutils.makeArray = function( obj ) {\r\n var ary = [];\r\n if ( Array.isArray( obj ) ) {\r\n // use object if already an array\r\n ary = obj;\r\n } else if ( obj && typeof obj == 'object' &&\r\n typeof obj.length == 'number' ) {\r\n // convert nodeList to array\r\n for ( var i=0; i < obj.length; i++ ) {\r\n ary.push( obj[i] );\r\n }\r\n } else {\r\n // array of single index\r\n ary.push( obj );\r\n }\r\n return ary;\r\n};\r\n\r\n// ----- removeFrom ----- //\r\n\r\nutils.removeFrom = function( ary, obj ) {\r\n var index = ary.indexOf( obj );\r\n if ( index != -1 ) {\r\n ary.splice( index, 1 );\r\n }\r\n};\r\n\r\n// ----- getParent ----- //\r\n\r\nutils.getParent = function( elem, selector ) {\r\n while ( elem != document.body ) {\r\n elem = elem.parentNode;\r\n if ( matchesSelector( elem, selector ) ) {\r\n return elem;\r\n }\r\n }\r\n};\r\n\r\n// ----- getQueryElement ----- //\r\n\r\n// use element as selector string\r\nutils.getQueryElement = function( elem ) {\r\n if ( typeof elem == 'string' ) {\r\n return document.querySelector( elem );\r\n }\r\n return elem;\r\n};\r\n\r\n// ----- handleEvent ----- //\r\n\r\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\r\nutils.handleEvent = function( event ) {\r\n var method = 'on' + event.type;\r\n if ( this[ method ] ) {\r\n this[ method ]( event );\r\n }\r\n};\r\n\r\n// ----- filterFindElements ----- //\r\n\r\nutils.filterFindElements = function( elems, selector ) {\r\n // make array of elems\r\n elems = utils.makeArray( elems );\r\n var ffElems = [];\r\n\r\n elems.forEach( function( elem ) {\r\n // check that elem is an actual element\r\n if ( !( elem instanceof HTMLElement ) ) {\r\n return;\r\n }\r\n // add elem if no selector\r\n if ( !selector ) {\r\n ffElems.push( elem );\r\n return;\r\n }\r\n // filter & find items if we have a selector\r\n // filter\r\n if ( matchesSelector( elem, selector ) ) {\r\n ffElems.push( elem );\r\n }\r\n // find children\r\n var childElems = elem.querySelectorAll( selector );\r\n // concat childElems to filterFound array\r\n for ( var i=0; i < childElems.length; i++ ) {\r\n ffElems.push( childElems[i] );\r\n }\r\n });\r\n\r\n return ffElems;\r\n};\r\n\r\n// ----- debounceMethod ----- //\r\n\r\nutils.debounceMethod = function( _class, methodName, threshold ) {\r\n // original method\r\n var method = _class.prototype[ methodName ];\r\n var timeoutName = methodName + 'Timeout';\r\n\r\n _class.prototype[ methodName ] = function() {\r\n var timeout = this[ timeoutName ];\r\n if ( timeout ) {\r\n clearTimeout( timeout );\r\n }\r\n var args = arguments;\r\n\r\n var _this = this;\r\n this[ timeoutName ] = setTimeout( function() {\r\n method.apply( _this, args );\r\n delete _this[ timeoutName ];\r\n }, threshold || 100 );\r\n };\r\n};\r\n\r\n// ----- docReady ----- //\r\n\r\nutils.docReady = function( callback ) {\r\n var readyState = document.readyState;\r\n if ( readyState == 'complete' || readyState == 'interactive' ) {\r\n // do async to allow for other scripts to run. metafizzy/flickity#441\r\n setTimeout( callback );\r\n } else {\r\n document.addEventListener( 'DOMContentLoaded', callback );\r\n }\r\n};\r\n\r\n// ----- htmlInit ----- //\r\n\r\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\r\nutils.toDashed = function( str ) {\r\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\r\n return $1 + '-' + $2;\r\n }).toLowerCase();\r\n};\r\n\r\nvar console = window.console;\r\n/**\r\n * allow user to initialize classes via [data-namespace] or .js-namespace class\r\n * htmlInit( Widget, 'widgetName' )\r\n * options are parsed from data-namespace-options\r\n */\r\nutils.htmlInit = function( WidgetClass, namespace ) {\r\n utils.docReady( function() {\r\n var dashedNamespace = utils.toDashed( namespace );\r\n var dataAttr = 'data-' + dashedNamespace;\r\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\r\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\r\n var elems = utils.makeArray( dataAttrElems )\r\n .concat( utils.makeArray( jsDashElems ) );\r\n var dataOptionsAttr = dataAttr + '-options';\r\n var jQuery = window.jQuery;\r\n\r\n elems.forEach( function( elem ) {\r\n var attr = elem.getAttribute( dataAttr ) ||\r\n elem.getAttribute( dataOptionsAttr );\r\n var options;\r\n try {\r\n options = attr && JSON.parse( attr );\r\n } catch ( error ) {\r\n // log error, do not initialize\r\n if ( console ) {\r\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\r\n ': ' + error );\r\n }\r\n return;\r\n }\r\n // initialize\r\n var instance = new WidgetClass( elem, options );\r\n // make available via $().data('namespace')\r\n if ( jQuery ) {\r\n jQuery.data( elem, namespace, instance );\r\n }\r\n });\r\n\r\n });\r\n};\r\n\r\n// ----- ----- //\r\n\r\nreturn utils;\r\n\r\n}));\r\n\r\n/**\r\n * Outlayer Item\r\n */\r\n\r\n( function( window, factory ) {\r\n // universal module definition\r\n /* jshint strict: false */ /* globals define, module, require */\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD - RequireJS\r\n define( 'outlayer/item',[\r\n 'ev-emitter/ev-emitter',\r\n 'get-size/get-size'\r\n ],\r\n factory\r\n );\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS - Browserify, Webpack\r\n module.exports = factory(\r\n require('ev-emitter'),\r\n require('get-size')\r\n );\r\n } else {\r\n // browser global\r\n window.Outlayer = {};\r\n window.Outlayer.Item = factory(\r\n window.EvEmitter,\r\n window.getSize\r\n );\r\n }\r\n\r\n}( window, function factory( EvEmitter, getSize ) {\r\n'use strict';\r\n\r\n// ----- helpers ----- //\r\n\r\nfunction isEmptyObj( obj ) {\r\n for ( var prop in obj ) {\r\n return false;\r\n }\r\n prop = null;\r\n return true;\r\n}\r\n\r\n// -------------------------- CSS3 support -------------------------- //\r\n\r\n\r\nvar docElemStyle = document.documentElement.style;\r\n\r\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\r\n 'transition' : 'WebkitTransition';\r\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\r\n 'transform' : 'WebkitTransform';\r\n\r\nvar transitionEndEvent = {\r\n WebkitTransition: 'webkitTransitionEnd',\r\n transition: 'transitionend'\r\n}[ transitionProperty ];\r\n\r\n// cache all vendor properties that could have vendor prefix\r\nvar vendorProperties = {\r\n transform: transformProperty,\r\n transition: transitionProperty,\r\n transitionDuration: transitionProperty + 'Duration',\r\n transitionProperty: transitionProperty + 'Property',\r\n transitionDelay: transitionProperty + 'Delay'\r\n};\r\n\r\n// -------------------------- Item -------------------------- //\r\n\r\nfunction Item( element, layout ) {\r\n if ( !element ) {\r\n return;\r\n }\r\n\r\n this.element = element;\r\n // parent layout class, i.e. Masonry, Isotope, or Packery\r\n this.layout = layout;\r\n this.position = {\r\n x: 0,\r\n y: 0\r\n };\r\n\r\n this._create();\r\n}\r\n\r\n// inherit EvEmitter\r\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\r\nproto.constructor = Item;\r\n\r\nproto._create = function() {\r\n // transition objects\r\n this._transn = {\r\n ingProperties: {},\r\n clean: {},\r\n onEnd: {}\r\n };\r\n\r\n this.css({\r\n position: 'absolute'\r\n });\r\n};\r\n\r\n// trigger specified handler for event type\r\nproto.handleEvent = function( event ) {\r\n var method = 'on' + event.type;\r\n if ( this[ method ] ) {\r\n this[ method ]( event );\r\n }\r\n};\r\n\r\nproto.getSize = function() {\r\n this.size = getSize( this.element );\r\n};\r\n\r\n/**\r\n * apply CSS styles to element\r\n * @param {Object} style\r\n */\r\nproto.css = function( style ) {\r\n var elemStyle = this.element.style;\r\n\r\n for ( var prop in style ) {\r\n // use vendor property if available\r\n var supportedProp = vendorProperties[ prop ] || prop;\r\n elemStyle[ supportedProp ] = style[ prop ];\r\n }\r\n};\r\n\r\n // measure position, and sets it\r\nproto.getPosition = function() {\r\n var style = getComputedStyle( this.element );\r\n var isOriginLeft = this.layout._getOption('originLeft');\r\n var isOriginTop = this.layout._getOption('originTop');\r\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\r\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\r\n // convert percent to pixels\r\n var layoutSize = this.layout.size;\r\n var x = xValue.indexOf('%') != -1 ?\r\n ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );\r\n var y = yValue.indexOf('%') != -1 ?\r\n ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );\r\n\r\n // clean up 'auto' or other non-integer values\r\n x = isNaN( x ) ? 0 : x;\r\n y = isNaN( y ) ? 0 : y;\r\n // remove padding from measurement\r\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\r\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\r\n\r\n this.position.x = x;\r\n this.position.y = y;\r\n};\r\n\r\n// set settled position, apply padding\r\nproto.layoutPosition = function() {\r\n var layoutSize = this.layout.size;\r\n var style = {};\r\n var isOriginLeft = this.layout._getOption('originLeft');\r\n var isOriginTop = this.layout._getOption('originTop');\r\n\r\n // x\r\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\r\n var xProperty = isOriginLeft ? 'left' : 'right';\r\n var xResetProperty = isOriginLeft ? 'right' : 'left';\r\n\r\n var x = this.position.x + layoutSize[ xPadding ];\r\n // set in percentage or pixels\r\n style[ xProperty ] = this.getXValue( x );\r\n // reset other property\r\n style[ xResetProperty ] = '';\r\n\r\n // y\r\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\r\n var yProperty = isOriginTop ? 'top' : 'bottom';\r\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\r\n\r\n var y = this.position.y + layoutSize[ yPadding ];\r\n // set in percentage or pixels\r\n style[ yProperty ] = this.getYValue( y );\r\n // reset other property\r\n style[ yResetProperty ] = '';\r\n\r\n this.css( style );\r\n this.emitEvent( 'layout', [ this ] );\r\n};\r\n\r\nproto.getXValue = function( x ) {\r\n var isHorizontal = this.layout._getOption('horizontal');\r\n return this.layout.options.percentPosition && !isHorizontal ?\r\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\r\n};\r\n\r\nproto.getYValue = function( y ) {\r\n var isHorizontal = this.layout._getOption('horizontal');\r\n return this.layout.options.percentPosition && isHorizontal ?\r\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\r\n};\r\n\r\nproto._transitionTo = function( x, y ) {\r\n this.getPosition();\r\n // get current x & y from top/left\r\n var curX = this.position.x;\r\n var curY = this.position.y;\r\n\r\n var compareX = parseInt( x, 10 );\r\n var compareY = parseInt( y, 10 );\r\n var didNotMove = compareX === this.position.x && compareY === this.position.y;\r\n\r\n // save end position\r\n this.setPosition( x, y );\r\n\r\n // if did not move and not transitioning, just go to layout\r\n if ( didNotMove && !this.isTransitioning ) {\r\n this.layoutPosition();\r\n return;\r\n }\r\n\r\n var transX = x - curX;\r\n var transY = y - curY;\r\n var transitionStyle = {};\r\n transitionStyle.transform = this.getTranslate( transX, transY );\r\n\r\n this.transition({\r\n to: transitionStyle,\r\n onTransitionEnd: {\r\n transform: this.layoutPosition\r\n },\r\n isCleaning: true\r\n });\r\n};\r\n\r\nproto.getTranslate = function( x, y ) {\r\n // flip cooridinates if origin on right or bottom\r\n var isOriginLeft = this.layout._getOption('originLeft');\r\n var isOriginTop = this.layout._getOption('originTop');\r\n x = isOriginLeft ? x : -x;\r\n y = isOriginTop ? y : -y;\r\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\r\n};\r\n\r\n// non transition + transform support\r\nproto.goTo = function( x, y ) {\r\n this.setPosition( x, y );\r\n this.layoutPosition();\r\n};\r\n\r\nproto.moveTo = proto._transitionTo;\r\n\r\nproto.setPosition = function( x, y ) {\r\n this.position.x = parseInt( x, 10 );\r\n this.position.y = parseInt( y, 10 );\r\n};\r\n\r\n// ----- transition ----- //\r\n\r\n/**\r\n * @param {Object} style - CSS\r\n * @param {Function} onTransitionEnd\r\n */\r\n\r\n// non transition, just trigger callback\r\nproto._nonTransition = function( args ) {\r\n this.css( args.to );\r\n if ( args.isCleaning ) {\r\n this._removeStyles( args.to );\r\n }\r\n for ( var prop in args.onTransitionEnd ) {\r\n args.onTransitionEnd[ prop ].call( this );\r\n }\r\n};\r\n\r\n/**\r\n * proper transition\r\n * @param {Object} args - arguments\r\n * @param {Object} to - style to transition to\r\n * @param {Object} from - style to start transition from\r\n * @param {Boolean} isCleaning - removes transition styles after transition\r\n * @param {Function} onTransitionEnd - callback\r\n */\r\nproto.transition = function( args ) {\r\n // redirect to nonTransition if no transition duration\r\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\r\n this._nonTransition( args );\r\n return;\r\n }\r\n\r\n var _transition = this._transn;\r\n // keep track of onTransitionEnd callback by css property\r\n for ( var prop in args.onTransitionEnd ) {\r\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\r\n }\r\n // keep track of properties that are transitioning\r\n for ( prop in args.to ) {\r\n _transition.ingProperties[ prop ] = true;\r\n // keep track of properties to clean up when transition is done\r\n if ( args.isCleaning ) {\r\n _transition.clean[ prop ] = true;\r\n }\r\n }\r\n\r\n // set from styles\r\n if ( args.from ) {\r\n this.css( args.from );\r\n // force redraw. http://blog.alexmaccaw.com/css-transitions\r\n var h = this.element.offsetHeight;\r\n // hack for JSHint to hush about unused var\r\n h = null;\r\n }\r\n // enable transition\r\n this.enableTransition( args.to );\r\n // set styles that are transitioning\r\n this.css( args.to );\r\n\r\n this.isTransitioning = true;\r\n\r\n};\r\n\r\n// dash before all cap letters, including first for\r\n// WebkitTransform => -webkit-transform\r\nfunction toDashedAll( str ) {\r\n return str.replace( /([A-Z])/g, function( $1 ) {\r\n return '-' + $1.toLowerCase();\r\n });\r\n}\r\n\r\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\r\n\r\nproto.enableTransition = function(/* style */) {\r\n // HACK changing transitionProperty during a transition\r\n // will cause transition to jump\r\n if ( this.isTransitioning ) {\r\n return;\r\n }\r\n\r\n // make `transition: foo, bar, baz` from style object\r\n // HACK un-comment this when enableTransition can work\r\n // while a transition is happening\r\n // var transitionValues = [];\r\n // for ( var prop in style ) {\r\n // // dash-ify camelCased properties like WebkitTransition\r\n // prop = vendorProperties[ prop ] || prop;\r\n // transitionValues.push( toDashedAll( prop ) );\r\n // }\r\n // munge number to millisecond, to match stagger\r\n var duration = this.layout.options.transitionDuration;\r\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\r\n // enable transition styles\r\n this.css({\r\n transitionProperty: transitionProps,\r\n transitionDuration: duration,\r\n transitionDelay: this.staggerDelay || 0\r\n });\r\n // listen for transition end event\r\n this.element.addEventListener( transitionEndEvent, this, false );\r\n};\r\n\r\n// ----- events ----- //\r\n\r\nproto.onwebkitTransitionEnd = function( event ) {\r\n this.ontransitionend( event );\r\n};\r\n\r\nproto.onotransitionend = function( event ) {\r\n this.ontransitionend( event );\r\n};\r\n\r\n// properties that I munge to make my life easier\r\nvar dashedVendorProperties = {\r\n '-webkit-transform': 'transform'\r\n};\r\n\r\nproto.ontransitionend = function( event ) {\r\n // disregard bubbled events from children\r\n if ( event.target !== this.element ) {\r\n return;\r\n }\r\n var _transition = this._transn;\r\n // get property name of transitioned property, convert to prefix-free\r\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\r\n\r\n // remove property that has completed transitioning\r\n delete _transition.ingProperties[ propertyName ];\r\n // check if any properties are still transitioning\r\n if ( isEmptyObj( _transition.ingProperties ) ) {\r\n // all properties have completed transitioning\r\n this.disableTransition();\r\n }\r\n // clean style\r\n if ( propertyName in _transition.clean ) {\r\n // clean up style\r\n this.element.style[ event.propertyName ] = '';\r\n delete _transition.clean[ propertyName ];\r\n }\r\n // trigger onTransitionEnd callback\r\n if ( propertyName in _transition.onEnd ) {\r\n var onTransitionEnd = _transition.onEnd[ propertyName ];\r\n onTransitionEnd.call( this );\r\n delete _transition.onEnd[ propertyName ];\r\n }\r\n\r\n this.emitEvent( 'transitionEnd', [ this ] );\r\n};\r\n\r\nproto.disableTransition = function() {\r\n this.removeTransitionStyles();\r\n this.element.removeEventListener( transitionEndEvent, this, false );\r\n this.isTransitioning = false;\r\n};\r\n\r\n/**\r\n * removes style property from element\r\n * @param {Object} style\r\n**/\r\nproto._removeStyles = function( style ) {\r\n // clean up transition styles\r\n var cleanStyle = {};\r\n for ( var prop in style ) {\r\n cleanStyle[ prop ] = '';\r\n }\r\n this.css( cleanStyle );\r\n};\r\n\r\nvar cleanTransitionStyle = {\r\n transitionProperty: '',\r\n transitionDuration: '',\r\n transitionDelay: ''\r\n};\r\n\r\nproto.removeTransitionStyles = function() {\r\n // remove transition\r\n this.css( cleanTransitionStyle );\r\n};\r\n\r\n// ----- stagger ----- //\r\n\r\nproto.stagger = function( delay ) {\r\n delay = isNaN( delay ) ? 0 : delay;\r\n this.staggerDelay = delay + 'ms';\r\n};\r\n\r\n// ----- show/hide/remove ----- //\r\n\r\n// remove element from DOM\r\nproto.removeElem = function() {\r\n this.element.parentNode.removeChild( this.element );\r\n // remove display: none\r\n this.css({ display: '' });\r\n this.emitEvent( 'remove', [ this ] );\r\n};\r\n\r\nproto.remove = function() {\r\n // just remove element if no transition support or no transition\r\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\r\n this.removeElem();\r\n return;\r\n }\r\n\r\n // start transition\r\n this.once( 'transitionEnd', function() {\r\n this.removeElem();\r\n });\r\n this.hide();\r\n};\r\n\r\nproto.reveal = function() {\r\n delete this.isHidden;\r\n // remove display: none\r\n this.css({ display: '' });\r\n\r\n var options = this.layout.options;\r\n\r\n var onTransitionEnd = {};\r\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\r\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\r\n\r\n this.transition({\r\n from: options.hiddenStyle,\r\n to: options.visibleStyle,\r\n isCleaning: true,\r\n onTransitionEnd: onTransitionEnd\r\n });\r\n};\r\n\r\nproto.onRevealTransitionEnd = function() {\r\n // check if still visible\r\n // during transition, item may have been hidden\r\n if ( !this.isHidden ) {\r\n this.emitEvent('reveal');\r\n }\r\n};\r\n\r\n/**\r\n * get style property use for hide/reveal transition end\r\n * @param {String} styleProperty - hiddenStyle/visibleStyle\r\n * @returns {String}\r\n */\r\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\r\n var optionStyle = this.layout.options[ styleProperty ];\r\n // use opacity\r\n if ( optionStyle.opacity ) {\r\n return 'opacity';\r\n }\r\n // get first property\r\n for ( var prop in optionStyle ) {\r\n return prop;\r\n }\r\n};\r\n\r\nproto.hide = function() {\r\n // set flag\r\n this.isHidden = true;\r\n // remove display: none\r\n this.css({ display: '' });\r\n\r\n var options = this.layout.options;\r\n\r\n var onTransitionEnd = {};\r\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\r\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\r\n\r\n this.transition({\r\n from: options.visibleStyle,\r\n to: options.hiddenStyle,\r\n // keep hidden stuff hidden\r\n isCleaning: true,\r\n onTransitionEnd: onTransitionEnd\r\n });\r\n};\r\n\r\nproto.onHideTransitionEnd = function() {\r\n // check if still hidden\r\n // during transition, item may have been un-hidden\r\n if ( this.isHidden ) {\r\n this.css({ display: 'none' });\r\n this.emitEvent('hide');\r\n }\r\n};\r\n\r\nproto.destroy = function() {\r\n this.css({\r\n position: '',\r\n left: '',\r\n right: '',\r\n top: '',\r\n bottom: '',\r\n transition: '',\r\n transform: ''\r\n });\r\n};\r\n\r\nreturn Item;\r\n\r\n}));\r\n\r\n/*!\r\n * Outlayer v2.1.0\r\n * the brains and guts of a layout library\r\n * MIT license\r\n */\r\n\r\n( function( window, factory ) {\r\n 'use strict';\r\n // universal module definition\r\n /* jshint strict: false */ /* globals define, module, require */\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD - RequireJS\r\n define( 'outlayer/outlayer',[\r\n 'ev-emitter/ev-emitter',\r\n 'get-size/get-size',\r\n 'fizzy-ui-utils/utils',\r\n './item'\r\n ],\r\n function( EvEmitter, getSize, utils, Item ) {\r\n return factory( window, EvEmitter, getSize, utils, Item);\r\n }\r\n );\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS - Browserify, Webpack\r\n module.exports = factory(\r\n window,\r\n require('ev-emitter'),\r\n require('get-size'),\r\n require('fizzy-ui-utils'),\r\n require('./item')\r\n );\r\n } else {\r\n // browser global\r\n window.Outlayer = factory(\r\n window,\r\n window.EvEmitter,\r\n window.getSize,\r\n window.fizzyUIUtils,\r\n window.Outlayer.Item\r\n );\r\n }\r\n\r\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\r\n'use strict';\r\n\r\n// ----- vars ----- //\r\n\r\nvar console = window.console;\r\nvar jQuery = window.jQuery;\r\nvar noop = function() {};\r\n\r\n// -------------------------- Outlayer -------------------------- //\r\n\r\n// globally unique identifiers\r\nvar GUID = 0;\r\n// internal store of all Outlayer intances\r\nvar instances = {};\r\n\r\n\r\n/**\r\n * @param {Element, String} element\r\n * @param {Object} options\r\n * @constructor\r\n */\r\nfunction Outlayer( element, options ) {\r\n var queryElement = utils.getQueryElement( element );\r\n if ( !queryElement ) {\r\n if ( console ) {\r\n console.error( 'Bad element for ' + this.constructor.namespace +\r\n ': ' + ( queryElement || element ) );\r\n }\r\n return;\r\n }\r\n this.element = queryElement;\r\n // add jQuery\r\n if ( jQuery ) {\r\n this.$element = jQuery( this.element );\r\n }\r\n\r\n // options\r\n this.options = utils.extend( {}, this.constructor.defaults );\r\n this.option( options );\r\n\r\n // add id for Outlayer.getFromElement\r\n var id = ++GUID;\r\n this.element.outlayerGUID = id; // expando\r\n instances[ id ] = this; // associate via id\r\n\r\n // kick it off\r\n this._create();\r\n\r\n var isInitLayout = this._getOption('initLayout');\r\n if ( isInitLayout ) {\r\n this.layout();\r\n }\r\n}\r\n\r\n// settings are for internal use only\r\nOutlayer.namespace = 'outlayer';\r\nOutlayer.Item = Item;\r\n\r\n// default options\r\nOutlayer.defaults = {\r\n containerStyle: {\r\n position: 'relative'\r\n },\r\n initLayout: true,\r\n originLeft: true,\r\n originTop: true,\r\n resize: true,\r\n resizeContainer: true,\r\n // item options\r\n transitionDuration: '0.4s',\r\n hiddenStyle: {\r\n opacity: 0,\r\n transform: 'scale(0.001)'\r\n },\r\n visibleStyle: {\r\n opacity: 1,\r\n transform: 'scale(1)'\r\n }\r\n};\r\n\r\nvar proto = Outlayer.prototype;\r\n// inherit EvEmitter\r\nutils.extend( proto, EvEmitter.prototype );\r\n\r\n/**\r\n * set options\r\n * @param {Object} opts\r\n */\r\nproto.option = function( opts ) {\r\n utils.extend( this.options, opts );\r\n};\r\n\r\n/**\r\n * get backwards compatible option value, check old name\r\n */\r\nproto._getOption = function( option ) {\r\n var oldOption = this.constructor.compatOptions[ option ];\r\n return oldOption && this.options[ oldOption ] !== undefined ?\r\n this.options[ oldOption ] : this.options[ option ];\r\n};\r\n\r\nOutlayer.compatOptions = {\r\n // currentName: oldName\r\n initLayout: 'isInitLayout',\r\n horizontal: 'isHorizontal',\r\n layoutInstant: 'isLayoutInstant',\r\n originLeft: 'isOriginLeft',\r\n originTop: 'isOriginTop',\r\n resize: 'isResizeBound',\r\n resizeContainer: 'isResizingContainer'\r\n};\r\n\r\nproto._create = function() {\r\n // get items from children\r\n this.reloadItems();\r\n // elements that affect layout, but are not laid out\r\n this.stamps = [];\r\n this.stamp( this.options.stamp );\r\n // set container style\r\n utils.extend( this.element.style, this.options.containerStyle );\r\n\r\n // bind resize method\r\n var canBindResize = this._getOption('resize');\r\n if ( canBindResize ) {\r\n this.bindResize();\r\n }\r\n};\r\n\r\n// goes through all children again and gets bricks in proper order\r\nproto.reloadItems = function() {\r\n // collection of item elements\r\n this.items = this._itemize( this.element.children );\r\n};\r\n\r\n\r\n/**\r\n * turn elements into Outlayer.Items to be used in layout\r\n * @param {Array or NodeList or HTMLElement} elems\r\n * @returns {Array} items - collection of new Outlayer Items\r\n */\r\nproto._itemize = function( elems ) {\r\n\r\n var itemElems = this._filterFindItemElements( elems );\r\n var Item = this.constructor.Item;\r\n\r\n // create new Outlayer Items for collection\r\n var items = [];\r\n for ( var i=0; i < itemElems.length; i++ ) {\r\n var elem = itemElems[i];\r\n var item = new Item( elem, this );\r\n items.push( item );\r\n }\r\n\r\n return items;\r\n};\r\n\r\n/**\r\n * get item elements to be used in layout\r\n * @param {Array or NodeList or HTMLElement} elems\r\n * @returns {Array} items - item elements\r\n */\r\nproto._filterFindItemElements = function( elems ) {\r\n return utils.filterFindElements( elems, this.options.itemSelector );\r\n};\r\n\r\n/**\r\n * getter method for getting item elements\r\n * @returns {Array} elems - collection of item elements\r\n */\r\nproto.getItemElements = function() {\r\n return this.items.map( function( item ) {\r\n return item.element;\r\n });\r\n};\r\n\r\n// ----- init & layout ----- //\r\n\r\n/**\r\n * lays out all items\r\n */\r\nproto.layout = function() {\r\n this._resetLayout();\r\n this._manageStamps();\r\n\r\n // don't animate first layout\r\n var layoutInstant = this._getOption('layoutInstant');\r\n var isInstant = layoutInstant !== undefined ?\r\n layoutInstant : !this._isLayoutInited;\r\n this.layoutItems( this.items, isInstant );\r\n\r\n // flag for initalized\r\n this._isLayoutInited = true;\r\n};\r\n\r\n// _init is alias for layout\r\nproto._init = proto.layout;\r\n\r\n/**\r\n * logic before any new layout\r\n */\r\nproto._resetLayout = function() {\r\n this.getSize();\r\n};\r\n\r\n\r\nproto.getSize = function() {\r\n this.size = getSize( this.element );\r\n};\r\n\r\n/**\r\n * get measurement from option, for columnWidth, rowHeight, gutter\r\n * if option is String -> get element from selector string, & get size of element\r\n * if option is Element -> get size of element\r\n * else use option as a number\r\n *\r\n * @param {String} measurement\r\n * @param {String} size - width or height\r\n * @private\r\n */\r\nproto._getMeasurement = function( measurement, size ) {\r\n var option = this.options[ measurement ];\r\n var elem;\r\n if ( !option ) {\r\n // default to 0\r\n this[ measurement ] = 0;\r\n } else {\r\n // use option as an element\r\n if ( typeof option == 'string' ) {\r\n elem = this.element.querySelector( option );\r\n } else if ( option instanceof HTMLElement ) {\r\n elem = option;\r\n }\r\n // use size of element, if element\r\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\r\n }\r\n};\r\n\r\n/**\r\n * layout a collection of item elements\r\n * @api public\r\n */\r\nproto.layoutItems = function( items, isInstant ) {\r\n items = this._getItemsForLayout( items );\r\n\r\n this._layoutItems( items, isInstant );\r\n\r\n this._postLayout();\r\n};\r\n\r\n/**\r\n * get the items to be laid out\r\n * you may want to skip over some items\r\n * @param {Array} items\r\n * @returns {Array} items\r\n */\r\nproto._getItemsForLayout = function( items ) {\r\n return items.filter( function( item ) {\r\n return !item.isIgnored;\r\n });\r\n};\r\n\r\n/**\r\n * layout items\r\n * @param {Array} items\r\n * @param {Boolean} isInstant\r\n */\r\nproto._layoutItems = function( items, isInstant ) {\r\n this._emitCompleteOnItems( 'layout', items );\r\n\r\n if ( !items || !items.length ) {\r\n // no items, emit event with empty array\r\n return;\r\n }\r\n\r\n var queue = [];\r\n\r\n items.forEach( function( item ) {\r\n // get x/y object from method\r\n var position = this._getItemLayoutPosition( item );\r\n // enqueue\r\n position.item = item;\r\n position.isInstant = isInstant || item.isLayoutInstant;\r\n queue.push( position );\r\n }, this );\r\n\r\n this._processLayoutQueue( queue );\r\n};\r\n\r\n/**\r\n * get item layout position\r\n * @param {Outlayer.Item} item\r\n * @returns {Object} x and y position\r\n */\r\nproto._getItemLayoutPosition = function( /* item */ ) {\r\n return {\r\n x: 0,\r\n y: 0\r\n };\r\n};\r\n\r\n/**\r\n * iterate over array and position each item\r\n * Reason being - separating this logic prevents 'layout invalidation'\r\n * thx @paul_irish\r\n * @param {Array} queue\r\n */\r\nproto._processLayoutQueue = function( queue ) {\r\n this.updateStagger();\r\n queue.forEach( function( obj, i ) {\r\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\r\n }, this );\r\n};\r\n\r\n// set stagger from option in milliseconds number\r\nproto.updateStagger = function() {\r\n var stagger = this.options.stagger;\r\n if ( stagger === null || stagger === undefined ) {\r\n this.stagger = 0;\r\n return;\r\n }\r\n this.stagger = getMilliseconds( stagger );\r\n return this.stagger;\r\n};\r\n\r\n/**\r\n * Sets position of item in DOM\r\n * @param {Outlayer.Item} item\r\n * @param {Number} x - horizontal position\r\n * @param {Number} y - vertical position\r\n * @param {Boolean} isInstant - disables transitions\r\n */\r\nproto._positionItem = function( item, x, y, isInstant, i ) {\r\n if ( isInstant ) {\r\n // if not transition, just set CSS\r\n item.goTo( x, y );\r\n } else {\r\n item.stagger( i * this.stagger );\r\n item.moveTo( x, y );\r\n }\r\n};\r\n\r\n/**\r\n * Any logic you want to do after each layout,\r\n * i.e. size the container\r\n */\r\nproto._postLayout = function() {\r\n this.resizeContainer();\r\n};\r\n\r\nproto.resizeContainer = function() {\r\n var isResizingContainer = this._getOption('resizeContainer');\r\n if ( !isResizingContainer ) {\r\n return;\r\n }\r\n var size = this._getContainerSize();\r\n if ( size ) {\r\n this._setContainerMeasure( size.width, true );\r\n this._setContainerMeasure( size.height, false );\r\n }\r\n};\r\n\r\n/**\r\n * Sets width or height of container if returned\r\n * @returns {Object} size\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\r\nproto._getContainerSize = noop;\r\n\r\n/**\r\n * @param {Number} measure - size of width or height\r\n * @param {Boolean} isWidth\r\n */\r\nproto._setContainerMeasure = function( measure, isWidth ) {\r\n if ( measure === undefined ) {\r\n return;\r\n }\r\n\r\n var elemSize = this.size;\r\n // add padding and border width if border box\r\n if ( elemSize.isBorderBox ) {\r\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\r\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\r\n elemSize.paddingBottom + elemSize.paddingTop +\r\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\r\n }\r\n\r\n measure = Math.max( measure, 0 );\r\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\r\n};\r\n\r\n/**\r\n * emit eventComplete on a collection of items events\r\n * @param {String} eventName\r\n * @param {Array} items - Outlayer.Items\r\n */\r\nproto._emitCompleteOnItems = function( eventName, items ) {\r\n var _this = this;\r\n function onComplete() {\r\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\r\n }\r\n\r\n var count = items.length;\r\n if ( !items || !count ) {\r\n onComplete();\r\n return;\r\n }\r\n\r\n var doneCount = 0;\r\n function tick() {\r\n doneCount++;\r\n if ( doneCount == count ) {\r\n onComplete();\r\n }\r\n }\r\n\r\n // bind callback\r\n items.forEach( function( item ) {\r\n item.once( eventName, tick );\r\n });\r\n};\r\n\r\n/**\r\n * emits events via EvEmitter and jQuery events\r\n * @param {String} type - name of event\r\n * @param {Event} event - original event\r\n * @param {Array} args - extra arguments\r\n */\r\nproto.dispatchEvent = function( type, event, args ) {\r\n // add original event to arguments\r\n var emitArgs = event ? [ event ].concat( args ) : args;\r\n this.emitEvent( type, emitArgs );\r\n\r\n if ( jQuery ) {\r\n // set this.$element\r\n this.$element = this.$element || jQuery( this.element );\r\n if ( event ) {\r\n // create jQuery event\r\n var $event = jQuery.Event( event );\r\n $event.type = type;\r\n this.$element.trigger( $event, args );\r\n } else {\r\n // just trigger with type if no event available\r\n this.$element.trigger( type, args );\r\n }\r\n }\r\n};\r\n\r\n// -------------------------- ignore & stamps -------------------------- //\r\n\r\n\r\n/**\r\n * keep item in collection, but do not lay it out\r\n * ignored items do not get skipped in layout\r\n * @param {Element} elem\r\n */\r\nproto.ignore = function( elem ) {\r\n var item = this.getItem( elem );\r\n if ( item ) {\r\n item.isIgnored = true;\r\n }\r\n};\r\n\r\n/**\r\n * return item to layout collection\r\n * @param {Element} elem\r\n */\r\nproto.unignore = function( elem ) {\r\n var item = this.getItem( elem );\r\n if ( item ) {\r\n delete item.isIgnored;\r\n }\r\n};\r\n\r\n/**\r\n * adds elements to stamps\r\n * @param {NodeList, Array, Element, or String} elems\r\n */\r\nproto.stamp = function( elems ) {\r\n elems = this._find( elems );\r\n if ( !elems ) {\r\n return;\r\n }\r\n\r\n this.stamps = this.stamps.concat( elems );\r\n // ignore\r\n elems.forEach( this.ignore, this );\r\n};\r\n\r\n/**\r\n * removes elements to stamps\r\n * @param {NodeList, Array, or Element} elems\r\n */\r\nproto.unstamp = function( elems ) {\r\n elems = this._find( elems );\r\n if ( !elems ){\r\n return;\r\n }\r\n\r\n elems.forEach( function( elem ) {\r\n // filter out removed stamp elements\r\n utils.removeFrom( this.stamps, elem );\r\n this.unignore( elem );\r\n }, this );\r\n};\r\n\r\n/**\r\n * finds child elements\r\n * @param {NodeList, Array, Element, or String} elems\r\n * @returns {Array} elems\r\n */\r\nproto._find = function( elems ) {\r\n if ( !elems ) {\r\n return;\r\n }\r\n // if string, use argument as selector string\r\n if ( typeof elems == 'string' ) {\r\n elems = this.element.querySelectorAll( elems );\r\n }\r\n elems = utils.makeArray( elems );\r\n return elems;\r\n};\r\n\r\nproto._manageStamps = function() {\r\n if ( !this.stamps || !this.stamps.length ) {\r\n return;\r\n }\r\n\r\n this._getBoundingRect();\r\n\r\n this.stamps.forEach( this._manageStamp, this );\r\n};\r\n\r\n// update boundingLeft / Top\r\nproto._getBoundingRect = function() {\r\n // get bounding rect for container element\r\n var boundingRect = this.element.getBoundingClientRect();\r\n var size = this.size;\r\n this._boundingRect = {\r\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\r\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\r\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\r\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\r\n };\r\n};\r\n\r\n/**\r\n * @param {Element} stamp\r\n**/\r\nproto._manageStamp = noop;\r\n\r\n/**\r\n * get x/y position of element relative to container element\r\n * @param {Element} elem\r\n * @returns {Object} offset - has left, top, right, bottom\r\n */\r\nproto._getElementOffset = function( elem ) {\r\n var boundingRect = elem.getBoundingClientRect();\r\n var thisRect = this._boundingRect;\r\n var size = getSize( elem );\r\n var offset = {\r\n left: boundingRect.left - thisRect.left - size.marginLeft,\r\n top: boundingRect.top - thisRect.top - size.marginTop,\r\n right: thisRect.right - boundingRect.right - size.marginRight,\r\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\r\n };\r\n return offset;\r\n};\r\n\r\n// -------------------------- resize -------------------------- //\r\n\r\n// enable event handlers for listeners\r\n// i.e. resize -> onresize\r\nproto.handleEvent = utils.handleEvent;\r\n\r\n/**\r\n * Bind layout to window resizing\r\n */\r\nproto.bindResize = function() {\r\n window.addEventListener( 'resize', this );\r\n this.isResizeBound = true;\r\n};\r\n\r\n/**\r\n * Unbind layout to window resizing\r\n */\r\nproto.unbindResize = function() {\r\n window.removeEventListener( 'resize', this );\r\n this.isResizeBound = false;\r\n};\r\n\r\nproto.onresize = function() {\r\n this.resize();\r\n};\r\n\r\nutils.debounceMethod( Outlayer, 'onresize', 100 );\r\n\r\nproto.resize = function() {\r\n // don't trigger if size did not change\r\n // or if resize was unbound. See #9\r\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\r\n return;\r\n }\r\n\r\n this.layout();\r\n};\r\n\r\n/**\r\n * check if layout is needed post layout\r\n * @returns Boolean\r\n */\r\nproto.needsResizeLayout = function() {\r\n var size = getSize( this.element );\r\n // check that this.size and size are there\r\n // IE8 triggers resize on body size change, so they might not be\r\n var hasSizes = this.size && size;\r\n return hasSizes && size.innerWidth !== this.size.innerWidth;\r\n};\r\n\r\n// -------------------------- methods -------------------------- //\r\n\r\n/**\r\n * add items to Outlayer instance\r\n * @param {Array or NodeList or Element} elems\r\n * @returns {Array} items - Outlayer.Items\r\n**/\r\nproto.addItems = function( elems ) {\r\n var items = this._itemize( elems );\r\n // add items to collection\r\n if ( items.length ) {\r\n this.items = this.items.concat( items );\r\n }\r\n return items;\r\n};\r\n\r\n/**\r\n * Layout newly-appended item elements\r\n * @param {Array or NodeList or Element} elems\r\n */\r\nproto.appended = function( elems ) {\r\n var items = this.addItems( elems );\r\n if ( !items.length ) {\r\n return;\r\n }\r\n // layout and reveal just the new items\r\n this.layoutItems( items, true );\r\n this.reveal( items );\r\n};\r\n\r\n/**\r\n * Layout prepended elements\r\n * @param {Array or NodeList or Element} elems\r\n */\r\nproto.prepended = function( elems ) {\r\n var items = this._itemize( elems );\r\n if ( !items.length ) {\r\n return;\r\n }\r\n // add items to beginning of collection\r\n var previousItems = this.items.slice(0);\r\n this.items = items.concat( previousItems );\r\n // start new layout\r\n this._resetLayout();\r\n this._manageStamps();\r\n // layout new stuff without transition\r\n this.layoutItems( items, true );\r\n this.reveal( items );\r\n // layout previous items\r\n this.layoutItems( previousItems );\r\n};\r\n\r\n/**\r\n * reveal a collection of items\r\n * @param {Array of Outlayer.Items} items\r\n */\r\nproto.reveal = function( items ) {\r\n this._emitCompleteOnItems( 'reveal', items );\r\n if ( !items || !items.length ) {\r\n return;\r\n }\r\n var stagger = this.updateStagger();\r\n items.forEach( function( item, i ) {\r\n item.stagger( i * stagger );\r\n item.reveal();\r\n });\r\n};\r\n\r\n/**\r\n * hide a collection of items\r\n * @param {Array of Outlayer.Items} items\r\n */\r\nproto.hide = function( items ) {\r\n this._emitCompleteOnItems( 'hide', items );\r\n if ( !items || !items.length ) {\r\n return;\r\n }\r\n var stagger = this.updateStagger();\r\n items.forEach( function( item, i ) {\r\n item.stagger( i * stagger );\r\n item.hide();\r\n });\r\n};\r\n\r\n/**\r\n * reveal item elements\r\n * @param {Array}, {Element}, {NodeList} items\r\n */\r\nproto.revealItemElements = function( elems ) {\r\n var items = this.getItems( elems );\r\n this.reveal( items );\r\n};\r\n\r\n/**\r\n * hide item elements\r\n * @param {Array}, {Element}, {NodeList} items\r\n */\r\nproto.hideItemElements = function( elems ) {\r\n var items = this.getItems( elems );\r\n this.hide( items );\r\n};\r\n\r\n/**\r\n * get Outlayer.Item, given an Element\r\n * @param {Element} elem\r\n * @param {Function} callback\r\n * @returns {Outlayer.Item} item\r\n */\r\nproto.getItem = function( elem ) {\r\n // loop through items to get the one that matches\r\n for ( var i=0; i < this.items.length; i++ ) {\r\n var item = this.items[i];\r\n if ( item.element == elem ) {\r\n // return item\r\n return item;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * get collection of Outlayer.Items, given Elements\r\n * @param {Array} elems\r\n * @returns {Array} items - Outlayer.Items\r\n */\r\nproto.getItems = function( elems ) {\r\n elems = utils.makeArray( elems );\r\n var items = [];\r\n elems.forEach( function( elem ) {\r\n var item = this.getItem( elem );\r\n if ( item ) {\r\n items.push( item );\r\n }\r\n }, this );\r\n\r\n return items;\r\n};\r\n\r\n/**\r\n * remove element(s) from instance and DOM\r\n * @param {Array or NodeList or Element} elems\r\n */\r\nproto.remove = function( elems ) {\r\n var removeItems = this.getItems( elems );\r\n\r\n this._emitCompleteOnItems( 'remove', removeItems );\r\n\r\n // bail if no items to remove\r\n if ( !removeItems || !removeItems.length ) {\r\n return;\r\n }\r\n\r\n removeItems.forEach( function( item ) {\r\n item.remove();\r\n // remove item from collection\r\n utils.removeFrom( this.items, item );\r\n }, this );\r\n};\r\n\r\n// ----- destroy ----- //\r\n\r\n// remove and disable Outlayer instance\r\nproto.destroy = function() {\r\n // clean up dynamic styles\r\n var style = this.element.style;\r\n style.height = '';\r\n style.position = '';\r\n style.width = '';\r\n // destroy items\r\n this.items.forEach( function( item ) {\r\n item.destroy();\r\n });\r\n\r\n this.unbindResize();\r\n\r\n var id = this.element.outlayerGUID;\r\n delete instances[ id ]; // remove reference to instance by id\r\n delete this.element.outlayerGUID;\r\n // remove data for jQuery\r\n if ( jQuery ) {\r\n jQuery.removeData( this.element, this.constructor.namespace );\r\n }\r\n\r\n};\r\n\r\n// -------------------------- data -------------------------- //\r\n\r\n/**\r\n * get Outlayer instance from element\r\n * @param {Element} elem\r\n * @returns {Outlayer}\r\n */\r\nOutlayer.data = function( elem ) {\r\n elem = utils.getQueryElement( elem );\r\n var id = elem && elem.outlayerGUID;\r\n return id && instances[ id ];\r\n};\r\n\r\n\r\n// -------------------------- create Outlayer class -------------------------- //\r\n\r\n/**\r\n * create a layout class\r\n * @param {String} namespace\r\n */\r\nOutlayer.create = function( namespace, options ) {\r\n // sub-class Outlayer\r\n var Layout = subclass( Outlayer );\r\n // apply new options and compatOptions\r\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\r\n utils.extend( Layout.defaults, options );\r\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\r\n\r\n Layout.namespace = namespace;\r\n\r\n Layout.data = Outlayer.data;\r\n\r\n // sub-class Item\r\n Layout.Item = subclass( Item );\r\n\r\n // -------------------------- declarative -------------------------- //\r\n\r\n utils.htmlInit( Layout, namespace );\r\n\r\n // -------------------------- jQuery bridge -------------------------- //\r\n\r\n // make into jQuery plugin\r\n if ( jQuery && jQuery.bridget ) {\r\n jQuery.bridget( namespace, Layout );\r\n }\r\n\r\n return Layout;\r\n};\r\n\r\nfunction subclass( Parent ) {\r\n function SubClass() {\r\n Parent.apply( this, arguments );\r\n }\r\n\r\n SubClass.prototype = Object.create( Parent.prototype );\r\n SubClass.prototype.constructor = SubClass;\r\n\r\n return SubClass;\r\n}\r\n\r\n// ----- helpers ----- //\r\n\r\n// how many milliseconds are in each unit\r\nvar msUnits = {\r\n ms: 1,\r\n s: 1000\r\n};\r\n\r\n// munge time-like parameter into millisecond number\r\n// '0.4s' -> 40\r\nfunction getMilliseconds( time ) {\r\n if ( typeof time == 'number' ) {\r\n return time;\r\n }\r\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\r\n var num = matches && matches[1];\r\n var unit = matches && matches[2];\r\n if ( !num.length ) {\r\n return 0;\r\n }\r\n num = parseFloat( num );\r\n var mult = msUnits[ unit ] || 1;\r\n return num * mult;\r\n}\r\n\r\n// ----- fin ----- //\r\n\r\n// back in global\r\nOutlayer.Item = Item;\r\n\r\nreturn Outlayer;\r\n\r\n}));\r\n\r\n/*!\r\n * Masonry v4.2.0\r\n * Cascading grid layout library\r\n * http://masonry.desandro.com\r\n * MIT License\r\n * by David DeSandro\r\n */\r\n\r\n( function( window, factory ) {\r\n // universal module definition\r\n /* jshint strict: false */ /*globals define, module, require */\r\n if ( typeof define == 'function' && define.amd ) {\r\n // AMD\r\n define( [\r\n 'outlayer/outlayer',\r\n 'get-size/get-size'\r\n ],\r\n factory );\r\n } else if ( typeof module == 'object' && module.exports ) {\r\n // CommonJS\r\n module.exports = factory(\r\n require('outlayer'),\r\n require('get-size')\r\n );\r\n } else {\r\n // browser global\r\n window.Masonry = factory(\r\n window.Outlayer,\r\n window.getSize\r\n );\r\n }\r\n\r\n}( window, function factory( Outlayer, getSize ) {\r\n\r\n\r\n\r\n// -------------------------- masonryDefinition -------------------------- //\r\n\r\n // create an Outlayer layout class\r\n var Masonry = Outlayer.create('masonry');\r\n // isFitWidth -> fitWidth\r\n Masonry.compatOptions.fitWidth = 'isFitWidth';\r\n\r\n var proto = Masonry.prototype;\r\n\r\n proto._resetLayout = function() {\r\n this.getSize();\r\n this._getMeasurement( 'columnWidth', 'outerWidth' );\r\n this._getMeasurement( 'gutter', 'outerWidth' );\r\n this.measureColumns();\r\n\r\n // reset column Y\r\n this.colYs = [];\r\n for ( var i=0; i < this.cols; i++ ) {\r\n this.colYs.push( 0 );\r\n }\r\n\r\n this.maxY = 0;\r\n this.horizontalColIndex = 0;\r\n };\r\n\r\n proto.measureColumns = function() {\r\n this.getContainerWidth();\r\n // if columnWidth is 0, default to outerWidth of first item\r\n if ( !this.columnWidth ) {\r\n var firstItem = this.items[0];\r\n var firstItemElem = firstItem && firstItem.element;\r\n // columnWidth fall back to item of first element\r\n this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\r\n // if first elem has no width, default to size of container\r\n this.containerWidth;\r\n }\r\n\r\n var columnWidth = this.columnWidth += this.gutter;\r\n\r\n // calculate columns\r\n var containerWidth = this.containerWidth + this.gutter;\r\n var cols = containerWidth / columnWidth;\r\n // fix rounding errors, typically with gutters\r\n var excess = columnWidth - containerWidth % columnWidth;\r\n // if overshoot is less than a pixel, round up, otherwise floor it\r\n var mathMethod = excess && excess < 1 ? 'round' : 'floor';\r\n cols = Math[ mathMethod ]( cols );\r\n this.cols = Math.max( cols, 1 );\r\n };\r\n\r\n proto.getContainerWidth = function() {\r\n // container is parent if fit width\r\n var isFitWidth = this._getOption('fitWidth');\r\n var container = isFitWidth ? this.element.parentNode : this.element;\r\n // check that this.size and size are there\r\n // IE8 triggers resize on body size change, so they might not be\r\n var size = getSize( container );\r\n this.containerWidth = size && size.innerWidth;\r\n };\r\n\r\n proto._getItemLayoutPosition = function( item ) {\r\n item.getSize();\r\n // how many columns does this brick span\r\n var remainder = item.size.outerWidth % this.columnWidth;\r\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\r\n // round if off by 1 pixel, otherwise use ceil\r\n var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\r\n colSpan = Math.min( colSpan, this.cols );\r\n // use horizontal or top column position\r\n var colPosMethod = this.options.horizontalOrder ?\r\n '_getHorizontalColPosition' : '_getTopColPosition';\r\n var colPosition = this[ colPosMethod ]( colSpan, item );\r\n // position the brick\r\n var position = {\r\n x: this.columnWidth * colPosition.col,\r\n y: colPosition.y\r\n };\r\n // apply setHeight to necessary columns\r\n var setHeight = colPosition.y + item.size.outerHeight;\r\n var setMax = colSpan + colPosition.col;\r\n for ( var i = colPosition.col; i < setMax; i++ ) {\r\n this.colYs[i] = setHeight;\r\n }\r\n\r\n return position;\r\n };\r\n\r\n proto._getTopColPosition = function( colSpan ) {\r\n var colGroup = this._getTopColGroup( colSpan );\r\n // get the minimum Y value from the columns\r\n var minimumY = Math.min.apply( Math, colGroup );\r\n\r\n return {\r\n col: colGroup.indexOf( minimumY ),\r\n y: minimumY,\r\n };\r\n };\r\n\r\n /**\r\n * @param {Number} colSpan - number of columns the element spans\r\n * @returns {Array} colGroup\r\n */\r\n proto._getTopColGroup = function( colSpan ) {\r\n if ( colSpan < 2 ) {\r\n // if brick spans only one column, use all the column Ys\r\n return this.colYs;\r\n }\r\n\r\n var colGroup = [];\r\n // how many different places could this brick fit horizontally\r\n var groupCount = this.cols + 1 - colSpan;\r\n // for each group potential horizontal position\r\n for ( var i = 0; i < groupCount; i++ ) {\r\n colGroup[i] = this._getColGroupY( i, colSpan );\r\n }\r\n return colGroup;\r\n };\r\n\r\n proto._getColGroupY = function( col, colSpan ) {\r\n if ( colSpan < 2 ) {\r\n return this.colYs[ col ];\r\n }\r\n // make an array of colY values for that one group\r\n var groupColYs = this.colYs.slice( col, col + colSpan );\r\n // and get the max value of the array\r\n return Math.max.apply( Math, groupColYs );\r\n };\r\n\r\n // get column position based on horizontal index. #873\r\n proto._getHorizontalColPosition = function( colSpan, item ) {\r\n var col = this.horizontalColIndex % this.cols;\r\n var isOver = colSpan > 1 && col + colSpan > this.cols;\r\n // shift to next row if item can't fit on current row\r\n col = isOver ? 0 : col;\r\n // don't let zero-size items take up space\r\n var hasSize = item.size.outerWidth && item.size.outerHeight;\r\n this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\r\n\r\n return {\r\n col: col,\r\n y: this._getColGroupY( col, colSpan ),\r\n };\r\n };\r\n\r\n proto._manageStamp = function( stamp ) {\r\n var stampSize = getSize( stamp );\r\n var offset = this._getElementOffset( stamp );\r\n // get the columns that this stamp affects\r\n var isOriginLeft = this._getOption('originLeft');\r\n var firstX = isOriginLeft ? offset.left : offset.right;\r\n var lastX = firstX + stampSize.outerWidth;\r\n var firstCol = Math.floor( firstX / this.columnWidth );\r\n firstCol = Math.max( 0, firstCol );\r\n var lastCol = Math.floor( lastX / this.columnWidth );\r\n // lastCol should not go over if multiple of columnWidth #425\r\n lastCol -= lastX % this.columnWidth ? 0 : 1;\r\n lastCol = Math.min( this.cols - 1, lastCol );\r\n // set colYs to bottom of the stamp\r\n\r\n var isOriginTop = this._getOption('originTop');\r\n var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\r\n stampSize.outerHeight;\r\n for ( var i = firstCol; i <= lastCol; i++ ) {\r\n this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\r\n }\r\n };\r\n\r\n proto._getContainerSize = function() {\r\n this.maxY = Math.max.apply( Math, this.colYs );\r\n var size = {\r\n height: this.maxY\r\n };\r\n\r\n if ( this._getOption('fitWidth') ) {\r\n size.width = this._getContainerFitWidth();\r\n }\r\n\r\n return size;\r\n };\r\n\r\n proto._getContainerFitWidth = function() {\r\n var unusedCols = 0;\r\n // count unused columns\r\n var i = this.cols;\r\n while ( --i ) {\r\n if ( this.colYs[i] !== 0 ) {\r\n break;\r\n }\r\n unusedCols++;\r\n }\r\n // fit container to columns that have been used\r\n return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\r\n };\r\n\r\n proto.needsResizeLayout = function() {\r\n var previousWidth = this.containerWidth;\r\n this.getContainerWidth();\r\n return previousWidth != this.containerWidth;\r\n };\r\n\r\n return Masonry;\r\n\r\n}));"]}