",document.body.appendChild(c),$(c).find(".close").click($.proxy(this.removeMessage_,this)),b.behavior&&b.behavior(c)},a.NotificationController.prototype.removeMessage_=function(){var a=$("#user-message");a.length&&a.remove()}}(),function(){var a=$.namespace("pskl.controller.settings");a.ApplicationSettingsController=function(){},a.ApplicationSettingsController.prototype.init=function(){var a=pskl.UserSettings.get(pskl.UserSettings.CANVAS_BACKGROUND);$("#background-picker-wrapper").find(".background-picker[data-background-class="+a+"]").addClass("selected");var b=pskl.UserSettings.get(pskl.UserSettings.GRID_WIDTH);$("#grid-width").val(b),$("#grid-width").change(this.onGridWidthChange.bind(this)),$("#background-picker-wrapper").click(this.onBackgroundClick.bind(this))},a.ApplicationSettingsController.prototype.onGridWidthChange=function(){var a=$("#grid-width").val();pskl.UserSettings.set(pskl.UserSettings.GRID_WIDTH,parseInt(a,10))},a.ApplicationSettingsController.prototype.onBackgroundClick=function(a){var b=$(a.target).closest(".background-picker");if(b.length){var c=b.data("background-class");pskl.UserSettings.set(pskl.UserSettings.CANVAS_BACKGROUND,c),$(".background-picker").removeClass("selected"),b.addClass("selected")}}}(),function(){var a=$.namespace("pskl.controller.settings");a.ResizeController=function(a){this.piskelController=a},a.ResizeController.prototype.init=function(){this.resizeWidth=$("[name=resize-width]"),this.resizeHeight=$("[name=resize-height]"),this.resizeWidth.val(this.piskelController.getWidth()),this.resizeHeight.val(this.piskelController.getHeight()),this.cancelButton=$(".resize-cancel-button"),this.cancelButton.click(this.onCancelButtonClicked_.bind(this)),this.resizeForm=$("[name=resize-form]"),this.resizeForm.submit(this.onResizeFormSubmit_.bind(this))},a.ResizeController.prototype.onResizeFormSubmit_=function(a){a.originalEvent.preventDefault();for(var b=parseInt(this.resizeWidth.val(),10),c=parseInt(this.resizeHeight.val(),10),d=[],e=this.piskelController.getLayers(),f=0;f"},a.GifExportController.prototype.getSelectedZoom_=function(){var a=this.uploadForm.get(0).querySelectorAll("[name=gif-zoom-level]"),b=Array.prototype.slice.call(a,0),c=b.filter(function(a){return!!a.checked});if(1==c.length)return c[0].value;throw"Unexpected error when retrieving selected zoom"},a.GifExportController.prototype.createRadioElements_=function(){for(var b=a.GifExportController.RESOLUTIONS,c=0;cb&&(a=a.substring(0,b),a+=c),a}}(),function(){var a=$.namespace("pskl.controller.settings"),b=60;a.PngExportController=function(a){this.piskelController=a},a.PngExportController.prototype.init=function(){this.previewContainerEl=document.querySelectorAll(".png-export-preview")[0],this.uploadStatusContainerEl=document.querySelectorAll(".png-upload-status")[0],this.uploadForm=$("[name=png-export-upload-form]"),this.uploadForm.submit(this.onUploadFormSubmit_.bind(this)),this.updatePreview_(this.getFramesheetAsBase64Png())},a.PngExportController.prototype.onUploadFormSubmit_=function(a){a.originalEvent.preventDefault(),this.previewContainerEl.classList.add("preview-upload-ongoing"),pskl.app.imageUploadService.upload(this.getFramesheetAsBase64Png(),this.onImageUploadCompleted_.bind(this))},a.PngExportController.prototype.getFramesheetAsBase64Png=function(){var a=new pskl.rendering.PiskelRenderer(this.piskelController),b=a.renderAsCanvas();return b.toDataURL("image/png")},a.PngExportController.prototype.onImageUploadCompleted_=function(a){this.updatePreview_(a),this.updateStatus_(a),this.previewContainerEl.classList.remove("preview-upload-ongoing")},a.PngExportController.prototype.updateStatus_=function(a){if(a){var c="{{shortLink}}",d=pskl.utils.Template.replace(c,{link:a,shortLink:this.shorten_(a,b,"...")});this.uploadStatusContainerEl.innerHTML="Your image is now available at : "+d}},a.PngExportController.prototype.updatePreview_=function(a){this.previewContainerEl.innerHTML=""},a.PngExportController.prototype.shorten_=function(a,b,c){return a.length>b&&(a=a.substring(0,b),a+=c),a}}(),function(){var a=$.namespace("pskl.controller.settings");a.LocalStorageController=function(){},a.LocalStorageController.prototype.init=function(){this.localStorageItemTemplate_=pskl.utils.Template.get("local-storage-item-template"),this.service_=pskl.app.localStorageService,this.piskelsList=$(".local-piskels-list"),this.fillLocalPiskelsList_(),this.piskelsList.click(this.onPiskelsListClick_.bind(this))},a.LocalStorageController.prototype.onPiskelsListClick_=function(a){var b=a.target.getAttribute("data-action"),c=a.target.getAttribute("data-name");"load"===b?window.confirm("This will erase your current piskel. Continue ?")&&(this.service_.load(c),$.publish(Events.CLOSE_SETTINGS_DRAWER)):"delete"===b&&window.confirm("This will permanently DELETE this piskel from your computer. Continue ?")&&(this.service_.remove(c),$.publish(Events.CLOSE_SETTINGS_DRAWER))},a.LocalStorageController.prototype.fillLocalPiskelsList_=function(){var a="",b=this.service_.getKeys(),c=function(a){return 10>a?"0"+a:""+a};b.sort(function(a,b){return a.dateb.date?-1:0}),b.forEach(function(b){var d=new Date(b.date),e=pskl.utils.Template.replace("{{Y}}/{{M}}/{{D}} {{H}}:{{m}}",{Y:d.getFullYear(),M:c(d.getMonth()+1),D:c(d.getDate()),H:c(d.getHours()),m:c(d.getMinutes())});a+=pskl.utils.Template.replace(this.localStorageItemTemplate_,{name:b.name,date:e})}.bind(this));var d=this.piskelsList.get(0).tBodies[0];d.innerHTML=a}}(),function(){var a=$.namespace("pskl.controller.settings");a.SaveController=function(a){this.piskelController=a},a.SaveController.prototype.init=function(){this.saveForm=$("form[name=save-form]"),this.nameInput=$("#save-name"),this.descriptionInput=$("#save-description"),this.isPublicCheckbox=$("input[name=save-public-checkbox]"),this.saveCloudButton=$("#save-cloud-button"),this.saveLocalButton=$("#save-local-button"),this.piskelName=$(".piskel-name").get(0),this.status=$("#save-status");var a=this.piskelController.piskel.getDescriptor();this.nameInput.val(a.name),this.descriptionInput.val(a.description),this.isPublicCheckbox.prop("checked",a.isPublic),pskl.app.isLoggedIn()?this.saveForm.submit(this.onSaveFormSubmit_.bind(this)):(this.saveCloudButton.attr("disabled","disabled"),this.status.html("You are not logged in. Only Local Save is available.")),this.saveLocalButton.click(this.onSaveLocalClick_.bind(this))},a.SaveController.prototype.onSaveFormSubmit_=function(a){a.preventDefault(),a.stopPropagation();var b=this.getName(),c=this.getDescription(),d=!!this.isPublicCheckbox.prop("checked"),e=new pskl.model.piskel.Descriptor(b,c,d);this.piskelController.piskel.setDescriptor(e),this.beforeSaving_(),pskl.app.store({success:this.onSaveSuccess_.bind(this),error:this.onSaveError_.bind(this),after:this.afterSaving_.bind(this)})},a.SaveController.prototype.onSaveLocalClick_=function(){var a=pskl.app.localStorageService,b=!0,c=this.getName(),d=this.getDescription();a.getPiskel(c)&&(b=window.confirm("There is already a piskel saved as "+c+". Override ?")),b&&(this.beforeSaving_(),a.save(c,d,pskl.app.piskelController.serialize()),window.setTimeout(function(){this.onSaveSuccess_(),this.afterSaving_()}.bind(this),1e3))},a.SaveController.prototype.getName=function(){return this.nameInput.val()},a.SaveController.prototype.getDescription=function(){return this.descriptionInput.val()},a.SaveController.prototype.beforeSaving_=function(){this.saveCloudButton.attr("disabled",!0),this.status.html("Saving ..."),this.piskelName&&this.piskelName.classList.add("piskel-name-saving")},a.SaveController.prototype.onSaveSuccess_=function(){$.publish(Events.CLOSE_SETTINGS_DRAWER),$.publish(Events.SHOW_NOTIFICATION,[{content:"Successfully saved !"}]),$.publish(Events.PISKEL_SAVED)},a.SaveController.prototype.onSaveError_=function(a){$.publish(Events.SHOW_NOTIFICATION,[{content:"Saving failed ("+a+")"}])},a.SaveController.prototype.afterSaving_=function(){this.saveCloudButton.attr("disabled",!1),this.status.html(""),this.piskelName&&this.piskelName.classList.remove("piskel-name-saving"),window.setTimeout($.publish.bind($,Events.HIDE_NOTIFICATION),2e3)}}(),function(){var a=$.namespace("pskl.controller.settings"),b="No file selected ...",c=60;a.ImportController=function(a){this.piskelController=a,this.importedImage_=null},a.ImportController.prototype.init=function(){this.importForm=$("[name=import-form]"),this.hiddenFileInput=$("[name=file-upload-input]"),this.fileInputButton=$(".file-input-button"),this.fileInputStatus=$(".file-input-status"),this.fileInputStatus.html(b),this.importPreview=$(".import-section-preview"),this.resizeWidth=$("[name=resize-width]"),this.resizeHeight=$("[name=resize-height]"),this.smoothResize=$("[name=smooth-resize-checkbox]"),this.submitButton=$("[name=import-submit]"),this.importForm.submit(this.onImportFormSubmit_.bind(this)),this.hiddenFileInput.change(this.onFileUploadChange_.bind(this)),this.fileInputButton.click(this.onFileInputClick_.bind(this)),this.resizeWidth.keyup(this.onResizeInputKeyUp_.bind(this,"width")),this.resizeHeight.keyup(this.onResizeInputKeyUp_.bind(this,"height"))},a.ImportController.prototype.reset_=function(){this.importForm.get(0).reset(),this.fileInputStatus.html(b),$.publish(Events.CLOSE_SETTINGS_DRAWER)},a.ImportController.prototype.onResizeInputKeyUp_=function(a,b){this.importedImage_&&this.synchronizeResizeFields_(b.target.value,a)},a.ImportController.prototype.synchronizeResizeFields_=function(a,b){a=parseInt(a,10),isNaN(a)&&(a=0);var c=this.importedImage_.height,d=this.importedImage_.width;"width"===b?this.resizeHeight.val(Math.round(a*c/d)):this.resizeWidth.val(Math.round(a*d/c))},a.ImportController.prototype.onImportFormSubmit_=function(a){a.originalEvent.preventDefault(),this.importImageToPiskel_()},a.ImportController.prototype.onFileUploadChange_=function(){this.importFromFile_()},a.ImportController.prototype.onFileInputClick_=function(){this.hiddenFileInput.click()},a.ImportController.prototype.importFromFile_=function(){var a=this.hiddenFileInput.get(0).files;if(1==a.length){var b=a[0];if(!this.isImage_(b))throw this.reset_(),"File is not an image : "+b.type;this.readImageFile_(b),this.enableDisabledSections_()}},a.ImportController.prototype.enableDisabledSections_=function(){this.resizeWidth.removeAttr("disabled"),this.resizeHeight.removeAttr("disabled"),this.smoothResize.removeAttr("disabled"),this.submitButton.removeAttr("disabled"),this.fileInputButton.removeClass("button-primary"),this.fileInputButton.blur(),$(".import-section-disabled").removeClass("import-section-disabled")},a.ImportController.prototype.readImageFile_=function(a){pskl.utils.FileUtils.readFile(a,this.processImageSource_.bind(this))},a.ImportController.prototype.processImageSource_=function(a){this.importedImage_=new Image,this.importedImage_.onload=this.onImageLoaded_.bind(this),this.importedImage_.src=a},a.ImportController.prototype.onImageLoaded_=function(){var a=this.importedImage_.width,b=this.importedImage_.height,c=this.hiddenFileInput.val(),d=this.extractFileNameFromPath_(c);this.fileInputStatus.html(d),this.resizeWidth.val(a),this.resizeHeight.val(b),this.importPreview.width("auto"),this.importPreview.html(""),this.importPreview.append(this.createImagePreview_())},a.ImportController.prototype.createImagePreview_=function(){var a=document.createElement("IMG");return a.src=this.importedImage_.src,a.setAttribute("height",c),a},a.ImportController.prototype.extractFileNameFromPath_=function(a){var b=[];return b=-1!==a.indexOf("/")?a.split("/"):-1!==a.indexOf("\\")?a.split("\\"):[a],b[b.length-1]},a.ImportController.prototype.importImageToPiskel_=function(){if(this.importedImage_&&window.confirm("You are about to create a new Piskel, unsaved changes will be lost.")){var a=this.resizeWidth.val(),b=this.resizeHeight.val(),c=!!this.smoothResize.prop("checked"),d=pskl.utils.ImageResizer.resize(this.importedImage_,a,b,c),e=pskl.utils.FrameUtils.createFromImage(d),f=pskl.model.Layer.fromFrames("Layer 1",[e]),g=new pskl.model.piskel.Descriptor("Imported piskel",""),h=pskl.model.Piskel.fromLayers([f],g);pskl.app.piskelController.setPiskel(h),pskl.app.animationController.setFPS(Constants.DEFAULT.FPS),this.reset_()
-}},a.ImportController.prototype.isImage_=function(a){return 0===a.type.indexOf("image")}}(),function(){var a=$.namespace("pskl.controller.settings"),b={user:{template:"templates/settings/application.html",controller:a.ApplicationSettingsController},resize:{template:"templates/settings/resize.html",controller:a.ResizeController},gif:{template:"templates/settings/export-gif.html",controller:a.GifExportController},png:{template:"templates/settings/export-png.html",controller:a.PngExportController},"import":{template:"templates/settings/import.html",controller:a.ImportController},localstorage:{template:"templates/settings/localstorage.html",controller:a.LocalStorageController},save:{template:"templates/settings/save.html",controller:a.SaveController}},c="has-expanded-drawer",d="expanded";a.SettingsController=function(a){this.piskelController=a,this.drawerContainer=document.getElementById("drawer-container"),this.settingsContainer=$("[data-pskl-controller=settings]"),this.isExpanded=!1,this.currentSetting=null},a.SettingsController.prototype.init=function(){$("[data-setting]").click(this.onSettingIconClick.bind(this)),$("body").click(this.onBodyClick.bind(this)),$.subscribe(Events.CLOSE_SETTINGS_DRAWER,this.closeDrawer.bind(this))},a.SettingsController.prototype.onSettingIconClick=function(a){var b=a.originalEvent.currentTarget,c=b.getAttribute("data-setting");this.currentSetting!=c?this.loadSetting(c):this.closeDrawer(),a.originalEvent.stopPropagation(),a.originalEvent.preventDefault()},a.SettingsController.prototype.onBodyClick=function(a){var b=a.target,c=pskl.utils.Dom.isParent(b,this.drawerContainer),d=b.getAttribute("data-setting"),e=c||d;this.isExpanded&&!e&&this.closeDrawer()},a.SettingsController.prototype.loadSetting=function(a){this.drawerContainer.innerHTML=pskl.utils.Template.get(b[a].template),new b[a].controller(this.piskelController).init(),this.settingsContainer.addClass(d),$("."+c).removeClass(c),$("[data-setting="+a+"]").addClass(c),this.isExpanded=!0,this.currentSetting=a},a.SettingsController.prototype.closeDrawer=function(){this.settingsContainer.removeClass(d),$("."+c).removeClass(c),this.isExpanded=!1,this.currentSetting=null}}(),function(){var a=$.namespace("pskl.controller.dialogs"),b=window.tinycolor,c="selected",d="palette-manager-new-color",e="palette-manager-delete-card",f="palette-manager-details-head-edit-icon";a.PaletteManagerController=function(a){this.piskelController=a,this.palettes=this.retrieveUserPalettes(),this.originalPalettes=this.retrieveUserPalettes(),this.selectedPaletteId=null},a.PaletteManagerController.prototype.init=function(){this.palettesList=document.querySelector(".palette-manager-list"),this.paletteBody=document.querySelector(".palette-manager-details-body"),this.paletteHead=document.querySelector(".palette-manager-details-head"),this.createButton=document.querySelector('.palette-manager-actions-button[data-action="create"]'),this.saveAllButton=document.querySelector('.palette-manager-actions-button[data-action="save-all"]'),this.closeButton=document.querySelector(".palette-manager-close"),this.colorCardTemplate=pskl.utils.Template.get("palette-color-card-template"),this.newColorTemplate=pskl.utils.Template.get("palette-new-color-template"),this.paletteHeadTemplate=pskl.utils.Template.get("palette-details-head-template"),this.palettesList.addEventListener("click",this.onPaletteListClick.bind(this)),this.paletteBody.addEventListener("click",this.delegatedPaletteBodyClick.bind(this)),this.paletteHead.addEventListener("click",this.delegatedPaletteHeadClick.bind(this)),this.createButton.addEventListener("click",this.createPalette.bind(this)),this.saveAllButton.addEventListener("click",this.saveAll.bind(this)),this.closeButton.addEventListener("click",this.closeDialog.bind(this)),this.createPaletteListMarkup(),this.palettes.length>0?this.selectPalette(this.palettes[0].id):console.error("[PaletteManagerController] >>> Implement fallback screen when no palette can be retrieved")},a.PaletteManagerController.prototype.destroy=function(){this.destroySpectrumPickers()},a.PaletteManagerController.prototype.closeDialog=function(){$.publish(Events.DIALOG_HIDE)},a.PaletteManagerController.prototype.createPalette=function(){var a=window.prompt("Please enter a name for your palette","New palette");if(a){var b=this.createPaletteObject(a);this.palettes.push(b),this.createPaletteListMarkup(),this.selectPalette(b.id)}},a.PaletteManagerController.prototype.createPaletteObject=function(a){return{id:"palette-"+Date.now()+"-"+Math.floor(1e3*Math.random()),name:a,colors:[]}},a.PaletteManagerController.prototype.selectPalette=function(a){this.deselectCurrentPalette();var b=this.palettesList.querySelector("[data-palette-id="+a+"]");b&&(this.selectedPaletteId=a,b.classList.add(c),this.refreshPaletteDetails())},a.PaletteManagerController.prototype.refreshPaletteDetails=function(){this.destroySpectrumPickers(),this.createPaletteHeadMarkup(),this.createPaletteBodyMarkup(),this.initPaletteDetailsEvents(),this.initPaletteCardsSpectrum()},a.PaletteManagerController.prototype.createPaletteListMarkup=function(){var a=this.palettes.map(function(a){var b={id:a.id,name:this.isPaletteModified(a)?a.name+" *":a.name};return pskl.utils.Template.replace('
{{name}}
',b)}.bind(this)).join("");this.palettesList.innerHTML=a},a.PaletteManagerController.prototype.createPaletteHeadMarkup=function(){var a=this.getSelectedPalette(),b={name:a.name,"save:disabled":!this.isPaletteModified(a),"revert:disabled":!this.isPaletteModified(a),"delete:disabled":this.palettes.length<2},c=pskl.utils.Template.replace(this.paletteHeadTemplate,b);this.paletteHead.innerHTML=c},a.PaletteManagerController.prototype.isPaletteModified=function(a){var b=!1,c=this.getPaletteById(a.id,this.originalPalettes);if(c){var d=c.name!==a.name,e=a.colors.join("")!==c.colors.join("");b=d||e}else b=!0;return b},a.PaletteManagerController.prototype.createPaletteBodyMarkup=function(){var a=this.getSelectedPalette(),b=this.getColorCardsMarkup(a.colors);b+=pskl.utils.Template.replace(this.newColorTemplate,{classname:d}),this.paletteBody.innerHTML=b},a.PaletteManagerController.prototype.initPaletteDetailsEvents=function(){var a=this.paletteBody.querySelector("."+d);if(a.addEventListener("click",this.onNewCardClick.bind(this)),this.palettes.length<2){var b=this.paletteHead.querySelector('.palette-manager-palette-button[data-action="delete"]');b.setAttribute("disabled","disabled")}},a.PaletteManagerController.prototype.onNewCardClick=function(){var a,b=this.getSelectedPalette();a=b&&b.colors.length>0?b.colors[b.colors.length-1]:"#FFFFFF",this.addColorInSelectedPalette(a)},a.PaletteManagerController.prototype.delegatedPaletteBodyClick=function(a){var b=a.target;if(b.classList.contains(e)){var c=parseInt(b.parentNode.dataset.colorId,10);this.removeColorInSelectedPalette(c)}},a.PaletteManagerController.prototype.delegatedPaletteHeadClick=function(a){var b=a.target;if(b.classList.contains(f))this.renameSelectedPalette();else if(b.classList.contains("palette-manager-palette-button")){var c=b.dataset.action;"save"===c?this.savePaletteAndRedraw(this.getSelectedPalette().id):"revert"===c?this.revertChanges():"delete"===c&&this.deleteSelectedPalette()}},a.PaletteManagerController.prototype.getSpectrumSelector_=function(){return":not(."+d+")>.palette-manager-color-square"},a.PaletteManagerController.prototype.initPaletteCardsSpectrum=function(){var a=this,b=$(this.getSpectrumSelector_());b.spectrum({clickoutFiresChange:!0,showInput:!0,showButtons:!1,change:function(b){var c=this,d=parseInt(c.parentNode.dataset.colorId,10);a.updateColorInSelectedPalette(d,b)},beforeShow:function(){var c=this,d=parseInt(c.parentNode.dataset.colorId,10),e=a.getSelectedPalette(),f=e.colors[d];b.spectrum("set",f)}})},a.PaletteManagerController.prototype.destroySpectrumPickers=function(){var a=$(this.getSpectrumSelector_());a&&a.spectrum("destroy")},a.PaletteManagerController.prototype.updateColorInSelectedPalette=function(a,b){var c=this.getSelectedPalette();c.colors.splice(a,1,"#"+b.toHex().toUpperCase()),this.createPaletteListMarkup(),this.selectPalette(this.selectedPaletteId)},a.PaletteManagerController.prototype.addColorInSelectedPalette=function(a){var b=this.getSelectedPalette();b.colors.push(a),this.createPaletteListMarkup(),this.selectPalette(this.selectedPaletteId)},a.PaletteManagerController.prototype.removeColorInSelectedPalette=function(a){var b=this.getSelectedPalette();b.colors.splice(a,1),this.createPaletteListMarkup(),this.selectPalette(this.selectedPaletteId)},a.PaletteManagerController.prototype.renameSelectedPalette=function(){var a=this.getSelectedPalette(),b=window.prompt('Please enter a new name for palette "'+a.name+'"',a.name);b&&(a.name=b,this.createPaletteListMarkup(),this.selectPalette(a.id))},a.PaletteManagerController.prototype.getSelectedPalette=function(){return this.getPaletteById(this.selectedPaletteId,this.palettes)},a.PaletteManagerController.prototype.getColorCardsMarkup=function(a){var c=a.map(function(a,c){var d={colorId:c,hex:a,rgb:b(a).toRgbString(),hsl:b(a).toHslString()};return pskl.utils.Template.replace(this.colorCardTemplate,d)}.bind(this)).join("");return c},a.PaletteManagerController.prototype.getPaletteById=function(a,b){var c=null;return b.forEach(function(b){b.id===a&&(c=b)}),c},a.PaletteManagerController.prototype.removePaletteById=function(a,b){var c=this.getPaletteById(a,b);if(c){var d=b.indexOf(c);b.splice(d,1)}},a.PaletteManagerController.prototype.deselectCurrentPalette=function(){var a=this.palettesList.querySelector("."+c);a&&(this.selectedPaletteId=null,a.classList.remove(c))},a.PaletteManagerController.prototype.revertChanges=function(){var a=this.getSelectedPalette(),b=this.getPaletteById(a.id,this.originalPalettes);a.name=b.name,a.colors=b.colors.slice(0),this.createPaletteListMarkup(),this.selectPalette(a.id)},a.PaletteManagerController.prototype.deleteSelectedPalette=function(){var a=this.getSelectedPalette();this.palettes.length>1&&window.confirm('Are you sure you want to delete "'+a.name+'" ?')&&(this.removePaletteById(a.id,this.palettes),this.removePaletteById(a.id,this.originalPalettes),this.persistToLocalStorage(),this.createPaletteListMarkup(),this.selectPalette(this.palettes[0].id))},a.PaletteManagerController.prototype.onPaletteListClick=function(a){var b=a.target;b.dataset.paletteId&&this.selectPalette(b.dataset.paletteId)},a.PaletteManagerController.prototype.saveAll=function(){this.palettes.forEach(function(a){this.savePalette(a.id)}.bind(this)),this.createPaletteListMarkup(),this.selectPalette(this.getSelectedPalette().id)},a.PaletteManagerController.prototype.savePalette=function(a){var b=this.getPaletteById(a,this.palettes),c=this.getPaletteById(a,this.originalPalettes);c?(c.name=b.name,c.colors=b.colors):this.originalPalettes.push(b),this.persistToLocalStorage()},a.PaletteManagerController.prototype.savePaletteAndRedraw=function(a){this.savePalette(a),this.createPaletteListMarkup(),this.selectPalette(this.getSelectedPalette().id)},a.PaletteManagerController.prototype.persistToLocalStorage=function(){window.localStorage.setItem("piskel.palettes",JSON.stringify(this.originalPalettes)),this.originalPalettes=this.retrieveUserPalettes(),$.publish(Events.PALETTE_LIST_UPDATED)},a.PaletteManagerController.prototype.retrieveUserPalettes=function(){var a=window.localStorage.getItem("piskel.palettes");return JSON.parse(a)||[this.createPaletteObject("New palette")]}}(),function(){var a=$.namespace("pskl.controller.dialogs"),b={"manage-palettes":{template:"templates/dialogs/manage-palettes.html",controller:a.PaletteManagerController}};a.DialogsController=function(a){this.piskelController=a,this.currentDialog_=null},a.DialogsController.prototype.init=function(){this.dialogContainer_=document.getElementById("dialog-container"),this.dialogWrapper_=document.getElementById("dialog-container-wrapper"),$.subscribe(Events.DIALOG_DISPLAY,this.onDialogDisplayEvent_.bind(this)),$.subscribe(Events.DIALOG_HIDE,this.onDialogHideEvent_.bind(this)),pskl.app.shortcutService.addShortcut("alt+P",this.onDialogDisplayEvent_.bind(this,null,"manage-palettes"))},a.DialogsController.prototype.onDialogDisplayEvent_=function(a,c){if(!this.isDisplayed()){var d=b[c];if(d){this.dialogContainer_.innerHTML=pskl.utils.Template.get(d.template);var e=new d.controller(this.piskelController);e.init(),this.showDialogWrapper_(),this.currentDialog_={id:c,controller:e}}else console.error("Could not find dialog configuration for dialogId : "+c)}},a.DialogsController.prototype.onDialogHideEvent_=function(){this.hideDialog()},a.DialogsController.prototype.showDialogWrapper_=function(){pskl.app.shortcutService.addShortcut("ESC",this.hideDialog.bind(this)),this.dialogWrapper_.classList.add("show")},a.DialogsController.prototype.hideDialog=function(){var a=this.currentDialog_;a&&a.controller.destroy(),this.hideDialogWrapper_(),this.currentDialog_=null},a.DialogsController.prototype.hideDialogWrapper_=function(){pskl.app.shortcutService.removeShortcut("ESC"),this.dialogWrapper_.classList.remove("show")},a.DialogsController.prototype.isDisplayed=function(){return null!==this.currentDialog_}}(),function(){var a=$.namespace("pskl.service");a.LocalStorageService=function(a){if(void 0===a)throw"Bad LocalStorageService initialization: ";this.piskelController=a},a.LocalStorageService.prototype.init=function(){},a.LocalStorageService.prototype.save=function(a,b,c){this.removeFromKeys_(a),this.addToKeys_(a,b,Date.now()),window.localStorage.setItem("piskel."+a,c)},a.LocalStorageService.prototype.load=function(a){var b=this.getPiskel(a),c=this.getKey_(a);pskl.utils.serialization.Deserializer.deserialize(JSON.parse(b),function(b){b.setDescriptor(new pskl.model.piskel.Descriptor(a,c.description,!0)),pskl.app.piskelController.setPiskel(b)})},a.LocalStorageService.prototype.remove=function(a){this.removeFromKeys_(a),window.localStorage.removeItem("piskel."+a)},a.LocalStorageService.prototype.saveKeys_=function(a){window.localStorage.setItem("piskel.keys",JSON.stringify(a))},a.LocalStorageService.prototype.removeFromKeys_=function(a){var b=this.getKeys(),c=b.filter(function(b){return b.name!==a});this.saveKeys_(c)},a.LocalStorageService.prototype.getKey_=function(a){var b=this.getKeys().filter(function(b){return b.name===a});return b.length>0?b[0]:null},a.LocalStorageService.prototype.addToKeys_=function(a,b,c){var d=this.getKeys();d.push({name:a,description:b,date:c}),this.saveKeys_(d)},a.LocalStorageService.prototype.getPiskel=function(a){return window.localStorage.getItem("piskel."+a)},a.LocalStorageService.prototype.getKeys=function(){var a=window.localStorage.getItem("piskel.keys");return JSON.parse(a)||[]}}(),function(){var a=$.namespace("pskl.service");a.GithubStorageService=function(a){this.piskelController=a},a.GithubStorageService.prototype.init=function(){},a.GithubStorageService.prototype.store=function(){var a=new XMLHttpRequest,b=new FormData;b.append("framesheet_content",this.piskelController.serialize()),b.append("fps_speed",this.piskelController.getFPS()),a.open("POST",Constants.STATIC.URL.SAVE,!0),a.onload=function(a){if(200==this.status){var b=window.location.href.replace(window.location.search,"");window.location.href=b+"?frameId="+this.responseText}else this.onerror(a)},a.onerror=function(){$.publish(Events.SHOW_NOTIFICATION,[{content:"Saving failed ("+this.status+")"}])},a.send(b)}}(),function(){var a=$.namespace("pskl.service");a.AppEngineStorageService=function(a){this.piskelController=a},a.AppEngineStorageService.prototype.init=function(){},a.AppEngineStorageService.prototype.store=function(a){var b=this.prepareFormData_(),c=new XMLHttpRequest;c.open("POST",Constants.APPENGINE.URL.SAVE,!0),c.onload=function(b){200==this.status?(a.success(),a.after()):this.onerror(b)},c.onerror=function(){a.error(this.status),a.after()},c.send(b)},a.AppEngineStorageService.prototype.prepareFormData_=function(){var a=this.piskelController.piskel,b=a.getDescriptor(),c=new FormData;return c.append("framesheet",this.piskelController.serialize()),c.append("fps",this.piskelController.getFPS()),c.append("name",b.name),c.append("description",b.description),b.isPublic&&c.append("public",!0),c.append("frames",this.piskelController.getFrameCount()),c.append("first_frame_as_png",pskl.app.getFirstFrameAsPng()),c.append("framesheet_as_png",pskl.app.getFramesheetAsPng()),c}}(),function(){var a=$.namespace("pskl.service");a.HistoryService=function(a){this.piskelController=a,this.saveState__b=this.saveState.bind(this)},a.HistoryService.prototype.init=function(){$.subscribe(Events.PISKEL_RESET,this.saveState__b),$.subscribe(Events.TOOL_RELEASED,this.saveState__b),pskl.app.shortcutService.addShortcut("ctrl+Z",this.undo.bind(this)),pskl.app.shortcutService.addShortcut("ctrl+Y",this.redo.bind(this))},a.HistoryService.prototype.saveState=function(){this.piskelController.getCurrentFrame().saveState()},a.HistoryService.prototype.undo=function(){this.piskelController.getCurrentFrame().loadPreviousState(),$.unsubscribe(Events.PISKEL_RESET,this.saveState__b),$.publish(Events.PISKEL_RESET),$.subscribe(Events.PISKEL_RESET,this.saveState__b)},a.HistoryService.prototype.redo=function(){this.piskelController.getCurrentFrame().loadNextState(),$.unsubscribe(Events.PISKEL_RESET,this.saveState__b),$.publish(Events.PISKEL_RESET),$.subscribe(Events.PISKEL_RESET,this.saveState__b)}}(),function(){var a=$.namespace("pskl.service");a.SavedStatusService=function(a){this.piskelController_=a},a.SavedStatusService.prototype.init=function(){$.subscribe(Events.TOOL_RELEASED,this.onToolReleased.bind(this)),$.subscribe(Events.PISKEL_RESET,this.onPiskelReset.bind(this)),$.subscribe(Events.PISKEL_SAVED,this.onPiskelSaved.bind(this)),window.addEventListener("beforeunload",this.onBeforeUnload.bind(this))},a.SavedStatusService.prototype.onPiskelReset=function(){var a=this.piskelController_.piskel;a.firstResetDone_?this.updateDirtyStatus(!0):a.firstResetDone_=!0},a.SavedStatusService.prototype.onToolReleased=function(){this.updateDirtyStatus(!0)},a.SavedStatusService.prototype.onPiskelSaved=function(){this.updateDirtyStatus(!1)},a.SavedStatusService.prototype.updateDirtyStatus=function(a){var b=this.piskelController_.piskel;b.isDirty_!==a&&(b.isDirty_=a,this.updatePiskelName())},a.SavedStatusService.prototype.updatePiskelName=function(){var a=this.piskelController_.piskel,b=a.getDescriptor().name;a.isDirty_?$(".piskel-name").html(b+" *"):$(".piskel-name").html(b)},a.SavedStatusService.prototype.onBeforeUnload=function(a){var b=this.piskelController_.piskel;if(b.isDirty_){var c="Your Piskel seems to have unsaved changes";return(a||window.event).returnValue=c,c}}}(),function(){var a=$.namespace("pskl.service.keyboard");a.ShortcutService=function(){this.shortcuts_={}},a.ShortcutService.prototype.init=function(){$(document.body).keydown($.proxy(this.onKeyUp_,this))},a.ShortcutService.prototype.addShortcut=function(a,b){var c=this.parseKey_(a.toLowerCase()),d=c.key,e=c.meta;if(this.shortcuts_[d]=this.shortcuts_[d]||{},this.shortcuts_[d][e]){var f=("normal"!==e?e+" + ":"")+d;console.error("[ShortcutService] >>> Shortcut ["+f+"] already registered")}else this.shortcuts_[d][e]=b},a.ShortcutService.prototype.removeShortcut=function(a){var b=this.parseKey_(a.toLowerCase()),c=b.key,d=b.meta;this.shortcuts_[c]=this.shortcuts_[c]||{},this.shortcuts_[c][d]=null},a.ShortcutService.prototype.parseKey_=function(a){var b="normal";return 0===a.indexOf("ctrl+")?(b="ctrl",a=a.replace("ctrl+","")):0===a.indexOf("shift+")?(b="shift",a=a.replace("shift+","")):0===a.indexOf("alt+")&&(b="alt",a=a.replace("alt+","")),{meta:b,key:a}},a.ShortcutService.prototype.onKeyUp_=function(a){if(!this.isInInput_(a)){var b=a.which;a.target.nodeName.toUpperCase();var c=pskl.service.keyboard.KeycodeTranslator.toChar(b),d=this.shortcuts_[c];if(d){var e;e=this.isCtrlKeyPressed_(a)?d.ctrl:this.isShiftKeyPressed_(a)?d.shift:this.isAltKeyPressed_(a)?d.alt:d.normal,e&&(e(c),a.preventDefault())}}},a.ShortcutService.prototype.isInInput_=function(a){var b=a.target.nodeName.toUpperCase();return"INPUT"===b||"TEXTAREA"===b},a.ShortcutService.prototype.isCtrlKeyPressed_=function(a){return this.isMac_()?a.metaKey:a.ctrlKey},a.ShortcutService.prototype.isShiftKeyPressed_=function(a){return a.shiftKey},a.ShortcutService.prototype.isAltKeyPressed_=function(a){return a.altKey},a.ShortcutService.prototype.isMac_=function(){return-1!=navigator.appVersion.indexOf("Mac")}}(),function(){var a={191:"?",27:"esc",38:"up",40:"down",46:"del"},b=$.namespace("pskl.service.keyboard");b.KeycodeTranslator={toChar:function(b){return b>=48&&57>=b?b-48+"":b>=65&&90>=b?(b-65+10).toString(36):a[b]}}}(),function(){var a=$.namespace("pskl.service.keyboard");a.CheatsheetService=function(){this.isDisplayed_=!1},a.CheatsheetService.prototype.init=function(){if(this.cheatsheetEl_=document.getElementById("cheatsheet-wrapper"),!this.cheatsheetEl_)throw"cheatsheetEl_ DOM element could not be retrieved";this.initMarkup_(),pskl.app.shortcutService.addShortcut("shift+?",this.toggleCheatsheet_.bind(this)),pskl.app.shortcutService.addShortcut("?",this.toggleCheatsheet_.bind(this));var a=$(".cheatsheet-link");a.click(this.toggleCheatsheet_.bind(this)),$.subscribe(Events.TOGGLE_HELP,this.toggleCheatsheet_.bind(this)),$.subscribe(Events.ESCAPE,this.onEscape_.bind(this))},a.CheatsheetService.prototype.toggleCheatsheet_=function(){this.isDisplayed_?this.hideCheatsheet_():this.showCheatsheet_()},a.CheatsheetService.prototype.onEscape_=function(){this.isDisplayed_&&this.hideCheatsheet_()},a.CheatsheetService.prototype.showCheatsheet_=function(){pskl.app.shortcutService.addShortcut("ESC",this.hideCheatsheet_.bind(this)),this.cheatsheetEl_.style.display="block",this.isDisplayed_=!0},a.CheatsheetService.prototype.hideCheatsheet_=function(){pskl.app.shortcutService.removeShortcut("ESC"),this.cheatsheetEl_.style.display="none",this.isDisplayed_=!1},a.CheatsheetService.prototype.initMarkup_=function(){this.initMarkupForTools_(),this.initMarkupForMisc_(),this.initMarkupForSelection_()},a.CheatsheetService.prototype.toDescriptor_=function(a,b,c){return{shortcut:a,description:b,icon:c}},a.CheatsheetService.prototype.getDomFromDescriptor_=function(a){var b=pskl.utils.Template.get("cheatsheet-shortcut-template"),c=pskl.utils.Template.replace(b,{shortcutIcon:a.icon,shortcutDescription:a.description,shortcutKey:a.shortcut});return pskl.utils.Template.createFromHTML(c)},a.CheatsheetService.prototype.initMarkupAbstract_=function(a,b){for(var c=$(b,this.cheatsheetEl_).get(0),d=0;da?1:-1,i=d>c?1:-1,j=f-g;;){if(e.push({col:a,row:c}),a==b&&c==d)break;var k=2*j;k>-g&&(j-=g,a+=h),f>k&&(j+=f,c+=i)}return e}}(),function(){var a=$.namespace("pskl.drawingtools");a.SimplePen=function(){this.toolId="tool-pen",this.helpText="Pen tool",this.previousCol=null,this.previousRow=null},pskl.utils.inherit(a.SimplePen,a.BaseTool),a.SimplePen.prototype.applyToolAt=function(a,b,c,d){d.containsPixel(a,b)&&d.setPixel(a,b,c),this.previousCol=a,this.previousRow=b},a.SimplePen.prototype.moveToolAt=function(a,b,c,d,e){if(Math.abs(a-this.previousCol)>1||Math.abs(b-this.previousRow)>1)for(var f=this.getLinePixels_(a,this.previousCol,b,this.previousRow),g=0,h=f.length;h>g;g++){var i=f[g];this.applyToolAt(i.col,i.row,c,d,e)}else this.applyToolAt(a,b,c,d,e);this.previousCol=a,this.previousRow=b}}(),function(){var a=$.namespace("pskl.drawingtools");a.VerticalMirrorPen=function(){this.toolId="tool-vertical-mirror-pen",this.helpText="vertical mirror pen tool",this.swap=null,this.mirroredPreviousCol=null,this.mirroredPreviousRow=null},pskl.utils.inherit(a.VerticalMirrorPen,a.SimplePen),a.VerticalMirrorPen.prototype.setMirrorContext=function(){this.swap=this.previousCol,this.previousCol=this.mirroredPreviousCol},a.VerticalMirrorPen.prototype.unsetMirrorContext=function(){this.mirroredPreviousCol=this.previousCol,this.previousCol=this.swap},a.VerticalMirrorPen.prototype.applyToolAt=function(a,b,c,d,e){this.superclass.applyToolAt.call(this,a,b,c,d,e);var f=this.getSymmetricCol_(a,d);this.mirroredPreviousCol=f,this.setMirrorContext(),this.superclass.applyToolAt.call(this,f,b,c,d,e),this.unsetMirrorContext()},a.VerticalMirrorPen.prototype.getSymmetricCol_=function(a,b){return b.getWidth()-a-1}}(),function(){var a=$.namespace("pskl.drawingtools");a.Eraser=function(){this.toolId="tool-eraser",this.helpText="Eraser tool"},pskl.utils.inherit(a.Eraser,a.SimplePen),a.Eraser.prototype.applyToolAt=function(a,b,c,d,e,f){this.superclass.applyToolAt.call(this,a,b,Constants.TRANSPARENT_COLOR,d,e,f)}}(),function(){var a=$.namespace("pskl.drawingtools");a.Stroke=function(){this.toolId="tool-stroke",this.helpText="Stroke tool",this.startCol=null,this.startRow=null},pskl.utils.inherit(a.Stroke,a.BaseTool),a.Stroke.prototype.applyToolAt=function(a,b,c,d,e){this.startCol=a,this.startRow=b,e.setPixel(a,b,c)},a.Stroke.prototype.moveToolAt=function(a,b,c,d,e){e.clear();for(var f=this.getLinePixels_(this.startCol,a,this.startRow,b),g=0;gd;d++)b.setPixel(c[d].col,c[d].row,Constants.SELECTION_TRANSPARENT_COLOR)},a.BaseSelect.prototype.shiftOverlayFrame_=function(a,b,c,d){for(var e,f=0;f0?this.selectPalette(this.palettes[0].id):this.createPalette("New palette")},a.PaletteManagerController.prototype.destroy=function(){this.destroySpectrumPickers()},a.PaletteManagerController.prototype.closeDialog=function(){$.publish(Events.DIALOG_HIDE)},a.PaletteManagerController.prototype.createPalette=function(a){if(a||(a=window.prompt("Please enter a name for your palette","New palette")),a){var b=this.createPaletteObject(a);this.palettes.push(b),this.createPaletteListMarkup(),this.selectPalette(b.id)}},a.PaletteManagerController.prototype.createPaletteObject=function(a){return{id:"palette-"+Date.now()+"-"+Math.floor(1e3*Math.random()),name:a,colors:[]}},a.PaletteManagerController.prototype.selectPalette=function(a){this.deselectCurrentPalette();var b=this.palettesList.querySelector("[data-palette-id="+a+"]");b&&(this.selectedPaletteId=a,b.classList.add(c),this.refreshPaletteDetails())},a.PaletteManagerController.prototype.refreshPaletteDetails=function(){this.destroySpectrumPickers(),this.createPaletteHeadMarkup(),this.createPaletteBodyMarkup(),this.initPaletteDetailsEvents(),this.initPaletteCardsSpectrum()},a.PaletteManagerController.prototype.createPaletteListMarkup=function(){var a=this.palettes.map(function(a){var b={id:a.id,name:this.isPaletteModified(a)?a.name+" *":a.name};return pskl.utils.Template.replace('
{{name}}
',b)}.bind(this)).join("");this.palettesList.innerHTML=a},a.PaletteManagerController.prototype.createPaletteHeadMarkup=function(){var a=this.getSelectedPalette(),b={name:a.name,"save:disabled":!this.isPaletteModified(a),"revert:disabled":!this.isPaletteModified(a),"delete:disabled":this.palettes.length<2},c=pskl.utils.Template.replace(this.paletteHeadTemplate,b);this.paletteHead.innerHTML=c},a.PaletteManagerController.prototype.isPaletteModified=function(a){var b=!1,c=this.getPaletteById(a.id,this.originalPalettes);if(c){var d=c.name!==a.name,e=a.colors.join("")!==c.colors.join("");b=d||e}else b=!0;return b},a.PaletteManagerController.prototype.createPaletteBodyMarkup=function(){var a=this.getSelectedPalette(),b=this.getColorCardsMarkup(a.colors);b+=pskl.utils.Template.replace(this.newColorTemplate,{classname:d}),this.paletteBody.innerHTML=b},a.PaletteManagerController.prototype.initPaletteDetailsEvents=function(){var a=this.paletteBody.querySelector("."+d);if(a.addEventListener("click",this.onNewCardClick.bind(this)),this.palettes.length<2){var b=this.paletteHead.querySelector('.palette-manager-palette-button[data-action="delete"]');b.setAttribute("disabled","disabled")}},a.PaletteManagerController.prototype.onNewCardClick=function(){var a,b=this.getSelectedPalette();a=b&&b.colors.length>0?b.colors[b.colors.length-1]:"#FFFFFF",this.addColorInSelectedPalette(a)},a.PaletteManagerController.prototype.delegatedPaletteBodyClick=function(a){var b=a.target;if(b.classList.contains(e)){var c=parseInt(b.parentNode.dataset.colorId,10);this.removeColorInSelectedPalette(c)}},a.PaletteManagerController.prototype.delegatedPaletteHeadClick=function(a){var b=a.target;if(b.classList.contains(f))this.renameSelectedPalette();else if(b.classList.contains("palette-manager-palette-button")){var c=b.dataset.action;"save"===c?this.savePaletteAndRedraw(this.getSelectedPalette().id):"revert"===c?this.revertChanges():"delete"===c&&this.deleteSelectedPalette()}},a.PaletteManagerController.prototype.getSpectrumSelector_=function(){return":not(."+d+")>.palette-manager-color-square"},a.PaletteManagerController.prototype.initPaletteCardsSpectrum=function(){var a=this,b=$(this.getSpectrumSelector_());b.spectrum({clickoutFiresChange:!0,showInput:!0,showButtons:!1,change:function(b){var c=this,d=parseInt(c.parentNode.dataset.colorId,10);a.updateColorInSelectedPalette(d,b)},beforeShow:function(){var c=this,d=parseInt(c.parentNode.dataset.colorId,10),e=a.getSelectedPalette(),f=e.colors[d];b.spectrum("set",f)}})},a.PaletteManagerController.prototype.destroySpectrumPickers=function(){var a=$(this.getSpectrumSelector_());a&&a.spectrum("destroy")},a.PaletteManagerController.prototype.updateColorInSelectedPalette=function(a,b){var c=this.getSelectedPalette();c.colors.splice(a,1,"#"+b.toHex().toUpperCase()),this.createPaletteListMarkup(),this.selectPalette(this.selectedPaletteId)},a.PaletteManagerController.prototype.addColorInSelectedPalette=function(a){var b=this.getSelectedPalette();b.colors.push(a),this.createPaletteListMarkup(),this.selectPalette(this.selectedPaletteId)},a.PaletteManagerController.prototype.removeColorInSelectedPalette=function(a){var b=this.getSelectedPalette();b.colors.splice(a,1),this.createPaletteListMarkup(),this.selectPalette(this.selectedPaletteId)},a.PaletteManagerController.prototype.renameSelectedPalette=function(){var a=this.getSelectedPalette(),b=window.prompt('Please enter a new name for palette "'+a.name+'"',a.name);b&&(a.name=b,this.createPaletteListMarkup(),this.selectPalette(a.id))},a.PaletteManagerController.prototype.getSelectedPalette=function(){return this.getPaletteById(this.selectedPaletteId,this.palettes)},a.PaletteManagerController.prototype.getColorCardsMarkup=function(a){var c=a.map(function(a,c){var d={colorId:c,hex:a,rgb:b(a).toRgbString(),hsl:b(a).toHslString()};return pskl.utils.Template.replace(this.colorCardTemplate,d)}.bind(this)).join("");return c},a.PaletteManagerController.prototype.getPaletteById=function(a,b){var c=null;return b.forEach(function(b){b.id===a&&(c=b)}),c},a.PaletteManagerController.prototype.removePaletteById=function(a,b){var c=this.getPaletteById(a,b);if(c){var d=b.indexOf(c);b.splice(d,1)}},a.PaletteManagerController.prototype.deselectCurrentPalette=function(){var a=this.palettesList.querySelector("."+c);a&&(this.selectedPaletteId=null,a.classList.remove(c))},a.PaletteManagerController.prototype.revertChanges=function(){var a=this.getSelectedPalette(),b=this.getPaletteById(a.id,this.originalPalettes);a.name=b.name,a.colors=b.colors.slice(0),this.createPaletteListMarkup(),this.selectPalette(a.id)},a.PaletteManagerController.prototype.deleteSelectedPalette=function(){var a=this.getSelectedPalette();this.palettes.length>1&&window.confirm('Are you sure you want to delete "'+a.name+'" ?')&&(this.removePaletteById(a.id,this.palettes),this.removePaletteById(a.id,this.originalPalettes),this.persistToLocalStorage(),this.createPaletteListMarkup(),this.selectPalette(this.palettes[0].id))},a.PaletteManagerController.prototype.onPaletteListClick=function(a){var b=a.target;b.dataset.paletteId&&this.selectPalette(b.dataset.paletteId)},a.PaletteManagerController.prototype.saveAll=function(){this.palettes.forEach(function(a){this.savePalette(a.id)}.bind(this)),this.createPaletteListMarkup(),this.selectPalette(this.getSelectedPalette().id)},a.PaletteManagerController.prototype.savePalette=function(a){var b=this.getPaletteById(a,this.palettes),c=this.getPaletteById(a,this.originalPalettes);c?(c.name=b.name,c.colors=b.colors):this.originalPalettes.push(b),this.persistToLocalStorage()},a.PaletteManagerController.prototype.savePaletteAndRedraw=function(a){this.savePalette(a),this.createPaletteListMarkup(),this.selectPalette(this.getSelectedPalette().id)},a.PaletteManagerController.prototype.persistToLocalStorage=function(){window.localStorage.setItem("piskel.palettes",JSON.stringify(this.originalPalettes)),this.originalPalettes=this.retrieveUserPalettes(),$.publish(Events.PALETTE_LIST_UPDATED)},a.PaletteManagerController.prototype.retrieveUserPalettes=function(){var a=window.localStorage.getItem("piskel.palettes");return JSON.parse(a)||[]}}(),function(){var a=$.namespace("pskl.controller.dialogs"),b={"manage-palettes":{template:"templates/dialogs/manage-palettes.html",controller:a.PaletteManagerController}};a.DialogsController=function(a){this.piskelController=a,this.currentDialog_=null},a.DialogsController.prototype.init=function(){this.dialogContainer_=document.getElementById("dialog-container"),this.dialogWrapper_=document.getElementById("dialog-container-wrapper"),$.subscribe(Events.DIALOG_DISPLAY,this.onDialogDisplayEvent_.bind(this)),$.subscribe(Events.DIALOG_HIDE,this.onDialogHideEvent_.bind(this)),pskl.app.shortcutService.addShortcut("alt+P",this.onDialogDisplayEvent_.bind(this,null,"manage-palettes"))},a.DialogsController.prototype.onDialogDisplayEvent_=function(a,c){if(!this.isDisplayed()){var d=b[c];if(d){this.dialogContainer_.innerHTML=pskl.utils.Template.get(d.template);var e=new d.controller(this.piskelController);e.init(),this.showDialogWrapper_(),this.currentDialog_={id:c,controller:e}}else console.error("Could not find dialog configuration for dialogId : "+c)}},a.DialogsController.prototype.onDialogHideEvent_=function(){this.hideDialog()},a.DialogsController.prototype.showDialogWrapper_=function(){pskl.app.shortcutService.addShortcut("ESC",this.hideDialog.bind(this)),this.dialogWrapper_.classList.add("show")},a.DialogsController.prototype.hideDialog=function(){var a=this.currentDialog_;a&&a.controller.destroy(),this.hideDialogWrapper_(),this.currentDialog_=null},a.DialogsController.prototype.hideDialogWrapper_=function(){pskl.app.shortcutService.removeShortcut("ESC"),this.dialogWrapper_.classList.remove("show")},a.DialogsController.prototype.isDisplayed=function(){return null!==this.currentDialog_}}(),function(){var a=$.namespace("pskl.service");a.LocalStorageService=function(a){if(void 0===a)throw"Bad LocalStorageService initialization: ";this.piskelController=a},a.LocalStorageService.prototype.init=function(){},a.LocalStorageService.prototype.save=function(a,b,c){this.removeFromKeys_(a),this.addToKeys_(a,b,Date.now()),window.localStorage.setItem("piskel."+a,c)},a.LocalStorageService.prototype.load=function(a){var b=this.getPiskel(a),c=this.getKey_(a);pskl.utils.serialization.Deserializer.deserialize(JSON.parse(b),function(b){b.setDescriptor(new pskl.model.piskel.Descriptor(a,c.description,!0)),pskl.app.piskelController.setPiskel(b)})},a.LocalStorageService.prototype.remove=function(a){this.removeFromKeys_(a),window.localStorage.removeItem("piskel."+a)},a.LocalStorageService.prototype.saveKeys_=function(a){window.localStorage.setItem("piskel.keys",JSON.stringify(a))},a.LocalStorageService.prototype.removeFromKeys_=function(a){var b=this.getKeys(),c=b.filter(function(b){return b.name!==a});this.saveKeys_(c)},a.LocalStorageService.prototype.getKey_=function(a){var b=this.getKeys().filter(function(b){return b.name===a});return b.length>0?b[0]:null},a.LocalStorageService.prototype.addToKeys_=function(a,b,c){var d=this.getKeys();d.push({name:a,description:b,date:c}),this.saveKeys_(d)},a.LocalStorageService.prototype.getPiskel=function(a){return window.localStorage.getItem("piskel."+a)},a.LocalStorageService.prototype.getKeys=function(){var a=window.localStorage.getItem("piskel.keys");return JSON.parse(a)||[]}}(),function(){var a=$.namespace("pskl.service");a.GithubStorageService=function(a){this.piskelController=a},a.GithubStorageService.prototype.init=function(){},a.GithubStorageService.prototype.store=function(){var a=new XMLHttpRequest,b=new FormData;b.append("framesheet_content",this.piskelController.serialize()),b.append("fps_speed",this.piskelController.getFPS()),a.open("POST",Constants.STATIC.URL.SAVE,!0),a.onload=function(a){if(200==this.status){var b=window.location.href.replace(window.location.search,"");window.location.href=b+"?frameId="+this.responseText}else this.onerror(a)},a.onerror=function(){$.publish(Events.SHOW_NOTIFICATION,[{content:"Saving failed ("+this.status+")"}])},a.send(b)}}(),function(){var a=$.namespace("pskl.service");a.AppEngineStorageService=function(a){this.piskelController=a},a.AppEngineStorageService.prototype.init=function(){},a.AppEngineStorageService.prototype.store=function(a){var b=this.prepareFormData_(),c=new XMLHttpRequest;c.open("POST",Constants.APPENGINE.URL.SAVE,!0),c.onload=function(b){200==this.status?(a.success(),a.after()):this.onerror(b)},c.onerror=function(){a.error(this.status),a.after()},c.send(b)},a.AppEngineStorageService.prototype.prepareFormData_=function(){var a=this.piskelController.piskel,b=a.getDescriptor(),c=new FormData;return c.append("framesheet",this.piskelController.serialize()),c.append("fps",this.piskelController.getFPS()),c.append("name",b.name),c.append("description",b.description),b.isPublic&&c.append("public",!0),c.append("frames",this.piskelController.getFrameCount()),c.append("first_frame_as_png",pskl.app.getFirstFrameAsPng()),c.append("framesheet_as_png",pskl.app.getFramesheetAsPng()),c}}(),function(){var a=$.namespace("pskl.service");a.HistoryService=function(a){this.piskelController=a,this.saveState__b=this.saveState.bind(this)},a.HistoryService.prototype.init=function(){$.subscribe(Events.PISKEL_RESET,this.saveState__b),$.subscribe(Events.TOOL_RELEASED,this.saveState__b),pskl.app.shortcutService.addShortcut("ctrl+Z",this.undo.bind(this)),pskl.app.shortcutService.addShortcut("ctrl+Y",this.redo.bind(this))},a.HistoryService.prototype.saveState=function(){this.piskelController.getCurrentFrame().saveState()},a.HistoryService.prototype.undo=function(){this.piskelController.getCurrentFrame().loadPreviousState(),$.unsubscribe(Events.PISKEL_RESET,this.saveState__b),$.publish(Events.PISKEL_RESET),$.subscribe(Events.PISKEL_RESET,this.saveState__b)},a.HistoryService.prototype.redo=function(){this.piskelController.getCurrentFrame().loadNextState(),$.unsubscribe(Events.PISKEL_RESET,this.saveState__b),$.publish(Events.PISKEL_RESET),$.subscribe(Events.PISKEL_RESET,this.saveState__b)}}(),function(){var a=$.namespace("pskl.service");a.SavedStatusService=function(a){this.piskelController_=a},a.SavedStatusService.prototype.init=function(){$.subscribe(Events.TOOL_RELEASED,this.onToolReleased.bind(this)),$.subscribe(Events.PISKEL_RESET,this.onPiskelReset.bind(this)),$.subscribe(Events.PISKEL_SAVED,this.onPiskelSaved.bind(this)),window.addEventListener("beforeunload",this.onBeforeUnload.bind(this))},a.SavedStatusService.prototype.onPiskelReset=function(){var a=this.piskelController_.piskel;a.firstResetDone_?this.updateDirtyStatus(!0):a.firstResetDone_=!0},a.SavedStatusService.prototype.onToolReleased=function(){this.updateDirtyStatus(!0)},a.SavedStatusService.prototype.onPiskelSaved=function(){this.updateDirtyStatus(!1)},a.SavedStatusService.prototype.updateDirtyStatus=function(a){var b=this.piskelController_.piskel;b.isDirty_!==a&&(b.isDirty_=a,this.updatePiskelName())},a.SavedStatusService.prototype.updatePiskelName=function(){var a=this.piskelController_.piskel,b=a.getDescriptor().name;a.isDirty_?$(".piskel-name").html(b+" *"):$(".piskel-name").html(b)},a.SavedStatusService.prototype.onBeforeUnload=function(a){var b=this.piskelController_.piskel;if(b.isDirty_){var c="Your Piskel seems to have unsaved changes";return(a||window.event).returnValue=c,c}}}(),function(){var a=$.namespace("pskl.service.keyboard");a.ShortcutService=function(){this.shortcuts_={}},a.ShortcutService.prototype.init=function(){$(document.body).keydown($.proxy(this.onKeyUp_,this))},a.ShortcutService.prototype.addShortcut=function(a,b){var c=this.parseKey_(a.toLowerCase()),d=c.key,e=c.meta;if(this.shortcuts_[d]=this.shortcuts_[d]||{},this.shortcuts_[d][e]){var f=("normal"!==e?e+" + ":"")+d;console.error("[ShortcutService] >>> Shortcut ["+f+"] already registered")}else this.shortcuts_[d][e]=b},a.ShortcutService.prototype.removeShortcut=function(a){var b=this.parseKey_(a.toLowerCase()),c=b.key,d=b.meta;this.shortcuts_[c]=this.shortcuts_[c]||{},this.shortcuts_[c][d]=null},a.ShortcutService.prototype.parseKey_=function(a){var b="normal";return 0===a.indexOf("ctrl+")?(b="ctrl",a=a.replace("ctrl+","")):0===a.indexOf("shift+")?(b="shift",a=a.replace("shift+","")):0===a.indexOf("alt+")&&(b="alt",a=a.replace("alt+","")),{meta:b,key:a}},a.ShortcutService.prototype.onKeyUp_=function(a){if(!this.isInInput_(a)){var b=a.which;a.target.nodeName.toUpperCase();var c=pskl.service.keyboard.KeycodeTranslator.toChar(b),d=this.shortcuts_[c];if(d){var e;e=this.isCtrlKeyPressed_(a)?d.ctrl:this.isShiftKeyPressed_(a)?d.shift:this.isAltKeyPressed_(a)?d.alt:d.normal,e&&(e(c),a.preventDefault())}}},a.ShortcutService.prototype.isInInput_=function(a){var b=a.target.nodeName.toUpperCase();return"INPUT"===b||"TEXTAREA"===b},a.ShortcutService.prototype.isCtrlKeyPressed_=function(a){return this.isMac_()?a.metaKey:a.ctrlKey},a.ShortcutService.prototype.isShiftKeyPressed_=function(a){return a.shiftKey},a.ShortcutService.prototype.isAltKeyPressed_=function(a){return a.altKey},a.ShortcutService.prototype.isMac_=function(){return-1!=navigator.appVersion.indexOf("Mac")}}(),function(){var a={191:"?",27:"esc",38:"up",40:"down",46:"del"},b=$.namespace("pskl.service.keyboard");b.KeycodeTranslator={toChar:function(b){return b>=48&&57>=b?b-48+"":b>=65&&90>=b?(b-65+10).toString(36):a[b]}}}(),function(){var a=$.namespace("pskl.service.keyboard");a.CheatsheetService=function(){this.isDisplayed_=!1},a.CheatsheetService.prototype.init=function(){if(this.cheatsheetEl_=document.getElementById("cheatsheet-wrapper"),!this.cheatsheetEl_)throw"cheatsheetEl_ DOM element could not be retrieved";this.initMarkup_(),pskl.app.shortcutService.addShortcut("shift+?",this.toggleCheatsheet_.bind(this)),pskl.app.shortcutService.addShortcut("?",this.toggleCheatsheet_.bind(this));var a=$(".cheatsheet-link");a.click(this.toggleCheatsheet_.bind(this)),$.subscribe(Events.TOGGLE_HELP,this.toggleCheatsheet_.bind(this)),$.subscribe(Events.ESCAPE,this.onEscape_.bind(this))},a.CheatsheetService.prototype.toggleCheatsheet_=function(){this.isDisplayed_?this.hideCheatsheet_():this.showCheatsheet_()},a.CheatsheetService.prototype.onEscape_=function(){this.isDisplayed_&&this.hideCheatsheet_()},a.CheatsheetService.prototype.showCheatsheet_=function(){pskl.app.shortcutService.addShortcut("ESC",this.hideCheatsheet_.bind(this)),this.cheatsheetEl_.style.display="block",this.isDisplayed_=!0},a.CheatsheetService.prototype.hideCheatsheet_=function(){pskl.app.shortcutService.removeShortcut("ESC"),this.cheatsheetEl_.style.display="none",this.isDisplayed_=!1},a.CheatsheetService.prototype.initMarkup_=function(){this.initMarkupForTools_(),this.initMarkupForMisc_(),this.initMarkupForSelection_()},a.CheatsheetService.prototype.toDescriptor_=function(a,b,c){return{shortcut:a,description:b,icon:c}},a.CheatsheetService.prototype.getDomFromDescriptor_=function(a){var b=pskl.utils.Template.get("cheatsheet-shortcut-template"),c=pskl.utils.Template.replace(b,{shortcutIcon:a.icon,shortcutDescription:a.description,shortcutKey:a.shortcut});return pskl.utils.Template.createFromHTML(c)},a.CheatsheetService.prototype.initMarkupAbstract_=function(a,b){for(var c=$(b,this.cheatsheetEl_).get(0),d=0;da?1:-1,i=d>c?1:-1,j=f-g;;){if(e.push({col:a,row:c}),a==b&&c==d)break;var k=2*j;k>-g&&(j-=g,a+=h),f>k&&(j+=f,c+=i)}return e}}(),function(){var a=$.namespace("pskl.drawingtools");a.SimplePen=function(){this.toolId="tool-pen",this.helpText="Pen tool",this.previousCol=null,this.previousRow=null},pskl.utils.inherit(a.SimplePen,a.BaseTool),a.SimplePen.prototype.applyToolAt=function(a,b,c,d){d.containsPixel(a,b)&&d.setPixel(a,b,c),this.previousCol=a,this.previousRow=b},a.SimplePen.prototype.moveToolAt=function(a,b,c,d,e){if(Math.abs(a-this.previousCol)>1||Math.abs(b-this.previousRow)>1)for(var f=this.getLinePixels_(a,this.previousCol,b,this.previousRow),g=0,h=f.length;h>g;g++){var i=f[g];this.applyToolAt(i.col,i.row,c,d,e)}else this.applyToolAt(a,b,c,d,e);this.previousCol=a,this.previousRow=b}}(),function(){var a=$.namespace("pskl.drawingtools");a.VerticalMirrorPen=function(){this.toolId="tool-vertical-mirror-pen",this.helpText="vertical mirror pen tool",this.swap=null,this.mirroredPreviousCol=null,this.mirroredPreviousRow=null},pskl.utils.inherit(a.VerticalMirrorPen,a.SimplePen),a.VerticalMirrorPen.prototype.setMirrorContext=function(){this.swap=this.previousCol,this.previousCol=this.mirroredPreviousCol},a.VerticalMirrorPen.prototype.unsetMirrorContext=function(){this.mirroredPreviousCol=this.previousCol,this.previousCol=this.swap},a.VerticalMirrorPen.prototype.applyToolAt=function(a,b,c,d,e){this.superclass.applyToolAt.call(this,a,b,c,d,e);var f=this.getSymmetricCol_(a,d);this.mirroredPreviousCol=f,this.setMirrorContext(),this.superclass.applyToolAt.call(this,f,b,c,d,e),this.unsetMirrorContext()},a.VerticalMirrorPen.prototype.getSymmetricCol_=function(a,b){return b.getWidth()-a-1}}(),function(){var a=$.namespace("pskl.drawingtools");a.Eraser=function(){this.toolId="tool-eraser",this.helpText="Eraser tool"},pskl.utils.inherit(a.Eraser,a.SimplePen),a.Eraser.prototype.applyToolAt=function(a,b,c,d,e,f){this.superclass.applyToolAt.call(this,a,b,Constants.TRANSPARENT_COLOR,d,e,f)}}(),function(){var a=$.namespace("pskl.drawingtools");a.Stroke=function(){this.toolId="tool-stroke",this.helpText="Stroke tool",this.startCol=null,this.startRow=null},pskl.utils.inherit(a.Stroke,a.BaseTool),a.Stroke.prototype.applyToolAt=function(a,b,c,d,e){this.startCol=a,this.startRow=b,e.setPixel(a,b,c)},a.Stroke.prototype.moveToolAt=function(a,b,c,d,e){e.clear();for(var f=this.getLinePixels_(this.startCol,a,this.startRow,b),g=0;gd;d++)b.setPixel(c[d].col,c[d].row,Constants.SELECTION_TRANSPARENT_COLOR)},a.BaseSelect.prototype.shiftOverlayFrame_=function(a,b,c,d){for(var e,f=0;f 0) {
this.selectPalette(this.palettes[0].id);
} else {
- console.error('[PaletteManagerController] >>> Implement fallback screen when no palette can be retrieved');
+ this.createPalette('New palette');
}
};
@@ -18171,8 +18171,10 @@ if (typeof Function.prototype.bind !== "function") {
$.publish(Events.DIALOG_HIDE);
};
- ns.PaletteManagerController.prototype.createPalette = function () {
- var name = window.prompt('Please enter a name for your palette', 'New palette');
+ ns.PaletteManagerController.prototype.createPalette = function (name) {
+ if (!name) {
+ name = window.prompt('Please enter a name for your palette', 'New palette');
+ }
if (name) {
var palette = this.createPaletteObject(name);
this.palettes.push(palette);
@@ -18489,7 +18491,7 @@ if (typeof Function.prototype.bind !== "function") {
ns.PaletteManagerController.prototype.retrieveUserPalettes = function () {
var palettesString = window.localStorage.getItem('piskel.palettes');
- return JSON.parse(palettesString) || [this.createPaletteObject('New palette')];
+ return JSON.parse(palettesString) || [];
};
})();;(function () {
diff --git a/build/piskel-style-packaged.css b/build/piskel-style-packaged.css
index 9dfb8f77..dd8e0218 100644
--- a/build/piskel-style-packaged.css
+++ b/build/piskel-style-packaged.css
@@ -1377,18 +1377,21 @@ body {
.palettes-list-colors {
overflow:hidden;
- padding-top: 5px;
}
.palettes-list-color {
cursor : pointer;
float: left;
- margin : 0px 0 5px 5px;
+ margin : 0 0 5px 5px;
width : 32px;
height : 32px;
position: relative;
}
+.palettes-list-color:nth-child(-n+5) {
+ margin-top: 5px;
+}
+
.palettes-list-color div{
width : 32px;
height : 32px;
@@ -1398,7 +1401,7 @@ body {
.palettes-list-color.secondary:before {
content: "";
position: absolute;
- bottom: -1px;
+ bottom: 1px;
display: inline-block;
border: 7px solid gold;
border-top-color: transparent;
@@ -1408,13 +1411,13 @@ body {
}
.palettes-list-color.primary:before {
- left: -1px;
+ left: 1px;
border-right-color: transparent;
}
.palettes-list-color.secondary:before {
- right: -1px;
+ right: 1px;
border-left-color: transparent;
}
/***