diff --git a/web/pgadmin/static/css/alertifyjs/alertify.css b/web/pgadmin/static/css/alertifyjs/alertify.css index e9620c89d..16f1faf44 100644 --- a/web/pgadmin/static/css/alertifyjs/alertify.css +++ b/web/pgadmin/static/css/alertifyjs/alertify.css @@ -1,3 +1,8 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ .alertify .ajs-dimmer { position: fixed; z-index: 1981; @@ -27,6 +32,7 @@ max-width: 500px; padding: 24px 24px 0 24px; outline: 0; + background-color: #fff; } .alertify .ajs-dialog.ajs-capture:before { content: ''; @@ -73,6 +79,7 @@ margin: -24px; margin-bottom: 0; padding: 16px 24px; + background-color: #fff; } .alertify .ajs-body { min-height: 56px; @@ -85,6 +92,7 @@ margin-left: -24px; margin-right: -24px; min-height: 43px; + background-color: #fff; } .alertify .ajs-footer .ajs-buttons.ajs-primary { text-align: right; @@ -296,12 +304,9 @@ .alertify .ajs-modal { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); - -webkit-transition-property: opacity, visibility; - transition-property: opacity, visibility; - -webkit-transition-timing-function: linear; - transition-timing-function: linear; - -webkit-transition-duration: 250ms; - transition-duration: 250ms; + transition-property: opacity, visibility; + transition-timing-function: linear; + transition-duration: 250ms; } .alertify.ajs-hidden .ajs-dimmer, .alertify.ajs-hidden .ajs-modal { @@ -427,8 +432,7 @@ 60%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; @@ -465,8 +469,7 @@ 60%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; @@ -614,15 +617,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); @@ -642,15 +643,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); @@ -702,15 +701,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); @@ -730,15 +727,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); @@ -833,21 +828,28 @@ padding: 0; opacity: 0; margin: 0; - -webkit-transition-duration: 250ms; - transition-duration: 250ms; - -webkit-transition-timing-function: linear; - transition-timing-function: linear; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + transition-duration: 250ms; + transition-timing-function: linear; } .alertify-notifier .ajs-message.ajs-visible { - -webkit-transition-duration: 500ms; - transition-duration: 500ms; - -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); - transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); + transition-duration: 500ms; + transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); opacity: 1; max-height: 100%; padding: 15px; margin-top: 10px; } +.alertify-notifier .ajs-message.ajs-success { + background: rgba(91, 189, 114, 0.95); +} +.alertify-notifier .ajs-message.ajs-error { + background: rgba(217, 92, 92, 0.95); +} +.alertify-notifier .ajs-message.ajs-warning { + background: rgba(252, 248, 215, 0.95); +} .alertify-notifier.ajs-top { top: 10px; } diff --git a/web/pgadmin/static/css/alertifyjs/alertify.min.css b/web/pgadmin/static/css/alertifyjs/alertify.min.css index 627768483..0503cd415 100644 --- a/web/pgadmin/static/css/alertifyjs/alertify.min.css +++ b/web/pgadmin/static/css/alertifyjs/alertify.min.css @@ -1,3 +1,6 @@ -/*! AlertifyJS - v1.1.0 - Mohammad Younes (http://alertifyjs.com) */ - -.alertify .ajs-dimmer{position:fixed;z-index:1981;top:0;right:0;bottom:0;left:0;padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{position:fixed;top:0;right:0;left:0;bottom:0;padding:0;overflow-y:auto;z-index:1981}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593D2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:500ms;animation-duration:500ms}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1.275);animation-timing-function:cubic-bezier(0.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(0.6,-.28,.735,.045);animation-timing-function:cubic-bezier(0.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(0.97,.97,.97);transform:scale3d(0.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(0.97,.97,.97);transform:scale3d(0.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(0.175,.885,.32,1.275);transition-timing-function:cubic-bezier(0.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0} \ No newline at end of file +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dimmer,.alertify .ajs-modal{top:0;right:0;position:fixed;padding:0;z-index:1981}.alertify .ajs-dimmer{bottom:0;left:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{left:0;bottom:0;overflow-y:auto}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button,.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593D2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);transition-property:opacity,visibility;transition-timing-function:linear;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:500ms;animation-duration:500ms}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px)rotate3d(1,0,0,90deg);transform:perspective(400px)rotate3d(1,0,0,90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-20deg);transform:perspective(400px)rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(1,0,0,10deg);transform:perspective(400px)rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-5deg);transform:perspective(400px)rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px)rotate3d(1,0,0,90deg);transform:perspective(400px)rotate3d(1,0,0,90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-20deg);transform:perspective(400px)rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(1,0,0,10deg);transform:perspective(400px)rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-5deg);transform:perspective(400px)rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-20deg);transform:perspective(400px)rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(1,0,0,90deg);transform:perspective(400px)rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-20deg);transform:perspective(400px)rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(1,0,0,90deg);transform:perspective(400px)rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px)rotate3d(0,1,0,90deg);transform:perspective(400px)rotate3d(0,1,0,90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(0,1,0,-20deg);transform:perspective(400px)rotate3d(0,1,0,-20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(0,1,0,10deg);transform:perspective(400px)rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(0,1,0,-5deg);transform:perspective(400px)rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px)rotate3d(0,1,0,90deg);transform:perspective(400px)rotate3d(0,1,0,90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(0,1,0,-20deg);transform:perspective(400px)rotate3d(0,1,0,-20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(0,1,0,10deg);transform:perspective(400px)rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(0,1,0,-5deg);transform:perspective(400px)rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(0,1,0,-15deg);transform:perspective(400px)rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(0,1,0,90deg);transform:perspective(400px)rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(0,1,0,-15deg);transform:perspective(400px)rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(0,1,0,90deg);transform:perspective(400px)rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);transition-duration:250ms;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{transition-duration:500ms;transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0} \ No newline at end of file diff --git a/web/pgadmin/static/css/alertifyjs/alertify.rtl.css b/web/pgadmin/static/css/alertifyjs/alertify.rtl.css index 2d02ef55c..1ded1a01e 100644 --- a/web/pgadmin/static/css/alertifyjs/alertify.rtl.css +++ b/web/pgadmin/static/css/alertifyjs/alertify.rtl.css @@ -1,3 +1,8 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ .alertify .ajs-dimmer { position: fixed; z-index: 1981; @@ -27,6 +32,7 @@ max-width: 500px; padding: 24px 24px 0 24px; outline: 0; + background-color: #fff; } .alertify .ajs-dialog.ajs-capture:before { content: ''; @@ -73,6 +79,7 @@ margin: -24px; margin-bottom: 0; padding: 16px 24px; + background-color: #fff; } .alertify .ajs-body { min-height: 56px; @@ -85,6 +92,7 @@ margin-right: -24px; margin-left: -24px; min-height: 43px; + background-color: #fff; } .alertify .ajs-footer .ajs-buttons.ajs-primary { text-align: left; @@ -296,12 +304,9 @@ .alertify .ajs-modal { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); - -webkit-transition-property: opacity, visibility; - transition-property: opacity, visibility; - -webkit-transition-timing-function: linear; - transition-timing-function: linear; - -webkit-transition-duration: 250ms; - transition-duration: 250ms; + transition-property: opacity, visibility; + transition-timing-function: linear; + transition-duration: 250ms; } .alertify.ajs-hidden .ajs-dimmer, .alertify.ajs-hidden .ajs-modal { @@ -427,8 +432,7 @@ 60%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; @@ -465,8 +469,7 @@ 60%, 80%, 100% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; @@ -614,15 +617,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); transform: perspective(400px) rotate3d(1, 0, 0, -90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); transform: perspective(400px) rotate3d(1, 0, 0, 20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); @@ -642,15 +643,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); transform: perspective(400px) rotate3d(1, 0, 0, -90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); transform: perspective(400px) rotate3d(1, 0, 0, 20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); @@ -702,15 +701,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -90deg); transform: perspective(400px) rotate3d(0, -1, 0, -90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 20deg); transform: perspective(400px) rotate3d(0, -1, 0, 20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -10deg); @@ -730,15 +727,13 @@ 0% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -90deg); transform: perspective(400px) rotate3d(0, -1, 0, -90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 20deg); transform: perspective(400px) rotate3d(0, -1, 0, 20deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; + transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -10deg); @@ -833,21 +828,28 @@ padding: 0; opacity: 0; margin: 0; - -webkit-transition-duration: 250ms; - transition-duration: 250ms; - -webkit-transition-timing-function: linear; - transition-timing-function: linear; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + transition-duration: 250ms; + transition-timing-function: linear; } .alertify-notifier .ajs-message.ajs-visible { - -webkit-transition-duration: 500ms; - transition-duration: 500ms; - -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); - transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); + transition-duration: 500ms; + transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); opacity: 1; max-height: 100%; padding: 15px; margin-top: 10px; } +.alertify-notifier .ajs-message.ajs-success { + background: rgba(91, 189, 114, 0.95); +} +.alertify-notifier .ajs-message.ajs-error { + background: rgba(217, 92, 92, 0.95); +} +.alertify-notifier .ajs-message.ajs-warning { + background: rgba(252, 248, 215, 0.95); +} .alertify-notifier.ajs-top { top: 10px; } diff --git a/web/pgadmin/static/css/alertifyjs/alertify.rtl.min.css b/web/pgadmin/static/css/alertifyjs/alertify.rtl.min.css index 16278dbd4..81c9eeb06 100644 --- a/web/pgadmin/static/css/alertifyjs/alertify.rtl.min.css +++ b/web/pgadmin/static/css/alertifyjs/alertify.rtl.min.css @@ -1,3 +1,6 @@ -/*! AlertifyJS - v1.1.0 - Mohammad Younes (http://alertifyjs.com) */ - -.alertify .ajs-dimmer{position:fixed;z-index:1981;top:0;left:0;bottom:0;right:0;padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{position:fixed;top:0;left:0;right:0;bottom:0;padding:0;overflow-y:auto;z-index:1981}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;left:0;bottom:0;right:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;left:4px;margin:-14px 0 0 24px;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-right:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 16px 16px 24px}.alertify .ajs-footer{padding:4px;margin-right:-24px;margin-left:-24px;min-height:43px}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:left}.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:right;clear:none;text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;left:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(-1);transform:scaleX(-1);cursor:sw-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{right:0;left:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-right:-24px;margin-left:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{right:0;left:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;right:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 0 0 24px}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;right:0;left:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;left:24px;bottom:50px;right:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;right:0;left:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;right:0;left:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;left:0;bottom:0;right:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593D2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:500ms;animation-duration:500ms}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1.275);animation-timing-function:cubic-bezier(0.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(0.6,-.28,.735,.045);animation-timing-function:cubic-bezier(0.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(0.97,.97,.97);transform:scale3d(0.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(0.97,.97,.97);transform:scale3d(0.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(0.9,.9,.9);transform:scale3d(0.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3,.3,.3);transform:scale3d(0.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(0.25,.25,.25);transform:scale3d(0.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-10deg);transform:perspective(400px) rotate3d(1,0,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,5deg);transform:perspective(400px) rotate3d(1,0,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-10deg);transform:perspective(400px) rotate3d(1,0,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,5deg);transform:perspective(400px) rotate3d(1,0,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,20deg);transform:perspective(400px) rotate3d(0,-1,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-10deg);transform:perspective(400px) rotate3d(0,-1,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,5deg);transform:perspective(400px) rotate3d(0,-1,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,20deg);transform:perspective(400px) rotate3d(0,-1,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-10deg);transform:perspective(400px) rotate3d(0,-1,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,5deg);transform:perspective(400px) rotate3d(0,-1,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,15deg);transform:perspective(400px) rotate3d(0,-1,0,15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,15deg);transform:perspective(400px) rotate3d(0,-1,0,15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(0.175,.885,.32,1.275);transition-timing-function:cubic-bezier(0.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{left:10px}.alertify-notifier.ajs-right .ajs-message{left:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{left:290px}.alertify-notifier.ajs-left{right:10px}.alertify-notifier.ajs-left .ajs-message{right:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{right:0} \ No newline at end of file +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dimmer,.alertify .ajs-modal{top:0;left:0;position:fixed;padding:0;z-index:1981}.alertify .ajs-dimmer{bottom:0;right:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{right:0;bottom:0;overflow-y:auto}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;left:0;bottom:0;right:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;left:4px;margin:-14px 0 0 24px;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-right:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 16px 16px 24px}.alertify .ajs-footer{padding:4px;margin-right:-24px;margin-left:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button,.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:left}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:right;clear:none;text-align:right}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;left:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(-1);transform:scaleX(-1);cursor:sw-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{right:0;left:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-right:-24px;margin-left:-24px}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{right:0;left:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;right:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 0 0 24px}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;right:0;left:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;left:24px;bottom:50px;right:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;right:0;left:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;right:0;left:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;left:0;bottom:0;right:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593D2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);transition-property:opacity,visibility;transition-timing-function:linear;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:500ms;animation-duration:500ms}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-90deg);transform:perspective(400px)rotate3d(1,0,0,-90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(1,0,0,20deg);transform:perspective(400px)rotate3d(1,0,0,20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-10deg);transform:perspective(400px)rotate3d(1,0,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(1,0,0,5deg);transform:perspective(400px)rotate3d(1,0,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-90deg);transform:perspective(400px)rotate3d(1,0,0,-90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(1,0,0,20deg);transform:perspective(400px)rotate3d(1,0,0,20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-10deg);transform:perspective(400px)rotate3d(1,0,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(1,0,0,5deg);transform:perspective(400px)rotate3d(1,0,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(1,0,0,20deg);transform:perspective(400px)rotate3d(1,0,0,20deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-90deg);transform:perspective(400px)rotate3d(1,0,0,-90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(1,0,0,20deg);transform:perspective(400px)rotate3d(1,0,0,20deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(1,0,0,-90deg);transform:perspective(400px)rotate3d(1,0,0,-90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,-90deg);transform:perspective(400px)rotate3d(0,-1,0,-90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,20deg);transform:perspective(400px)rotate3d(0,-1,0,20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,-10deg);transform:perspective(400px)rotate3d(0,-1,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,5deg);transform:perspective(400px)rotate3d(0,-1,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,-90deg);transform:perspective(400px)rotate3d(0,-1,0,-90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,20deg);transform:perspective(400px)rotate3d(0,-1,0,20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,-10deg);transform:perspective(400px)rotate3d(0,-1,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,5deg);transform:perspective(400px)rotate3d(0,-1,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,15deg);transform:perspective(400px)rotate3d(0,-1,0,15deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,-90deg);transform:perspective(400px)rotate3d(0,-1,0,-90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,15deg);transform:perspective(400px)rotate3d(0,-1,0,15deg);opacity:1}100%{-webkit-transform:perspective(400px)rotate3d(0,-1,0,-90deg);transform:perspective(400px)rotate3d(0,-1,0,-90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);transition-duration:250ms;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{transition-duration:500ms;transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{left:10px}.alertify-notifier.ajs-right .ajs-message{left:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{left:290px}.alertify-notifier.ajs-left{right:10px}.alertify-notifier.ajs-left .ajs-message{right:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{right:0} \ No newline at end of file diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.css b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.css index adf36de51..b0fe919b4 100644 --- a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.css +++ b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.css @@ -1,3 +1,8 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ .alertify .ajs-dimmer { background-color: #000; opacity: .5; diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.min.css b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.min.css index ee9d80de3..e3515e09d 100644 --- a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.min.css +++ b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.min.css @@ -1,3 +1,6 @@ -/*! AlertifyJS - v1.1.0 - Mohammad Younes (http://alertifyjs.com) */ - +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ .alertify .ajs-dimmer{background-color:#000;opacity:.5}.alertify .ajs-dialog{max-width:600px;min-height:122px;background-color:#fff;border:1px solid rgba(0,0,0,.2);box-shadow:0 5px 15px rgba(0,0,0,.5);border-radius:6px}.alertify .ajs-header{color:#333;border-bottom:1px solid #e5e5e5;border-radius:6px 6px 0 0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:18px}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#000}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:58px;bottom:68px}.alertify .ajs-footer{background-color:#fff;padding:15px;border-top:1px solid #e5e5e5;border-radius:0 0 6px 6px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:1px solid #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999} \ No newline at end of file diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.css b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.css index c35a1995e..90f1348e1 100644 --- a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.css +++ b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.css @@ -1,3 +1,8 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ .alertify .ajs-dimmer { background-color: #000; opacity: .5; diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.min.css b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.min.css index 937233aac..4da482197 100644 --- a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.min.css +++ b/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.min.css @@ -1,3 +1,6 @@ -/*! AlertifyJS - v1.1.0 - Mohammad Younes (http://alertifyjs.com) */ - +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ .alertify .ajs-dimmer{background-color:#000;opacity:.5}.alertify .ajs-dialog{max-width:600px;min-height:122px;background-color:#fff;border:1px solid rgba(0,0,0,.2);box-shadow:0 5px 15px rgba(0,0,0,.5);border-radius:6px}.alertify .ajs-header{color:#333;border-bottom:1px solid #e5e5e5;border-radius:6px 6px 0 0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:18px}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#000}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:58px;bottom:68px}.alertify .ajs-footer{background-color:#fff;padding:15px;border-top:1px solid #e5e5e5;border-radius:0 0 6px 6px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:1px solid #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999} \ No newline at end of file diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.css b/web/pgadmin/static/css/alertifyjs/themes/default.css new file mode 100644 index 000000000..3461ae9be --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/default.css @@ -0,0 +1,68 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dialog { + background-color: white; + box-shadow: 0px 15px 20px 0px rgba(0, 0, 0, 0.25); + border-radius: 2px; +} +.alertify .ajs-header { + color: black; + font-weight: bold; + background: #fafafa; + border-bottom: #eee 1px solid; + border-radius: 2px 2px 0 0; +} +.alertify .ajs-body { + color: black; +} +.alertify .ajs-body .ajs-content .ajs-input { + display: block; + width: 100%; + padding: 8px; + margin: 4px; + border-radius: 2px; + border: 1px solid #CCC; +} +.alertify .ajs-body .ajs-content p { + margin: 0; +} +.alertify .ajs-footer { + background: #fbfbfb; + border-top: #eee 1px solid; + border-radius: 0 0 2px 2px; +} +.alertify .ajs-footer .ajs-buttons .ajs-button { + background-color: transparent; + color: #000; + border: 0; + font-size: 14px; + font-weight: bold; + text-transform: uppercase; +} +.alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok { + color: #3593D2; +} +.alertify-notifier .ajs-message { + background: rgba(255, 255, 255, 0.95); + color: #000; + text-align: center; + border: solid 1px #ddd; + border-radius: 2px; +} +.alertify-notifier .ajs-message.ajs-success { + color: #fff; + background: rgba(91, 189, 114, 0.95); + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-error { + color: #fff; + background: rgba(217, 92, 92, 0.95); + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-warning { + background: rgba(252, 248, 215, 0.95); + border-color: #999; +} diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.min.css b/web/pgadmin/static/css/alertifyjs/themes/default.min.css new file mode 100644 index 000000000..b4ced27fa --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/default.min.css @@ -0,0 +1,6 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dialog{background-color:#fff;box-shadow:0 15px 20px 0 rgba(0,0,0,.25);border-radius:2px}.alertify .ajs-header{color:#000;font-weight:700;background:#fafafa;border-bottom:#eee 1px solid;border-radius:2px 2px 0 0}.alertify .ajs-body{color:#000}.alertify .ajs-body .ajs-content .ajs-input{display:block;width:100%;padding:8px;margin:4px;border-radius:2px;border:1px solid #CCC}.alertify .ajs-body .ajs-content p{margin:0}.alertify .ajs-footer{background:#fbfbfb;border-top:#eee 1px solid;border-radius:0 0 2px 2px}.alertify .ajs-footer .ajs-buttons .ajs-button{background-color:transparent;color:#000;border:0;font-size:14px;font-weight:700;text-transform:uppercase}.alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok{color:#3593D2}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:1px solid #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999} \ No newline at end of file diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.rtl.css b/web/pgadmin/static/css/alertifyjs/themes/default.rtl.css new file mode 100644 index 000000000..f202ac7ce --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/default.rtl.css @@ -0,0 +1,68 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dialog { + background-color: white; + box-shadow: 0px 15px 20px 0px rgba(0, 0, 0, 0.25); + border-radius: 2px; +} +.alertify .ajs-header { + color: black; + font-weight: bold; + background: #fafafa; + border-bottom: #eee 1px solid; + border-radius: 2px 2px 0 0; +} +.alertify .ajs-body { + color: black; +} +.alertify .ajs-body .ajs-content .ajs-input { + display: block; + width: 100%; + padding: 8px; + margin: 4px; + border-radius: 2px; + border: 1px solid #CCC; +} +.alertify .ajs-body .ajs-content p { + margin: 0; +} +.alertify .ajs-footer { + background: #fbfbfb; + border-top: #eee 1px solid; + border-radius: 0 0 2px 2px; +} +.alertify .ajs-footer .ajs-buttons .ajs-button { + background-color: transparent; + color: #000; + border: 0; + font-size: 14px; + font-weight: bold; + text-transform: uppercase; +} +.alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok { + color: #3593D2; +} +.alertify-notifier .ajs-message { + background: rgba(255, 255, 255, 0.95); + color: #000; + text-align: center; + border: solid 1px #ddd; + border-radius: 2px; +} +.alertify-notifier .ajs-message.ajs-success { + color: #fff; + background: rgba(91, 189, 114, 0.95); + text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-error { + color: #fff; + background: rgba(217, 92, 92, 0.95); + text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-warning { + background: rgba(252, 248, 215, 0.95); + border-color: #999; +} diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.rtl.min.css b/web/pgadmin/static/css/alertifyjs/themes/default.rtl.min.css new file mode 100644 index 000000000..546afa3aa --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/default.rtl.min.css @@ -0,0 +1,6 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dialog{background-color:#fff;box-shadow:0 15px 20px 0 rgba(0,0,0,.25);border-radius:2px}.alertify .ajs-header{color:#000;font-weight:700;background:#fafafa;border-bottom:#eee 1px solid;border-radius:2px 2px 0 0}.alertify .ajs-body{color:#000}.alertify .ajs-body .ajs-content .ajs-input{display:block;width:100%;padding:8px;margin:4px;border-radius:2px;border:1px solid #CCC}.alertify .ajs-body .ajs-content p{margin:0}.alertify .ajs-footer{background:#fbfbfb;border-top:#eee 1px solid;border-radius:0 0 2px 2px}.alertify .ajs-footer .ajs-buttons .ajs-button{background-color:transparent;color:#000;border:0;font-size:14px;font-weight:700;text-transform:uppercase}.alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok{color:#3593D2}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:1px solid #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999} \ No newline at end of file diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.css b/web/pgadmin/static/css/alertifyjs/themes/semantic.css new file mode 100644 index 000000000..7b4a6845b --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/semantic.css @@ -0,0 +1,84 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dimmer { + background-color: rgba(0, 0, 0, 0.85); + opacity: 1; +} +.alertify .ajs-dialog { + max-width: 50%; + min-height: 137px; + background-color: #F4F4F4; + border: 1px solid #DDD; + box-shadow: none; + border-radius: 5px; +} +.alertify .ajs-header { + padding: 1.5rem 2rem; + border-bottom: none; + border-radius: 5px 5px 0 0; + color: #555; + background-color: #fff; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 1.6em; + font-weight: 700; +} +.alertify .ajs-body { + font-family: 'Roboto', sans-serif; + color: #555; +} +.alertify .ajs-body .ajs-content .ajs-input { + width: 100%; + margin: 0; + padding: .65em 1em; + font-size: 1em; + background-color: #FFF; + border: 1px solid rgba(0, 0, 0, 0.15); + outline: 0; + color: rgba(0, 0, 0, 0.7); + border-radius: .3125em; + transition: background-color 0.3s ease-out, box-shadow 0.2s ease, border-color 0.2s ease; + box-sizing: border-box; +} +.alertify .ajs-body .ajs-content .ajs-input:active { + border-color: rgba(0, 0, 0, 0.3); + background-color: #FAFAFA; +} +.alertify .ajs-body .ajs-content .ajs-input:focus { + border-color: rgba(0, 0, 0, 0.2); + color: rgba(0, 0, 0, 0.85); +} +.alertify.ajs-resizable .ajs-content, +.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content { + top: 64px; + bottom: 74px; +} +.alertify .ajs-footer { + background-color: #fff; + padding: 1rem 2rem; + border-top: none; + border-radius: 0 0 5px 5px; +} +.alertify-notifier .ajs-message { + background: rgba(255, 255, 255, 0.95); + color: #000; + text-align: center; + border: solid 1px #ddd; + border-radius: 2px; +} +.alertify-notifier .ajs-message.ajs-success { + color: #fff; + background: rgba(91, 189, 114, 0.95); + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-error { + color: #fff; + background: rgba(217, 92, 92, 0.95); + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-warning { + background: rgba(252, 248, 215, 0.95); + border-color: #999; +} diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.min.css b/web/pgadmin/static/css/alertifyjs/themes/semantic.min.css new file mode 100644 index 000000000..f97d8d3c5 --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/semantic.min.css @@ -0,0 +1,6 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dimmer{background-color:rgba(0,0,0,.85);opacity:1}.alertify .ajs-dialog{max-width:50%;min-height:137px;background-color:#F4F4F4;border:1px solid #DDD;box-shadow:none;border-radius:5px}.alertify .ajs-header{padding:1.5rem 2rem;border-bottom:none;border-radius:5px 5px 0 0;color:#555;background-color:#fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.6em;font-weight:700}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#555}.alertify .ajs-body .ajs-content .ajs-input{width:100%;margin:0;padding:.65em 1em;font-size:1em;background-color:#FFF;border:1px solid rgba(0,0,0,.15);outline:0;color:rgba(0,0,0,.7);border-radius:.3125em;transition:background-color .3s ease-out,box-shadow .2s ease,border-color .2s ease;box-sizing:border-box}.alertify .ajs-body .ajs-content .ajs-input:active{border-color:rgba(0,0,0,.3);background-color:#FAFAFA}.alertify .ajs-body .ajs-content .ajs-input:focus{border-color:rgba(0,0,0,.2);color:rgba(0,0,0,.85)}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:64px;bottom:74px}.alertify .ajs-footer{background-color:#fff;padding:1rem 2rem;border-top:none;border-radius:0 0 5px 5px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:1px solid #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999} \ No newline at end of file diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.css b/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.css new file mode 100644 index 000000000..27f3d0836 --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.css @@ -0,0 +1,84 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dimmer { + background-color: rgba(0, 0, 0, 0.85); + opacity: 1; +} +.alertify .ajs-dialog { + max-width: 50%; + min-height: 137px; + background-color: #F4F4F4; + border: 1px solid #DDD; + box-shadow: none; + border-radius: 5px; +} +.alertify .ajs-header { + padding: 1.5rem 2rem; + border-bottom: none; + border-radius: 5px 5px 0 0; + color: #555; + background-color: #fff; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 1.6em; + font-weight: 700; +} +.alertify .ajs-body { + font-family: 'Roboto', sans-serif; + color: #555; +} +.alertify .ajs-body .ajs-content .ajs-input { + width: 100%; + margin: 0; + padding: .65em 1em; + font-size: 1em; + background-color: #FFF; + border: 1px solid rgba(0, 0, 0, 0.15); + outline: 0; + color: rgba(0, 0, 0, 0.7); + border-radius: .3125em; + transition: background-color 0.3s ease-out, box-shadow 0.2s ease, border-color 0.2s ease; + box-sizing: border-box; +} +.alertify .ajs-body .ajs-content .ajs-input:active { + border-color: rgba(0, 0, 0, 0.3); + background-color: #FAFAFA; +} +.alertify .ajs-body .ajs-content .ajs-input:focus { + border-color: rgba(0, 0, 0, 0.2); + color: rgba(0, 0, 0, 0.85); +} +.alertify.ajs-resizable .ajs-content, +.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content { + top: 64px; + bottom: 74px; +} +.alertify .ajs-footer { + background-color: #fff; + padding: 1rem 2rem; + border-top: none; + border-radius: 0 0 5px 5px; +} +.alertify-notifier .ajs-message { + background: rgba(255, 255, 255, 0.95); + color: #000; + text-align: center; + border: solid 1px #ddd; + border-radius: 2px; +} +.alertify-notifier .ajs-message.ajs-success { + color: #fff; + background: rgba(91, 189, 114, 0.95); + text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-error { + color: #fff; + background: rgba(217, 92, 92, 0.95); + text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); +} +.alertify-notifier .ajs-message.ajs-warning { + background: rgba(252, 248, 215, 0.95); + border-color: #999; +} diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.min.css b/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.min.css new file mode 100644 index 000000000..816a52f29 --- /dev/null +++ b/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.min.css @@ -0,0 +1,6 @@ +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +.alertify .ajs-dimmer{background-color:rgba(0,0,0,.85);opacity:1}.alertify .ajs-dialog{max-width:50%;min-height:137px;background-color:#F4F4F4;border:1px solid #DDD;box-shadow:none;border-radius:5px}.alertify .ajs-header{padding:1.5rem 2rem;border-bottom:none;border-radius:5px 5px 0 0;color:#555;background-color:#fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.6em;font-weight:700}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#555}.alertify .ajs-body .ajs-content .ajs-input{width:100%;margin:0;padding:.65em 1em;font-size:1em;background-color:#FFF;border:1px solid rgba(0,0,0,.15);outline:0;color:rgba(0,0,0,.7);border-radius:.3125em;transition:background-color .3s ease-out,box-shadow .2s ease,border-color .2s ease;box-sizing:border-box}.alertify .ajs-body .ajs-content .ajs-input:active{border-color:rgba(0,0,0,.3);background-color:#FAFAFA}.alertify .ajs-body .ajs-content .ajs-input:focus{border-color:rgba(0,0,0,.2);color:rgba(0,0,0,.85)}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:64px;bottom:74px}.alertify .ajs-footer{background-color:#fff;padding:1rem 2rem;border-top:none;border-radius:0 0 5px 5px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:1px solid #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999} \ No newline at end of file diff --git a/web/pgadmin/static/js/alertifyjs/alertify.js b/web/pgadmin/static/js/alertifyjs/alertify.js index d378e7e87..e45677acd 100644 --- a/web/pgadmin/static/js/alertifyjs/alertify.js +++ b/web/pgadmin/static/js/alertifyjs/alertify.js @@ -1,3257 +1,3349 @@ -/** - * AlertifyJS - * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. - * - * @author Mohammad Younes (http://alertifyjs.com) - * @copyright 2015 - * @license MIT - * @link http://alertifyjs.com - * @module AlertifyJS - * @version 1.1.0 - */ -( function ( window ) { - 'use strict'; - - /** - * Keys enum - * @type {Object} - */ - var keys = { - ENTER: 13, - ESC: 27, - F1: 112, - F12: 123, - LEFT: 37, - RIGHT: 39 - }; - /** - * Default options - * @type {Object} - */ - var defaults = { - modal:true, - basic:false, - frameless:false, - movable:true, - resizable:true, - closable:true, - maximizable:true, - startMaximized:false, - pinnable:true, - pinned:true, - padding: true, - overflow:true, - maintainFocus:true, - transition:'pulse', - notifier:{ - delay:5, - position:'bottom-right' - }, - glossary:{ - title:'AlertifyJS', - ok: 'OK', - cancel: 'Cancel', - acccpt: 'Accept', - deny: 'Deny', - confirm: 'Confirm', - decline: 'Decline', - close: 'Close', - maximize: 'Maximize', - restore: 'Restore', - }, - theme:{ - input:'ajs-input', - ok:'ajs-ok', - cancel:'ajs-cancel', - } - }; - - //holds open dialogs instances - var openDialogs = []; - - /** - * [Helper] Adds the specified class(es) to the element. - * - * @element {node} The element - * @className {string} One or more space-separated classes to be added to the class attribute of the element. - * - * @return {undefined} - */ - function addClass(element,classNames){ - element.className += ' ' + classNames; - } - - /** - * [Helper] Removes the specified class(es) from the element. - * - * @element {node} The element - * @className {string} One or more space-separated classes to be removed from the class attribute of the element. - * - * @return {undefined} - */ - function removeClass(element,classNames){ - var classes = classNames.split(' '); - for(var x=0;x 0) { - var args = []; - for (var x = 0; x < arguments.length; x += 1) { - args.push(arguments[x]); - } - args.push(context); - return method.apply(context, args); - } - return method.apply(context, [null, context]); - }; - } - /** - * Helper for creating a dialog close event. - * - * @return {object} - */ - function createCloseEvent(index, button) { - return { - index: index, - button: button, - cancel: false - }; - } - - - /** - * Super class for all dialogs - * - * @return {Object} base dialog prototype - */ - var dialog = (function () { - var //holds the list of used keys. - usedKeys = [], - //dummy variable, used to trigger dom reflow. - reflow = null, - //condition for detecting safari - isSafari = window.navigator.userAgent.indexOf('Safari') > -1 && window.navigator.userAgent.indexOf('Chrome') < 0, - //dialog building blocks - templates = { - dimmer:'
', - /*tab index required to fire click event before body focus*/ - modal: '
', - dialog: '
', - reset: '', - commands: '
', - header: '
', - body: '
', - content: '
', - footer: '', - buttons: { primary: '
', auxiliary: '
' }, - button: '', - resizeHandle: '
', - }, - //common class names - classes = { - base: 'alertify', - prefix: 'ajs-', - hidden: 'ajs-hidden', - noSelection: 'ajs-no-selection', - noOverflow: 'ajs-no-overflow', - noPadding:'ajs-no-padding', - modeless: 'ajs-modeless', - movable: 'ajs-movable', - resizable: 'ajs-resizable', - capture: 'ajs-capture', - fixed: 'ajs-fixed', - closable:'ajs-closable', - maximizable:'ajs-maximizable', - maximize: 'ajs-maximize', - restore: 'ajs-restore', - pinnable:'ajs-pinnable', - unpinned:'ajs-unpinned', - pin:'ajs-pin', - maximized: 'ajs-maximized', - animationIn: 'ajs-in', - animationOut: 'ajs-out', - shake:'ajs-shake', - basic:'ajs-basic', - frameless:'ajs-frameless' - }; - - /** - * Helper: initializes the dialog instance - * - * @return {Number} The total count of currently open modals. - */ - function initialize(instance){ - - if(!instance.__internal){ - - //no need to expose init after this. - delete instance.__init; - - //in case the script was included before body. - //after first dialog gets initialized, it won't be null anymore! - if(null === reflow){ - // set tabindex attribute on body element this allows script to give it - // focus after the dialog is closed - document.body.setAttribute( 'tabindex', '0' ); - } - - //get dialog buttons/focus setup - var setup; - if(typeof instance.setup === 'function'){ - setup = instance.setup(); - setup.options = setup.options || {}; - setup.focus = setup.focus || {}; - }else{ - setup = { - buttons:[], - focus:{ - element:null, - select:false - }, - options:{ - } - }; - } - - //initialize hooks object. - if(typeof instance.hooks !== 'object'){ - instance.hooks = {}; - } - - var internal = instance.__internal = { - /** - * Flag holding the open state of the dialog - * - * @type {Boolean} - */ - isOpen:false, - /** - * Active element is the element that will receive focus after - * closing the dialog. It defaults as the body tag, but gets updated - * to the last focused element before the dialog was opened. - * - * @type {Node} - */ - activeElement:document.body, - timerIn:undefined, - timerOut:undefined, - buttons: setup.buttons || [], - focus: setup.focus, - options: { - title: undefined, - modal: undefined, - basic:undefined, - frameless:undefined, - pinned: undefined, - movable: undefined, - resizable: undefined, - closable: undefined, - maximizable: undefined, - startMaximized: undefined, - pinnable: undefined, - transition: undefined, - padding:undefined, - overflow:undefined, - onshow:undefined, - onclose:undefined, - onfocus:undefined, - }, - resetHandler:undefined, - beginMoveHandler:undefined, - beginResizeHandler:undefined, - bringToFrontHandler:undefined, - modalClickHandler:undefined, - buttonsClickHandler:undefined, - commandsClickHandler:undefined, - transitionInHandler:undefined, - transitionOutHandler:undefined - }; - - - var elements = {}; - //root node - elements.root = document.createElement('div'); - - elements.root.className = classes.base + ' ' + classes.hidden + ' '; - - elements.root.innerHTML = templates.dimmer + templates.modal; - - //dimmer - elements.dimmer = elements.root.firstChild; - - //dialog - elements.modal = elements.root.lastChild; - elements.modal.innerHTML = templates.dialog; - elements.dialog = elements.modal.firstChild; - elements.dialog.innerHTML = templates.reset + templates.commands + templates.header + templates.body + templates.footer + templates.resizeHandle + templates.reset; - - //reset links - elements.reset = []; - elements.reset.push(elements.dialog.firstChild); - elements.reset.push(elements.dialog.lastChild); - - //commands - elements.commands = {}; - elements.commands.container = elements.reset[0].nextSibling; - elements.commands.pin = elements.commands.container.firstChild; - elements.commands.maximize = elements.commands.pin.nextSibling; - elements.commands.close = elements.commands.maximize.nextSibling; - - //header - elements.header = elements.commands.container.nextSibling; - - //body - elements.body = elements.header.nextSibling; - elements.body.innerHTML = templates.content; - elements.content = elements.body.firstChild; - - //footer - elements.footer = elements.body.nextSibling; - elements.footer.innerHTML = templates.buttons.auxiliary + templates.buttons.primary; - - //resize handle - elements.resizeHandle = elements.footer.nextSibling; - - //buttons - elements.buttons = {}; - elements.buttons.auxiliary = elements.footer.firstChild; - elements.buttons.primary = elements.buttons.auxiliary.nextSibling; - elements.buttons.primary.innerHTML = templates.button; - elements.buttonTemplate = elements.buttons.primary.firstChild; - //remove button template - elements.buttons.primary.removeChild(elements.buttonTemplate); - - for(var x=0; x < instance.__internal.buttons.length; x+=1) { - var button = instance.__internal.buttons[x]; - - // add to the list of used keys. - if(usedKeys.indexOf(button.key) < 0){ - usedKeys.push(button.key); - } - - button.element = elements.buttonTemplate.cloneNode(); - button.element.innerHTML = button.text; - if(typeof button.className === 'string' && button.className !== ''){ - addClass(button.element, button.className); - } - for(var key in button.attrs){ - if(key !== 'className' && button.attrs.hasOwnProperty(key)){ - button.element.setAttribute(key, button.attrs[key]); - } - } - if(button.scope === 'auxiliary'){ - elements.buttons.auxiliary.appendChild(button.element); - }else{ - elements.buttons.primary.appendChild(button.element); - } - } - //make elements pubic - instance.elements = elements; - - //save event handlers delegates - internal.resetHandler = delegate(instance, onReset); - internal.beginMoveHandler = delegate(instance, beginMove); - internal.beginResizeHandler = delegate(instance, beginResize); - internal.bringToFrontHandler = delegate(instance, bringToFront); - internal.modalClickHandler = delegate(instance, modalClickHandler); - internal.buttonsClickHandler = delegate(instance, buttonsClickHandler); - internal.commandsClickHandler = delegate(instance, commandsClickHandler); - internal.transitionInHandler = delegate(instance, handleTransitionInEvent); - internal.transitionOutHandler = delegate(instance, handleTransitionOutEvent); - - - //settings - instance.set('title', setup.options.title === undefined ? alertify.defaults.glossary.title : setup.options.title); - - instance.set('modal', setup.options.modal === undefined ? alertify.defaults.modal : setup.options.modal); - instance.set('basic', setup.options.basic === undefined ? alertify.defaults.basic : setup.options.basic); - instance.set('frameless', setup.options.frameless === undefined ? alertify.defaults.frameless : setup.options.frameless); - - instance.set('movable', setup.options.movable === undefined ? alertify.defaults.movable : setup.options.movable); - instance.set('resizable', setup.options.resizable === undefined ? alertify.defaults.resizable : setup.options.resizable); - - instance.set('closable', setup.options.closable === undefined ? alertify.defaults.closable : setup.options.closable); - instance.set('maximizable', setup.options.maximizable === undefined ? alertify.defaults.maximizable : setup.options.maximizable); - instance.set('startMaximized', setup.options.startMaximized === undefined ? alertify.defaults.startMaximized : setup.options.startMaximized); - - instance.set('pinnable', setup.options.pinnable === undefined ? alertify.defaults.pinnable : setup.options.pinnable); - instance.set('pinned', setup.options.pinned === undefined ? alertify.defaults.pinned : setup.options.pinned); - - instance.set('transition', setup.options.transition === undefined ? alertify.defaults.transition : setup.options.transition); - - instance.set('padding', setup.options.padding === undefined ? alertify.defaults.padding : setup.options.padding); - instance.set('overflow', setup.options.overflow === undefined ? alertify.defaults.overflow : setup.options.overflow); - - - // allow dom customization - if(typeof instance.build === 'function'){ - instance.build(); - } - } - - //add to the end of the DOM tree. - document.body.appendChild(instance.elements.root); - } - - /** - * Helper: adds/removes no-overflow class from body - * - */ - function ensureNoOverflow(){ - var requiresNoOverflow = 0; - for(var x=0;x 0 && document.body.className.indexOf(classes.noOverflow) < 0){ - //first open modal or first maximized one - addClass(document.body, classes.noOverflow); - } - } - - /** - * Sets the name of the transition used to show/hide the dialog - * - * @param {Object} instance The dilog instance. - * - */ - function updateTransition(instance, value, oldValue){ - if(typeof oldValue === 'string'){ - removeClass(instance.elements.root,classes.prefix + oldValue); - } - addClass(instance.elements.root, classes.prefix + value); - reflow = instance.elements.root.offsetWidth; - } - - /** - * Toggles the dialog display mode - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function updateDisplayMode(instance){ - if(instance.get('modal')){ - - //make modal - removeClass(instance.elements.root, classes.modeless); - - //only if open - if(instance.isOpen()){ - unbindModelessEvents(instance); - - //in case a pinned modless dialog was made modal while open. - updateAbsPositionFix(instance); - - ensureNoOverflow(); - } - }else{ - //make modelss - addClass(instance.elements.root, classes.modeless); - - //only if open - if(instance.isOpen()){ - bindModelessEvents(instance); - - //in case pin/unpin was called while a modal is open - updateAbsPositionFix(instance); - - ensureNoOverflow(); - } - } - } - - /** - * Toggles the dialog basic view mode - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function updateBasicMode(instance){ - if (instance.get('basic')) { - // add class - addClass(instance.elements.root, classes.basic); - } else { - // remove class - removeClass(instance.elements.root, classes.basic); - } - } - - /** - * Toggles the dialog frameless view mode - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function updateFramelessMode(instance){ - if (instance.get('frameless')) { - // add class - addClass(instance.elements.root, classes.frameless); - } else { - // remove class - removeClass(instance.elements.root, classes.frameless); - } - } - - /** - * Helper: Brings the modeless dialog to front, attached to modeless dialogs. - * - * @param {Event} event Focus event - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function bringToFront(event, instance){ - - // Do not bring to front if preceeded by an open modal - var index = openDialogs.indexOf(instance); - for(var x=index+1;x -1) { - triggerCallback(instance, function (button) { - return button.key === keyCode; - }); - return false; - } - } - /** - * Keydown event handler, attached to the document.body - * - * @param {Event} DOM event object. - * @param {Object} The dilog instance. - * - * @return {undefined} - */ - function keydownHandler(event) { - var instance = openDialogs[openDialogs.length - 1]; - var keyCode = event.keyCode; - if (keyCode === keys.LEFT || keyCode === keys.RIGHT) { - var buttons = instance.__internal.buttons; - for (var x = 0; x < buttons.length; x += 1) { - if (document.activeElement === buttons[x].element) { - switch (keyCode) { - case keys.LEFT: - buttons[(x || buttons.length) - 1].element.focus(); - return; - case keys.RIGHT: - buttons[(x + 1) % buttons.length].element.focus(); - return; - } - } - } - }else if (keyCode < keys.F12 + 1 && keyCode > keys.F1 - 1 && usedKeys.indexOf(keyCode) > -1) { - event.preventDefault(); - event.stopPropagation(); - triggerCallback(instance, function (button) { - return button.key === keyCode; - }); - return false; - } - } - - - /** - * Sets focus to proper dialog element - * - * @param {Object} instance The dilog instance. - * @param {Node} [resetTarget=undefined] DOM element to reset focus to. - * - * @return {undefined} - */ - function setFocus(instance, resetTarget) { - // reset target has already been determined. - if (resetTarget) { - resetTarget.focus(); - } else { - // current instance focus settings - var focus = instance.__internal.focus; - // the focus element. - var element = focus.element; - - switch (typeof focus.element) { - // a number means a button index - case 'number': - if (instance.__internal.buttons.length > focus.element) { - //in basic view, skip focusing the buttons. - if (instance.get('basic') === true) { - element = instance.elements.reset[0]; - } else { - element = instance.__internal.buttons[focus.element].element; - } - } - break; - // a string means querySelector to select from dialog body contents. - case 'string': - element = instance.elements.body.querySelector(focus.element); - break; - // a function should return the focus element. - case 'function': - element = focus.element.call(instance); - break; - } - - // if no focus element, default to first reset element. - if ((typeof element === 'undefined' || element === null) && instance.__internal.buttons.length === 0) { - element = instance.elements.reset[0]; - } - // focus - if (element && element.focus) { - element.focus(); - // if selectable - if (focus.select && element.select) { - element.select(); - } - } - } - } - - /** - * Focus event handler, attached to document.body and dialogs own reset links. - * handles the focus for modal dialogs only. - * - * @param {Event} event DOM focus event object. - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function onReset(event, instance) { - - // should work on last modal if triggered from document.body - if (!instance) { - for (var x = openDialogs.length - 1; x > -1; x -= 1) { - if (openDialogs[x].isModal()) { - instance = openDialogs[x]; - break; - } - } - } - // if modal - if (instance && instance.isModal()) { - // determine reset target to enable forward/backward tab cycle. - var resetTarget, target = event.srcElement || event.target; - var lastResetElement = target === instance.elements.reset[1] || (instance.__internal.buttons.length === 0 && target === document.body); - - // if last reset link, then go to maximize or close - if (lastResetElement) { - if (instance.get('maximizable')) { - resetTarget = instance.elements.commands.maximize; - } else if (instance.get('closable')) { - resetTarget = instance.elements.commands.close; - } - } - // if no reset target found, try finding the best button - if (resetTarget === undefined) { - if (typeof instance.__internal.focus.element === 'number') { - // button focus element, go to first available button - if (target === instance.elements.reset[0]) { - resetTarget = instance.elements.buttons.auxiliary.firstChild || instance.elements.buttons.primary.firstChild; - } else if (lastResetElement) { - //restart the cycle by going to first reset link - resetTarget = instance.elements.reset[0]; - } - } else { - // will reach here when tapping backwards, so go to last child - // The focus element SHOULD NOT be a button (logically!). - if (target === instance.elements.reset[0]) { - resetTarget = instance.elements.buttons.primary.lastChild || instance.elements.buttons.auxiliary.lastChild; - } - } - } - // focus - setFocus(instance, resetTarget); - } - } - /** - * Transition in transitionend event handler. - * - * @param {Event} TransitionEnd event object. - * @param {Object} The dilog instance. - * - * @return {undefined} - */ - function handleTransitionInEvent(event, instance) { - // clear the timer - clearTimeout(instance.__internal.timerIn); - - // once transition is complete, set focus - setFocus(instance); - - // allow handling key up after transition ended. - cancelKeyup = false; - - // allow custom `onfocus` method - if (typeof instance.get('onfocus') === 'function') { - instance.get('onfocus')(); - } - - // unbind the event - off(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler); - - removeClass(instance.elements.root, classes.animationIn); - } - - /** - * Transition out transitionend event handler. - * - * @param {Event} TransitionEnd event object. - * @param {Object} The dilog instance. - * - * @return {undefined} - */ - function handleTransitionOutEvent(event, instance) { - // clear the timer - clearTimeout(instance.__internal.timerOut); - // unbind the event - off(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler); - - // reset move updates - resetMove(instance); - // reset resize updates - resetResize(instance); - - // restore if maximized - if (instance.isMaximized() && !instance.get('startMaximized')) { - restore(instance); - } - - // return focus to the last active element - if (alertify.defaults.maintainFocus && instance.__internal.activeElement) { - instance.__internal.activeElement.focus(); - instance.__internal.activeElement = null; - } - } - /* Controls moving a dialog around */ - //holde the current moving instance - var movable = null, - //holds the current X offset when move starts - offsetX = 0, - //holds the current Y offset when move starts - offsetY = 0, - xProp = 'pageX', - yProp = 'pageY' - ; - - /** - * Helper: sets the element top/left coordinates - * - * @param {Event} event DOM event object. - * @param {Node} element The element being moved. - * - * @return {undefined} - */ - function moveElement(event, element) { - element.style.left = (event[xProp] - offsetX) + 'px'; - element.style.top = (event[yProp] - offsetY) + 'px'; - } - - /** - * Triggers the start of a move event, attached to the header element mouse down event. - * Adds no-selection class to the body, disabling selection while moving. - * - * @param {Event} event DOM event object. - * @param {Object} instance The dilog instance. - * - * @return {Boolean} false - */ - function beginMove(event, instance) { - if (resizable === null && !instance.isMaximized() && instance.get('movable')) { - var eventSrc; - if (event.type === 'touchstart') { - event.preventDefault(); - eventSrc = event.targetTouches[0]; - xProp = 'clientX'; - yProp = 'clientY'; - } else if (event.button === 0) { - eventSrc = event; - } - - if (eventSrc) { - - movable = instance; - offsetX = eventSrc[xProp]; - offsetY = eventSrc[yProp]; - - var element = instance.elements.dialog; - addClass(element, classes.capture); - - if (element.style.left) { - offsetX -= parseInt(element.style.left, 10); - } - - if (element.style.top) { - offsetY -= parseInt(element.style.top, 10); - } - moveElement(eventSrc, element); - - addClass(document.body, classes.noSelection); - return false; - } - } - } - - /** - * The actual move handler, attached to document.body mousemove event. - * - * @param {Event} event DOM event object. - * - * @return {undefined} - */ - function move(event) { - if (movable) { - var eventSrc; - if (event.type === 'touchmove') { - event.preventDefault(); - eventSrc = event.targetTouches[0]; - } else if (event.button === 0) { - eventSrc = event; - } - if (eventSrc) { - moveElement(eventSrc, movable.elements.dialog); - } - } - } - - /** - * Triggers the end of a move event, attached to document.body mouseup event. - * Removes no-selection class from document.body, allowing selection. - * - * @return {undefined} - */ - function endMove() { - if (movable) { - var element = movable.elements.dialog; - movable = null; - removeClass(document.body, classes.noSelection); - removeClass(element, classes.capture); - } - } - - /** - * Resets any changes made by moving the element to its original state, - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function resetMove(instance) { - movable = null; - var element = instance.elements.dialog; - element.style.left = element.style.top = ''; - } - - /** - * Updates the dialog move behavior. - * - * @param {Object} instance The dilog instance. - * @param {Boolean} on True to add the behavior, removes it otherwise. - * - * @return {undefined} - */ - function updateMovable(instance) { - if (instance.get('movable')) { - // add class - addClass(instance.elements.root, classes.movable); - if (instance.isOpen()) { - bindMovableEvents(instance); - } - } else { - - //reset - resetMove(instance); - // remove class - removeClass(instance.elements.root, classes.movable); - if (instance.isOpen()) { - unbindMovableEvents(instance); - } - } - } - - /* Controls moving a dialog around */ - //holde the current instance being resized - var resizable = null, - //holds the staring left offset when resize starts. - startingLeft = Number.Nan, - //holds the staring width when resize starts. - startingWidth = 0, - //holds the initial width when resized for the first time. - minWidth = 0, - //holds the offset of the resize handle. - handleOffset = 0 - ; - - /** - * Helper: sets the element width/height and updates left coordinate if neccessary. - * - * @param {Event} event DOM mousemove event object. - * @param {Node} element The element being moved. - * @param {Boolean} pinned A flag indicating if the element being resized is pinned to the screen. - * - * @return {undefined} - */ - function resizeElement(event, element, pageRelative) { - - //calculate offsets from 0,0 - var current = element; - var offsetLeft = 0; - var offsetTop = 0; - do { - offsetLeft += current.offsetLeft; - offsetTop += current.offsetTop; - } while (current = current.offsetParent); - - // determine X,Y coordinates. - var X, Y; - if (pageRelative === true) { - X = event.pageX; - Y = event.pageY; - } else { - X = event.clientX; - Y = event.clientY; - } - // rtl handling - var isRTL = isRightToLeft(); - if (isRTL) { - // reverse X - X = document.body.offsetWidth - X; - // if has a starting left, calculate offsetRight - if (!isNaN(startingLeft)) { - offsetLeft = document.body.offsetWidth - offsetLeft - element.offsetWidth; - } - } - - // set width/height - element.style.height = (Y - offsetTop + handleOffset) + 'px'; - element.style.width = (X - offsetLeft + handleOffset) + 'px'; - - // if the element being resized has a starting left, maintain it. - // the dialog is centered, divide by half the offset to maintain the margins. - if (!isNaN(startingLeft)) { - var diff = Math.abs(element.offsetWidth - startingWidth) * 0.5; - if (isRTL) { - //negate the diff, why? - //when growing it should decrease left - //when shrinking it should increase left - diff *= -1; - } - if (element.offsetWidth > startingWidth) { - //growing - element.style.left = (startingLeft + diff) + 'px'; - } else if (element.offsetWidth >= minWidth) { - //shrinking - element.style.left = (startingLeft - diff) + 'px'; - } - } - } - - /** - * Triggers the start of a resize event, attached to the resize handle element mouse down event. - * Adds no-selection class to the body, disabling selection while moving. - * - * @param {Event} event DOM event object. - * @param {Object} instance The dilog instance. - * - * @return {Boolean} false - */ - function beginResize(event, instance) { - if (!instance.isMaximized()) { - var eventSrc; - if (event.type === 'touchstart') { - event.preventDefault(); - eventSrc = event.targetTouches[0]; - } else if (event.button === 0) { - eventSrc = event; - } - if (eventSrc) { - resizable = instance; - handleOffset = instance.elements.resizeHandle.offsetHeight / 2; - var element = instance.elements.dialog; - addClass(element, classes.capture); - startingLeft = parseInt(element.style.left, 10); - element.style.height = element.offsetHeight + 'px'; - element.style.minHeight = instance.elements.header.offsetHeight + instance.elements.footer.offsetHeight + 'px'; - element.style.width = (startingWidth = element.offsetWidth) + 'px'; - - if (element.style.maxWidth !== 'none') { - element.style.minWidth = (minWidth = element.offsetWidth) + 'px'; - } - element.style.maxWidth = 'none'; - addClass(document.body, classes.noSelection); - return false; - } - } - } - - /** - * The actual resize handler, attached to document.body mousemove event. - * - * @param {Event} event DOM event object. - * - * @return {undefined} - */ - function resize(event) { - if (resizable) { - var eventSrc; - if (event.type === 'touchmove') { - event.preventDefault(); - eventSrc = event.targetTouches[0]; - } else if (event.button === 0) { - eventSrc = event; - } - if (eventSrc) { - resizeElement(eventSrc, resizable.elements.dialog, !resizable.get('modal') && !resizable.get('pinned')); - } - } - } - - /** - * Triggers the end of a resize event, attached to document.body mouseup event. - * Removes no-selection class from document.body, allowing selection. - * - * @return {undefined} - */ - function endResize() { - if (resizable) { - var element = resizable.elements.dialog; - resizable = null; - removeClass(document.body, classes.noSelection); - removeClass(element, classes.capture); - cancelClick = true; - } - } - - /** - * Resets any changes made by resizing the element to its original state. - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function resetResize(instance) { - resizable = null; - var element = instance.elements.dialog; - if (element.style.maxWidth === 'none') { - //clear inline styles. - element.style.maxWidth = element.style.minWidth = element.style.width = element.style.height = element.style.minHeight = element.style.left = ''; - //reset variables. - startingLeft = Number.Nan; - startingWidth = minWidth = handleOffset = 0; - } - } - - - /** - * Updates the dialog move behavior. - * - * @param {Object} instance The dilog instance. - * @param {Boolean} on True to add the behavior, removes it otherwise. - * - * @return {undefined} - */ - function updateResizable(instance) { - if (instance.get('resizable')) { - // add class - addClass(instance.elements.root, classes.resizable); - if (instance.isOpen()) { - bindResizableEvents(instance); - } - } else { - //reset - resetResize(instance); - // remove class - removeClass(instance.elements.root, classes.resizable); - if (instance.isOpen()) { - unbindResizableEvents(instance); - } - } - } - - /** - * Reset move/resize on window resize. - * - * @param {Event} event window resize event object. - * - * @return {undefined} - */ - function windowResize(/*event*/) { - for (var x = 0; x < openDialogs.length; x += 1) { - var instance = openDialogs[x]; - resetMove(instance); - resetResize(instance); - } - } - /** - * Bind dialogs events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function bindEvents(instance) { - // if first dialog, hook global handlers - if (openDialogs.length === 1) { - //global - on(window, 'resize', windowResize); - on(document.body, 'keyup', keyupHandler); - on(document.body, 'keydown', keydownHandler); - on(document.body, 'focus', onReset); - - //move - on(document.documentElement, 'mousemove', move); - on(document.documentElement, 'touchmove', move); - on(document.documentElement, 'mouseup', endMove); - on(document.documentElement, 'touchend', endMove); - //resize - on(document.documentElement, 'mousemove', resize); - on(document.documentElement, 'touchmove', resize); - on(document.documentElement, 'mouseup', endResize); - on(document.documentElement, 'touchend', endResize); - } - - // common events - on(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler); - on(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler); - on(instance.elements.reset[0], 'focus', instance.__internal.resetHandler); - on(instance.elements.reset[1], 'focus', instance.__internal.resetHandler); - - //prevent handling key up when dialog is being opened by a key stroke. - cancelKeyup = true; - // hook in transition handler - on(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler); - - // modelss only events - if (!instance.get('modal')) { - bindModelessEvents(instance); - } - - // resizable - if (instance.get('resizable')) { - bindResizableEvents(instance); - } - - // movable - if (instance.get('movable')) { - bindMovableEvents(instance); - } - } - - /** - * Unbind dialogs events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function unbindEvents(instance) { - // if last dialog, remove global handlers - if (openDialogs.length === 1) { - //global - off(window, 'resize', windowResize); - off(document.body, 'keyup', keyupHandler); - off(document.body, 'keydown', keydownHandler); - off(document.body, 'focus', onReset); - //move - off(document.documentElement, 'mousemove', move); - off(document.documentElement, 'mouseup', endMove); - //resize - off(document.documentElement, 'mousemove', resize); - off(document.documentElement, 'mouseup', endResize); - } - - // common events - off(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler); - off(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler); - off(instance.elements.reset[0], 'focus', instance.__internal.resetHandler); - off(instance.elements.reset[1], 'focus', instance.__internal.resetHandler); - - // hook out transition handler - on(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler); - - // modelss only events - if (!instance.get('modal')) { - unbindModelessEvents(instance); - } - - // movable - if (instance.get('movable')) { - unbindMovableEvents(instance); - } - - // resizable - if (instance.get('resizable')) { - unbindResizableEvents(instance); - } - - } - - /** - * Bind modeless specific events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function bindModelessEvents(instance) { - on(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true); - } - - /** - * Unbind modeless specific events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function unbindModelessEvents(instance) { - off(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true); - } - - - - /** - * Bind movable specific events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function bindMovableEvents(instance) { - on(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler); - on(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler); - } - - /** - * Unbind movable specific events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function unbindMovableEvents(instance) { - off(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler); - off(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler); - } - - - - /** - * Bind resizable specific events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function bindResizableEvents(instance) { - on(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler); - on(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler); - } - - /** - * Unbind resizable specific events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function unbindResizableEvents(instance) { - off(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler); - off(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler); - } - - /** - * Bind closable events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function bindClosableEvents(instance) { - on(instance.elements.modal, 'click', instance.__internal.modalClickHandler); - } - - /** - * Unbind closable specific events - * - * @param {Object} instance The dilog instance. - * - * @return {undefined} - */ - function unbindClosableEvents(instance) { - off(instance.elements.modal, 'click', instance.__internal.modalClickHandler); - } - // dialog API - return { - __init:initialize, - /** - * Check if dialog is currently open - * - * @return {Boolean} - */ - isOpen: function () { - return this.__internal.isOpen; - }, - isModal: function (){ - return this.elements.root.className.indexOf(classes.modeless) < 0; - }, - isMaximized:function(){ - return this.elements.root.className.indexOf(classes.maximized) > -1; - }, - isPinned:function(){ - return this.elements.root.className.indexOf(classes.unpinned) < 0; - }, - maximize:function(){ - if(!this.isMaximized()){ - maximize(this); - } - return this; - }, - restore:function(){ - if(this.isMaximized()){ - restore(this); - } - return this; - }, - pin:function(){ - if(!this.isPinned()){ - pin(this); - } - return this; - }, - unpin:function(){ - if(this.isPinned()){ - unpin(this); - } - return this; - }, - /** - * Move the dialog to a specific x/y coordinates - * - * @param {Number} x The new dialog x coordinate in pixels. - * @param {Number} y The new dialog y coordinate in pixels. - * - * @return {Object} The dialog instance. - */ - moveTo:function(x,y){ - if(!isNaN(x) && !isNaN(y)){ - var element = this.elements.dialog, - current = element, - offsetLeft = 0, - offsetTop = 0; - - //subtract existing left,top - if (element.style.left) { - offsetLeft -= parseInt(element.style.left, 10); - } - if (element.style.top) { - offsetTop -= parseInt(element.style.top, 10); - } - //calc offset - do { - offsetLeft += current.offsetLeft; - offsetTop += current.offsetTop; - } while (current = current.offsetParent); - - //calc left, top - var left = (x - offsetLeft); - var top = (y - offsetTop); - - //// rtl handling - if (isRightToLeft()) { - left *= -1; - } - - element.style.left = left + 'px'; - element.style.top = top + 'px'; - } - return this; - }, - /** - * Resize the dialog to a specific width/height (the dialog must be 'resizable'). - * The dialog can be resized to: - * A minimum width equal to the initial display width - * A minimum height equal to the sum of header/footer heights. - * - * - * @param {Number} width The new dialog width in pixels. - * @param {Number} height The new dialog height in pixels. - * - * @return {Object} The dialog instance. - */ - resizeTo:function(width,height){ - if(!isNaN(width) && !isNaN(height) && this.get('resizable') === true){ - var element = this.elements.dialog; - if (element.style.maxWidth !== 'none') { - element.style.minWidth = (minWidth = element.offsetWidth) + 'px'; - } - element.style.maxWidth = 'none'; - element.style.minHeight = this.elements.header.offsetHeight + this.elements.footer.offsetHeight + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - } - return this; - }, - /** - * Gets or Sets dialog settings/options - * - * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs. - * @param {Object} value Optional, the value associated with the key (in case it was a string). - * - * @return {undefined} - */ - setting : function (key, value) { - var self = this; - var result = update(this, this.__internal.options, function(k,o,n){ optionUpdated(self,k,o,n); }, key, value); - if(result.op === 'get'){ - if(result.found){ - return result.value; - }else if(typeof this.settings !== 'undefined'){ - return update(this, this.settings, this.settingUpdated || function(){}, key, value).value; - }else{ - return undefined; - } - }else if(result.op === 'set'){ - if(result.items.length > 0){ - var callback = this.settingUpdated || function(){}; - for(var x=0;x 0) { - var self = this; - this.__internal.timer = setTimeout(function () { self.dismiss(); }, this.__internal.delay * 1000); - } - return this; - }, - /* - * Sets the notification message contents - * @param {string or DOMElement} content The notification message content - * - */ - setContent: function (content) { - if (typeof content === 'string') { - this.element.innerHTML = content; - } else { - this.element.appendChild(content); - } - return this; - }, - /* - * Dismisses all open notifications except this. - * - */ - dismissOthers: function () { - notifier.dismissAll(this); - return this; - } - }); - } - - //notifier api - return { - /** - * Gets or Sets notifier settings. - * - * @param {string} key The setting name - * @param {Variant} value The setting value. - * - * @return {Object} if the called as a setter, return the notifier instance. - */ - setting: function (key, value) { - //ensure init - initialize(this); - - if (typeof value === 'undefined') { - //get - return this.__internal[key]; - } else { - //set - switch (key) { - case 'position': - this.__internal.position = value; - updatePosition(this); - break; - case 'delay': - this.__internal.delay = value; - break; - } - } - return this; - }, - /** - * [Alias] Sets dialog settings/options - */ - set:function(key,value){ - this.setting(key,value); - return this; - }, - /** - * [Alias] Gets dialog settings/options - */ - get:function(key){ - return this.setting(key); - }, - /** - * Creates a new notification message - * - * @param {string} type The type of notification message (simply a CSS class name 'ajs-{type}' to be added). - * @param {Function} callback A callback function to be invoked when the message is dismissed. - * - * @return {undefined} - */ - create: function (type, callback) { - //ensure notifier init - initialize(this); - //create new notification message - var div = document.createElement('div'); - div.className = classes.message + ((typeof type === 'string' && type !== '') ? ' ajs-' + type : ''); - return create(div, callback); - }, - /** - * Dismisses all open notifications. - * - * @param {Object} excpet [optional] The notification object to exclude from dismissal. - * - */ - dismissAll: function (except) { - var clone = openInstances.slice(0); - for (var x = 0; x < clone.length; x += 1) { - var instance = clone[x]; - if (except === undefined || except !== instance) { - instance.dismiss(); - } - } - } - }; - })(); - /** - * Alertify public API - * This contains everything that is exposed through the alertify object. - * - * @return {Object} - */ - function Alertify() { - - // holds a references of created dialogs - var dialogs = {}; - - /** - * Extends a given prototype by merging properties from base into sub. - * - * @sub {Object} sub The prototype being overwritten. - * @base {Object} base The prototype being written. - * - * @return {Object} The extended prototype. - */ - function extend(sub, base) { - // copy dialog pototype over definition. - for (var prop in base) { - if (base.hasOwnProperty(prop)) { - sub[prop] = base[prop]; - } - } - return sub; - } - - - /** - * Helper: returns a dialog instance from saved dialogs. - * and initializes the dialog if its not already initialized. - * - * @name {String} name The dialog name. - * - * @return {Object} The dialog instance. - */ - function get_dialog(name) { - var dialog = dialogs[name].dialog; - //initialize the dialog if its not already initialized. - if (dialog && typeof dialog.__init === 'function') { - dialog.__init(dialog); - } - return dialog; - } - - /** - * Helper: registers a new dialog definition. - * - * @name {String} name The dialog name. - * @Factory {Function} Factory a function resposible for creating dialog prototype. - * @transient {Boolean} transient True to create a new dialog instance each time the dialog is invoked, false otherwise. - * @base {String} base the name of another dialog to inherit from. - * - * @return {Object} The dialog definition. - */ - function register(name, Factory, transient, base) { - var definition = { - dialog: null, - factory: Factory - }; - - //if this is based on an existing dialog, create a new definition - //by applying the new protoype over the existing one. - if (base !== undefined) { - definition.factory = function () { - return extend(new dialogs[base].factory(), new Factory()); - }; - } - - if (!transient) { - //create a new definition based on dialog - definition.dialog = extend(new definition.factory(), dialog); - } - return dialogs[name] = definition; - } - - return { - /** - * Alertify defaults - * - * @type {Object} - */ - defaults: defaults, - /** - * Dialogs factory - * - * @param {string} Dialog name. - * @param {Function} A Dialog factory function. - * @param {Boolean} Indicates whether to create a singleton or transient dialog. - * @param {String} The name of the base type to inherit from. - */ - dialog: function (name, Factory, transient, base) { - - // get request, create a new instance and return it. - if (typeof Factory !== 'function') { - return get_dialog(name); - } - - if (this.hasOwnProperty(name)) { - throw new Error('alertify.dialog: name already exists'); - } - - // register the dialog - var definition = register(name, Factory, transient, base); - - if (transient) { - - // make it public - this[name] = function () { - //if passed with no params, consider it a get request - if (arguments.length === 0) { - return definition.dialog; - } else { - var instance = extend(new definition.factory(), dialog); - //ensure init - if (instance && typeof instance.__init === 'function') { - instance.__init(instance); - } - instance['main'].apply(instance, arguments); - return instance['show'].apply(instance); - } - }; - } else { - // make it public - this[name] = function () { - //ensure init - if (definition.dialog && typeof definition.dialog.__init === 'function') { - definition.dialog.__init(definition.dialog); - } - //if passed with no params, consider it a get request - if (arguments.length === 0) { - return definition.dialog; - } else { - var dialog = definition.dialog; - dialog['main'].apply(definition.dialog, arguments); - return dialog['show'].apply(definition.dialog); - } - }; - } - }, - /** - * Close all open dialogs. - * - * @param {Object} excpet [optional] The dialog object to exclude from closing. - * - * @return {undefined} - */ - closeAll: function (except) { - var clone = openDialogs.slice(0); - for (var x = 0; x < clone.length; x += 1) { - var instance = clone[x]; - if (except === undefined || except !== instance) { - instance.close(); - } - } - }, - /** - * Gets or Sets dialog settings/options. if the dialog is transient, this call does nothing. - * - * @param {string} name The dialog name. - * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs. - * @param {Variant} value Optional, the value associated with the key (in case it was a string). - * - * @return {undefined} - */ - setting: function (name, key, value) { - - if (name === 'notifier') { - return notifier.setting(key, value); - } - - var dialog = get_dialog(name); - if (dialog) { - return dialog.setting(key, value); - } - }, - /** - * [Alias] Sets dialog settings/options - */ - set: function(name,key,value){ - return this.setting(name, key,value); - }, - /** - * [Alias] Gets dialog settings/options - */ - get: function(name, key){ - return this.setting(name, key); - }, - /** - * Creates a new notification message. - * If a type is passed, a class name "ajs-{type}" will be added. - * This allows for custom look and feel for various types of notifications. - * - * @param {String | DOMElement} [message=undefined] Message text - * @param {String} [type=''] Type of log message - * @param {String} [wait=''] Time (in seconds) to wait before auto-close - * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. - * - * @return {Object} Notification object. - */ - notify: function (message, type, wait, callback) { - return notifier.create(type, callback).push(message, wait); - }, - /** - * Creates a new notification message. - * - * @param {String} [message=undefined] Message text - * @param {String} [wait=''] Time (in seconds) to wait before auto-close - * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. - * - * @return {Object} Notification object. - */ - message: function (message, wait, callback) { - return notifier.create(null, callback).push(message, wait); - }, - /** - * Creates a new notification message of type 'success'. - * - * @param {String} [message=undefined] Message text - * @param {String} [wait=''] Time (in seconds) to wait before auto-close - * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. - * - * @return {Object} Notification object. - */ - success: function (message, wait, callback) { - return notifier.create('success', callback).push(message, wait); - }, - /** - * Creates a new notification message of type 'error'. - * - * @param {String} [message=undefined] Message text - * @param {String} [wait=''] Time (in seconds) to wait before auto-close - * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. - * - * @return {Object} Notification object. - */ - error: function (message, wait, callback) { - return notifier.create('error', callback).push(message, wait); - }, - /** - * Creates a new notification message of type 'warning'. - * - * @param {String} [message=undefined] Message text - * @param {String} [wait=''] Time (in seconds) to wait before auto-close - * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. - * - * @return {Object} Notification object. - */ - warning: function (message, wait, callback) { - return notifier.create('warning', callback).push(message, wait); - }, - /** - * Dismisses all open notifications - * - * @return {undefined} - */ - dismissAll: function () { - notifier.dismissAll(); - } - }; - } - var alertify = new Alertify(); - - /** - * Alert dialog definition - * - * invoked by: - * alertify.alert(message); - * alertify.alert(title, message); - * alertify.alert(message, onok); - * alertify.alert(title, message, onok); - */ - alertify.dialog('alert', function () { - return { - main: function (_title, _message, _onok) { - var title, message, onok; - switch (arguments.length) { - case 1: - message = _title; - break; - case 2: - if (typeof _message === 'function') { - message = _title; - onok = _message; - } else { - title = _title; - message = _message; - } - break; - case 3: - title = _title; - message = _message; - onok = _onok; - break; - } - this.set('title', title); - this.set('message', message); - this.set('onok', onok); - return this; - }, - setup: function () { - return { - buttons: [ - { - text: alertify.defaults.glossary.ok, - key: keys.ESC, - invokeOnClose: true, - className: alertify.defaults.theme.ok, - } - ], - focus: { - element: 0, - select: false - }, - options: { - maximizable: false, - resizable: false - } - }; - }, - build: function () { - // nothing - }, - prepare: function () { - //nothing - }, - setMessage: function (message) { - this.setContent(message); - }, - settings: { - message: undefined, - onok: undefined, - label: undefined, - }, - settingUpdated: function (key, oldValue, newValue) { - switch (key) { - case 'message': - this.setMessage(newValue); - break; - case 'label': - if (this.__internal.buttons[0].element) { - this.__internal.buttons[0].element.innerHTML = newValue; - } - break; - } - }, - callback: function (closeEvent) { - if (typeof this.get('onok') === 'function') { - var returnValue = this.get('onok').call(undefined, closeEvent); - if (typeof returnValue !== 'undefined') { - closeEvent.cancel = !returnValue; - } - } - } - }; - }); - /** - * Confirm dialog object - * - * alertify.confirm(message); - * alertify.confirm(message, onok); - * alertify.confirm(message, onok, oncancel); - * alertify.confirm(title, message, onok, oncancel); - */ - alertify.dialog('confirm', function () { - - var autoConfirm = { - timer: null, - index: null, - text: null, - duratuin: null, - task: function (event, self) { - if (self.isOpen()) { - self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text + ' (‏' + autoConfirm.duration + '‏) '; - autoConfirm.duration -= 1; - if (autoConfirm.duration === -1) { - clearAutoConfirm(self); - var button = self.__internal.buttons[autoConfirm.index]; - var closeEvent = createCloseEvent(autoConfirm.index, button); - - if (typeof self.callback === 'function') { - self.callback.apply(self, [closeEvent]); - } - //close the dialog. - if (closeEvent.close !== false) { - self.close(); - } - } - } else { - clearAutoConfirm(self); - } - } - }; - - function clearAutoConfirm(self) { - if (autoConfirm.timer !== null) { - clearInterval(autoConfirm.timer); - autoConfirm.timer = null; - self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text; - } - } - - function startAutoConfirm(self, index, duration) { - clearAutoConfirm(self); - autoConfirm.duration = duration; - autoConfirm.index = index; - autoConfirm.text = self.__internal.buttons[index].element.innerHTML; - autoConfirm.timer = setInterval(delegate(self, autoConfirm.task), 1000); - autoConfirm.task(null, self); - } - - - return { - main: function (_title, _message, _onok, _oncancel) { - var title, message, onok, oncancel; - switch (arguments.length) { - case 1: - message = _title; - break; - case 2: - message = _title; - onok = _message; - break; - case 3: - message = _title; - onok = _message; - oncancel = _onok; - break; - case 4: - title = _title; - message = _message; - onok = _onok; - oncancel = _oncancel; - break; - } - this.set('title', title); - this.set('message', message); - this.set('onok', onok); - this.set('oncancel', oncancel); - return this; - }, - setup: function () { - return { - buttons: [ - { - text: alertify.defaults.glossary.ok, - key: keys.ENTER, - className: alertify.defaults.theme.ok, - }, - { - text: alertify.defaults.glossary.cancel, - key: keys.ESC, - invokeOnClose: true, - className: alertify.defaults.theme.cancel, - } - ], - focus: { - element: 0, - select: false - }, - options: { - maximizable: false, - resizable: false - } - }; - }, - build: function () { - //nothing - }, - prepare: function () { - //nothing - }, - setMessage: function (message) { - this.setContent(message); - }, - settings: { - message: null, - labels: null, - onok: null, - oncancel: null, - defaultFocus: null, - reverseButtons: null, - }, - settingUpdated: function (key, oldValue, newValue) { - switch (key) { - case 'message': - this.setMessage(newValue); - break; - case 'labels': - if ('ok' in newValue && this.__internal.buttons[0].element) { - this.__internal.buttons[0].text = newValue.ok; - this.__internal.buttons[0].element.innerHTML = newValue.ok; - } - if ('cancel' in newValue && this.__internal.buttons[1].element) { - this.__internal.buttons[1].text = newValue.cancel; - this.__internal.buttons[1].element.innerHTML = newValue.cancel; - } - break; - case 'reverseButtons': - if (newValue === true) { - this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element); - } else { - this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element); - } - break; - case 'defaultFocus': - this.__internal.focus.element = newValue === 'ok' ? 0 : 1; - break; - } - }, - callback: function (closeEvent) { - clearAutoConfirm(this); - var returnValue; - switch (closeEvent.index) { - case 0: - if (typeof this.get('onok') === 'function') { - returnValue = this.get('onok').call(undefined, closeEvent); - if (typeof returnValue !== 'undefined') { - closeEvent.cancel = !returnValue; - } - } - break; - case 1: - if (typeof this.get('oncancel') === 'function') { - returnValue = this.get('oncancel').call(undefined, closeEvent); - if (typeof returnValue !== 'undefined') { - closeEvent.cancel = !returnValue; - } - } - break; - } - }, - autoOk: function (duration) { - startAutoConfirm(this, 0, duration); - return this; - }, - autoCancel: function (duration) { - startAutoConfirm(this, 1, duration); - return this; - } - }; - }); - /** - * Prompt dialog object - * - * invoked by: - * alertify.prompt(message); - * alertify.prompt(message, value); - * alertify.prompt(message, value, onok); - * alertify.prompt(message, value, onok, oncancel); - * alertify.prompt(title, message, value, onok, oncancel); - */ - alertify.dialog('prompt', function () { - var input = document.createElement('INPUT'); - var p = document.createElement('P'); - return { - main: function (_title, _message, _value, _onok, _oncancel) { - var title, message, value, onok, oncancel; - switch (arguments.length) { - case 1: - message = _title; - break; - case 2: - message = _title; - value = _message; - break; - case 3: - message = _title; - value = _message; - onok = _value; - break; - case 4: - message = _title; - value = _message; - onok = _value; - oncancel = _onok; - break; - case 5: - title = _title; - message = _message; - value = _value; - onok = _onok; - oncancel = _oncancel; - break; - } - this.set('title', title); - this.set('message', message); - this.set('value', value); - this.set('onok', onok); - this.set('oncancel', oncancel); - return this; - }, - setup: function () { - return { - buttons: [ - { - text: alertify.defaults.glossary.ok, - key: keys.ENTER, - className: alertify.defaults.theme.ok, - }, - { - text: alertify.defaults.glossary.cancel, - key: keys.ESC, - invokeOnClose: true, - className: alertify.defaults.theme.cancel, - } - ], - focus: { - element: input, - select: true - }, - options: { - maximizable: false, - resizable: false - } - }; - }, - build: function () { - input.className = alertify.defaults.theme.input; - input.setAttribute('type', 'text'); - input.value = this.get('value'); - this.elements.content.appendChild(p); - this.elements.content.appendChild(input); - }, - prepare: function () { - //nothing - }, - setMessage: function (message) { - if (typeof message === 'string') { - p.innerHTML = message; - } else if (message instanceof window.HTMLElement && p.firstChild !== message) { - p.innerHTML = ''; - p.appendChild(message); - } - }, - settings: { - message: undefined, - labels: undefined, - onok: undefined, - oncancel: undefined, - value: '', - reverseButtons: undefined, - }, - settingUpdated: function (key, oldValue, newValue) { - switch (key) { - case 'message': - this.setMessage(newValue); - break; - case 'value': - input.value = newValue; - break; - case 'labels': - if (newValue.ok && this.__internal.buttons[0].element) { - this.__internal.buttons[0].element.innerHTML = newValue.ok; - } - if (newValue.cancel && this.__internal.buttons[1].element) { - this.__internal.buttons[1].element.innerHTML = newValue.cancel; - } - break; - case 'reverseButtons': - if (newValue === true) { - this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element); - } else { - this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element); - } - break; - } - }, - callback: function (closeEvent) { - var returnValue; - switch (closeEvent.index) { - case 0: - this.value = input.value; - if (typeof this.get('onok') === 'function') { - returnValue = this.get('onok').call(undefined, closeEvent, this.value); - if (typeof returnValue !== 'undefined') { - closeEvent.cancel = !returnValue; - } - } - break; - case 1: - if (typeof this.get('oncancel') === 'function') { - returnValue = this.get('oncancel').call(undefined, closeEvent); - if (typeof returnValue !== 'undefined') { - closeEvent.cancel = !returnValue; - } - } - break; - } - } - }; - }); - - // AMD and window support - if ( typeof define === 'function' ) { - define( [], function () { - return alertify; - } ); - } else if ( !window.alertify ) { - window.alertify = alertify; - } - -} ( this ) ); +/** + * alertifyjs 1.4.1 http://alertifyjs.com + * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. + * Copyright 2015 Mohammad Younes (http://alertifyjs.com) + * Licensed under MIT */ +( function ( window ) { + 'use strict'; + + /** + * Keys enum + * @type {Object} + */ + var keys = { + ENTER: 13, + ESC: 27, + F1: 112, + F12: 123, + LEFT: 37, + RIGHT: 39 + }; + /** + * Default options + * @type {Object} + */ + var defaults = { + modal:true, + basic:false, + frameless:false, + movable:true, + resizable:true, + closable:true, + closableByDimmer:true, + maximizable:true, + startMaximized:false, + pinnable:true, + pinned:true, + padding: true, + overflow:true, + maintainFocus:true, + transition:'pulse', + autoReset:true, + notifier:{ + delay:5, + position:'bottom-right' + }, + glossary:{ + title:'AlertifyJS', + ok: 'OK', + cancel: 'Cancel', + acccpt: 'Accept', + deny: 'Deny', + confirm: 'Confirm', + decline: 'Decline', + close: 'Close', + maximize: 'Maximize', + restore: 'Restore', + }, + theme:{ + input:'ajs-input', + ok:'ajs-ok', + cancel:'ajs-cancel', + } + }; + + //holds open dialogs instances + var openDialogs = []; + + /** + * [Helper] Adds the specified class(es) to the element. + * + * @element {node} The element + * @className {string} One or more space-separated classes to be added to the class attribute of the element. + * + * @return {undefined} + */ + function addClass(element,classNames){ + element.className += ' ' + classNames; + } + + /** + * [Helper] Removes the specified class(es) from the element. + * + * @element {node} The element + * @className {string} One or more space-separated classes to be removed from the class attribute of the element. + * + * @return {undefined} + */ + function removeClass(element,classNames){ + var classes = classNames.split(' '); + for(var x=0;x 0) { + var args = []; + for (var x = 0; x < arguments.length; x += 1) { + args.push(arguments[x]); + } + args.push(context); + return method.apply(context, args); + } + return method.apply(context, [null, context]); + }; + } + /** + * Helper for creating a dialog close event. + * + * @return {object} + */ + function createCloseEvent(index, button) { + return { + index: index, + button: button, + cancel: false + }; + } + + + /** + * Super class for all dialogs + * + * @return {Object} base dialog prototype + */ + var dialog = (function () { + var //holds the list of used keys. + usedKeys = [], + //dummy variable, used to trigger dom reflow. + reflow = null, + //condition for detecting safari + isSafari = window.navigator.userAgent.indexOf('Safari') > -1 && window.navigator.userAgent.indexOf('Chrome') < 0, + //dialog building blocks + templates = { + dimmer:'
', + /*tab index required to fire click event before body focus*/ + modal: '
', + dialog: '
', + reset: '', + commands: '
', + header: '
', + body: '
', + content: '
', + footer: '', + buttons: { primary: '
', auxiliary: '
' }, + button: '', + resizeHandle: '
', + }, + //common class names + classes = { + base: 'alertify', + prefix: 'ajs-', + hidden: 'ajs-hidden', + noSelection: 'ajs-no-selection', + noOverflow: 'ajs-no-overflow', + noPadding:'ajs-no-padding', + modeless: 'ajs-modeless', + movable: 'ajs-movable', + resizable: 'ajs-resizable', + capture: 'ajs-capture', + fixed: 'ajs-fixed', + closable:'ajs-closable', + maximizable:'ajs-maximizable', + maximize: 'ajs-maximize', + restore: 'ajs-restore', + pinnable:'ajs-pinnable', + unpinned:'ajs-unpinned', + pin:'ajs-pin', + maximized: 'ajs-maximized', + animationIn: 'ajs-in', + animationOut: 'ajs-out', + shake:'ajs-shake', + basic:'ajs-basic', + frameless:'ajs-frameless' + }; + + /** + * Helper: initializes the dialog instance + * + * @return {Number} The total count of currently open modals. + */ + function initialize(instance){ + + if(!instance.__internal){ + + //no need to expose init after this. + delete instance.__init; + + //in case the script was included before body. + //after first dialog gets initialized, it won't be null anymore! + if(null === reflow){ + // set tabindex attribute on body element this allows script to give it + // focus after the dialog is closed + document.body.setAttribute( 'tabindex', '0' ); + } + + //get dialog buttons/focus setup + var setup; + if(typeof instance.setup === 'function'){ + setup = instance.setup(); + setup.options = setup.options || {}; + setup.focus = setup.focus || {}; + }else{ + setup = { + buttons:[], + focus:{ + element:null, + select:false + }, + options:{ + } + }; + } + + //initialize hooks object. + if(typeof instance.hooks !== 'object'){ + instance.hooks = {}; + } + + //copy buttons defintion + var buttonsDefinition = []; + if(Array.isArray(setup.buttons)){ + for(var b=0;b 0 && document.body.className.indexOf(classes.noOverflow) < 0){ + //first open modal or first maximized one + addClass(document.body, classes.noOverflow); + } + } + + /** + * Sets the name of the transition used to show/hide the dialog + * + * @param {Object} instance The dilog instance. + * + */ + function updateTransition(instance, value, oldValue){ + if(typeof oldValue === 'string'){ + removeClass(instance.elements.root,classes.prefix + oldValue); + } + addClass(instance.elements.root, classes.prefix + value); + reflow = instance.elements.root.offsetWidth; + } + + /** + * Toggles the dialog display mode + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function updateDisplayMode(instance){ + if(instance.get('modal')){ + + //make modal + removeClass(instance.elements.root, classes.modeless); + + //only if open + if(instance.isOpen()){ + unbindModelessEvents(instance); + + //in case a pinned modless dialog was made modal while open. + updateAbsPositionFix(instance); + + ensureNoOverflow(); + } + }else{ + //make modelss + addClass(instance.elements.root, classes.modeless); + + //only if open + if(instance.isOpen()){ + bindModelessEvents(instance); + + //in case pin/unpin was called while a modal is open + updateAbsPositionFix(instance); + + ensureNoOverflow(); + } + } + } + + /** + * Toggles the dialog basic view mode + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function updateBasicMode(instance){ + if (instance.get('basic')) { + // add class + addClass(instance.elements.root, classes.basic); + } else { + // remove class + removeClass(instance.elements.root, classes.basic); + } + } + + /** + * Toggles the dialog frameless view mode + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function updateFramelessMode(instance){ + if (instance.get('frameless')) { + // add class + addClass(instance.elements.root, classes.frameless); + } else { + // remove class + removeClass(instance.elements.root, classes.frameless); + } + } + + /** + * Helper: Brings the modeless dialog to front, attached to modeless dialogs. + * + * @param {Event} event Focus event + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function bringToFront(event, instance){ + + // Do not bring to front if preceeded by an open modal + var index = openDialogs.indexOf(instance); + for(var x=index+1;x -1) { + triggerCallback(instance, function (button) { + return button.key === keyCode; + }); + return false; + } + } + /** + * Keydown event handler, attached to the document.body + * + * @param {Event} DOM event object. + * @param {Object} The dilog instance. + * + * @return {undefined} + */ + function keydownHandler(event) { + var instance = openDialogs[openDialogs.length - 1]; + var keyCode = event.keyCode; + if (keyCode === keys.LEFT || keyCode === keys.RIGHT) { + var buttons = instance.__internal.buttons; + for (var x = 0; x < buttons.length; x += 1) { + if (document.activeElement === buttons[x].element) { + switch (keyCode) { + case keys.LEFT: + buttons[(x || buttons.length) - 1].element.focus(); + return; + case keys.RIGHT: + buttons[(x + 1) % buttons.length].element.focus(); + return; + } + } + } + }else if (keyCode < keys.F12 + 1 && keyCode > keys.F1 - 1 && usedKeys.indexOf(keyCode) > -1) { + event.preventDefault(); + event.stopPropagation(); + triggerCallback(instance, function (button) { + return button.key === keyCode; + }); + return false; + } + } + + + /** + * Sets focus to proper dialog element + * + * @param {Object} instance The dilog instance. + * @param {Node} [resetTarget=undefined] DOM element to reset focus to. + * + * @return {undefined} + */ + function setFocus(instance, resetTarget) { + // reset target has already been determined. + if (resetTarget) { + resetTarget.focus(); + } else { + // current instance focus settings + var focus = instance.__internal.focus; + // the focus element. + var element = focus.element; + + switch (typeof focus.element) { + // a number means a button index + case 'number': + if (instance.__internal.buttons.length > focus.element) { + //in basic view, skip focusing the buttons. + if (instance.get('basic') === true) { + element = instance.elements.reset[0]; + } else { + element = instance.__internal.buttons[focus.element].element; + } + } + break; + // a string means querySelector to select from dialog body contents. + case 'string': + element = instance.elements.body.querySelector(focus.element); + break; + // a function should return the focus element. + case 'function': + element = focus.element.call(instance); + break; + } + + // if no focus element, default to first reset element. + if ((typeof element === 'undefined' || element === null) && instance.__internal.buttons.length === 0) { + element = instance.elements.reset[0]; + } + // focus + if (element && element.focus) { + element.focus(); + // if selectable + if (focus.select && element.select) { + element.select(); + } + } + } + } + + /** + * Focus event handler, attached to document.body and dialogs own reset links. + * handles the focus for modal dialogs only. + * + * @param {Event} event DOM focus event object. + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function onReset(event, instance) { + + // should work on last modal if triggered from document.body + if (!instance) { + for (var x = openDialogs.length - 1; x > -1; x -= 1) { + if (openDialogs[x].isModal()) { + instance = openDialogs[x]; + break; + } + } + } + // if modal + if (instance && instance.isModal()) { + // determine reset target to enable forward/backward tab cycle. + var resetTarget, target = event.srcElement || event.target; + var lastResetElement = target === instance.elements.reset[1] || (instance.__internal.buttons.length === 0 && target === document.body); + + // if last reset link, then go to maximize or close + if (lastResetElement) { + if (instance.get('maximizable')) { + resetTarget = instance.elements.commands.maximize; + } else if (instance.get('closable')) { + resetTarget = instance.elements.commands.close; + } + } + // if no reset target found, try finding the best button + if (resetTarget === undefined) { + if (typeof instance.__internal.focus.element === 'number') { + // button focus element, go to first available button + if (target === instance.elements.reset[0]) { + resetTarget = instance.elements.buttons.auxiliary.firstChild || instance.elements.buttons.primary.firstChild; + } else if (lastResetElement) { + //restart the cycle by going to first reset link + resetTarget = instance.elements.reset[0]; + } + } else { + // will reach here when tapping backwards, so go to last child + // The focus element SHOULD NOT be a button (logically!). + if (target === instance.elements.reset[0]) { + resetTarget = instance.elements.buttons.primary.lastChild || instance.elements.buttons.auxiliary.lastChild; + } + } + } + // focus + setFocus(instance, resetTarget); + } + } + /** + * Transition in transitionend event handler. + * + * @param {Event} TransitionEnd event object. + * @param {Object} The dilog instance. + * + * @return {undefined} + */ + function handleTransitionInEvent(event, instance) { + // clear the timer + clearTimeout(instance.__internal.timerIn); + + // once transition is complete, set focus + setFocus(instance); + + //restore scroll to prevent document jump + restoreScrollPosition(); + + // allow handling key up after transition ended. + cancelKeyup = false; + + // allow custom `onfocus` method + if (typeof instance.get('onfocus') === 'function') { + instance.get('onfocus').call(instance); + } + + // unbind the event + off(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler); + + removeClass(instance.elements.root, classes.animationIn); + } + + /** + * Transition out transitionend event handler. + * + * @param {Event} TransitionEnd event object. + * @param {Object} The dilog instance. + * + * @return {undefined} + */ + function handleTransitionOutEvent(event, instance) { + // clear the timer + clearTimeout(instance.__internal.timerOut); + // unbind the event + off(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler); + + // reset move updates + resetMove(instance); + // reset resize updates + resetResize(instance); + + // restore if maximized + if (instance.isMaximized() && !instance.get('startMaximized')) { + restore(instance); + } + + // return focus to the last active element + if (alertify.defaults.maintainFocus && instance.__internal.activeElement) { + instance.__internal.activeElement.focus(); + instance.__internal.activeElement = null; + } + } + /* Controls moving a dialog around */ + //holde the current moving instance + var movable = null, + //holds the current X offset when move starts + offsetX = 0, + //holds the current Y offset when move starts + offsetY = 0, + xProp = 'pageX', + yProp = 'pageY' + ; + + /** + * Helper: sets the element top/left coordinates + * + * @param {Event} event DOM event object. + * @param {Node} element The element being moved. + * + * @return {undefined} + */ + function moveElement(event, element) { + element.style.left = (event[xProp] - offsetX) + 'px'; + element.style.top = (event[yProp] - offsetY) + 'px'; + } + + /** + * Triggers the start of a move event, attached to the header element mouse down event. + * Adds no-selection class to the body, disabling selection while moving. + * + * @param {Event} event DOM event object. + * @param {Object} instance The dilog instance. + * + * @return {Boolean} false + */ + function beginMove(event, instance) { + if (resizable === null && !instance.isMaximized() && instance.get('movable')) { + var eventSrc; + if (event.type === 'touchstart') { + event.preventDefault(); + eventSrc = event.targetTouches[0]; + xProp = 'clientX'; + yProp = 'clientY'; + } else if (event.button === 0) { + eventSrc = event; + } + + if (eventSrc) { + + movable = instance; + offsetX = eventSrc[xProp]; + offsetY = eventSrc[yProp]; + + var element = instance.elements.dialog; + addClass(element, classes.capture); + + if (element.style.left) { + offsetX -= parseInt(element.style.left, 10); + } + + if (element.style.top) { + offsetY -= parseInt(element.style.top, 10); + } + moveElement(eventSrc, element); + + addClass(document.body, classes.noSelection); + return false; + } + } + } + + /** + * The actual move handler, attached to document.body mousemove event. + * + * @param {Event} event DOM event object. + * + * @return {undefined} + */ + function move(event) { + if (movable) { + var eventSrc; + if (event.type === 'touchmove') { + event.preventDefault(); + eventSrc = event.targetTouches[0]; + } else if (event.button === 0) { + eventSrc = event; + } + if (eventSrc) { + moveElement(eventSrc, movable.elements.dialog); + } + } + } + + /** + * Triggers the end of a move event, attached to document.body mouseup event. + * Removes no-selection class from document.body, allowing selection. + * + * @return {undefined} + */ + function endMove() { + if (movable) { + var element = movable.elements.dialog; + movable = null; + removeClass(document.body, classes.noSelection); + removeClass(element, classes.capture); + } + } + + /** + * Resets any changes made by moving the element to its original state, + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function resetMove(instance) { + movable = null; + var element = instance.elements.dialog; + element.style.left = element.style.top = ''; + } + + /** + * Updates the dialog move behavior. + * + * @param {Object} instance The dilog instance. + * @param {Boolean} on True to add the behavior, removes it otherwise. + * + * @return {undefined} + */ + function updateMovable(instance) { + if (instance.get('movable')) { + // add class + addClass(instance.elements.root, classes.movable); + if (instance.isOpen()) { + bindMovableEvents(instance); + } + } else { + + //reset + resetMove(instance); + // remove class + removeClass(instance.elements.root, classes.movable); + if (instance.isOpen()) { + unbindMovableEvents(instance); + } + } + } + + /* Controls moving a dialog around */ + //holde the current instance being resized + var resizable = null, + //holds the staring left offset when resize starts. + startingLeft = Number.Nan, + //holds the staring width when resize starts. + startingWidth = 0, + //holds the initial width when resized for the first time. + minWidth = 0, + //holds the offset of the resize handle. + handleOffset = 0 + ; + + /** + * Helper: sets the element width/height and updates left coordinate if neccessary. + * + * @param {Event} event DOM mousemove event object. + * @param {Node} element The element being moved. + * @param {Boolean} pinned A flag indicating if the element being resized is pinned to the screen. + * + * @return {undefined} + */ + function resizeElement(event, element, pageRelative) { + + //calculate offsets from 0,0 + var current = element; + var offsetLeft = 0; + var offsetTop = 0; + do { + offsetLeft += current.offsetLeft; + offsetTop += current.offsetTop; + } while (current = current.offsetParent); + + // determine X,Y coordinates. + var X, Y; + if (pageRelative === true) { + X = event.pageX; + Y = event.pageY; + } else { + X = event.clientX; + Y = event.clientY; + } + // rtl handling + var isRTL = isRightToLeft(); + if (isRTL) { + // reverse X + X = document.body.offsetWidth - X; + // if has a starting left, calculate offsetRight + if (!isNaN(startingLeft)) { + offsetLeft = document.body.offsetWidth - offsetLeft - element.offsetWidth; + } + } + + // set width/height + element.style.height = (Y - offsetTop + handleOffset) + 'px'; + element.style.width = (X - offsetLeft + handleOffset) + 'px'; + + // if the element being resized has a starting left, maintain it. + // the dialog is centered, divide by half the offset to maintain the margins. + if (!isNaN(startingLeft)) { + var diff = Math.abs(element.offsetWidth - startingWidth) * 0.5; + if (isRTL) { + //negate the diff, why? + //when growing it should decrease left + //when shrinking it should increase left + diff *= -1; + } + if (element.offsetWidth > startingWidth) { + //growing + element.style.left = (startingLeft + diff) + 'px'; + } else if (element.offsetWidth >= minWidth) { + //shrinking + element.style.left = (startingLeft - diff) + 'px'; + } + } + } + + /** + * Triggers the start of a resize event, attached to the resize handle element mouse down event. + * Adds no-selection class to the body, disabling selection while moving. + * + * @param {Event} event DOM event object. + * @param {Object} instance The dilog instance. + * + * @return {Boolean} false + */ + function beginResize(event, instance) { + if (!instance.isMaximized()) { + var eventSrc; + if (event.type === 'touchstart') { + event.preventDefault(); + eventSrc = event.targetTouches[0]; + } else if (event.button === 0) { + eventSrc = event; + } + if (eventSrc) { + resizable = instance; + handleOffset = instance.elements.resizeHandle.offsetHeight / 2; + var element = instance.elements.dialog; + addClass(element, classes.capture); + startingLeft = parseInt(element.style.left, 10); + element.style.height = element.offsetHeight + 'px'; + element.style.minHeight = instance.elements.header.offsetHeight + instance.elements.footer.offsetHeight + 'px'; + element.style.width = (startingWidth = element.offsetWidth) + 'px'; + + if (element.style.maxWidth !== 'none') { + element.style.minWidth = (minWidth = element.offsetWidth) + 'px'; + } + element.style.maxWidth = 'none'; + addClass(document.body, classes.noSelection); + return false; + } + } + } + + /** + * The actual resize handler, attached to document.body mousemove event. + * + * @param {Event} event DOM event object. + * + * @return {undefined} + */ + function resize(event) { + if (resizable) { + var eventSrc; + if (event.type === 'touchmove') { + event.preventDefault(); + eventSrc = event.targetTouches[0]; + } else if (event.button === 0) { + eventSrc = event; + } + if (eventSrc) { + resizeElement(eventSrc, resizable.elements.dialog, !resizable.get('modal') && !resizable.get('pinned')); + } + } + } + + /** + * Triggers the end of a resize event, attached to document.body mouseup event. + * Removes no-selection class from document.body, allowing selection. + * + * @return {undefined} + */ + function endResize() { + if (resizable) { + var element = resizable.elements.dialog; + resizable = null; + removeClass(document.body, classes.noSelection); + removeClass(element, classes.capture); + cancelClick = true; + } + } + + /** + * Resets any changes made by resizing the element to its original state. + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function resetResize(instance) { + resizable = null; + var element = instance.elements.dialog; + if (element.style.maxWidth === 'none') { + //clear inline styles. + element.style.maxWidth = element.style.minWidth = element.style.width = element.style.height = element.style.minHeight = element.style.left = ''; + //reset variables. + startingLeft = Number.Nan; + startingWidth = minWidth = handleOffset = 0; + } + } + + + /** + * Updates the dialog move behavior. + * + * @param {Object} instance The dilog instance. + * @param {Boolean} on True to add the behavior, removes it otherwise. + * + * @return {undefined} + */ + function updateResizable(instance) { + if (instance.get('resizable')) { + // add class + addClass(instance.elements.root, classes.resizable); + if (instance.isOpen()) { + bindResizableEvents(instance); + } + } else { + //reset + resetResize(instance); + // remove class + removeClass(instance.elements.root, classes.resizable); + if (instance.isOpen()) { + unbindResizableEvents(instance); + } + } + } + + /** + * Reset move/resize on window resize. + * + * @param {Event} event window resize event object. + * + * @return {undefined} + */ + function windowResize(/*event*/) { + for (var x = 0; x < openDialogs.length; x += 1) { + var instance = openDialogs[x]; + if (instance.get('autoReset')) { + resetMove(instance); + resetResize(instance); + } + } + } + /** + * Bind dialogs events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function bindEvents(instance) { + // if first dialog, hook global handlers + if (openDialogs.length === 1) { + //global + on(window, 'resize', windowResize); + on(document.body, 'keyup', keyupHandler); + on(document.body, 'keydown', keydownHandler); + on(document.body, 'focus', onReset); + + //move + on(document.documentElement, 'mousemove', move); + on(document.documentElement, 'touchmove', move); + on(document.documentElement, 'mouseup', endMove); + on(document.documentElement, 'touchend', endMove); + //resize + on(document.documentElement, 'mousemove', resize); + on(document.documentElement, 'touchmove', resize); + on(document.documentElement, 'mouseup', endResize); + on(document.documentElement, 'touchend', endResize); + } + + // common events + on(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler); + on(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler); + on(instance.elements.reset[0], 'focus', instance.__internal.resetHandler); + on(instance.elements.reset[1], 'focus', instance.__internal.resetHandler); + + //prevent handling key up when dialog is being opened by a key stroke. + cancelKeyup = true; + // hook in transition handler + on(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler); + + // modelss only events + if (!instance.get('modal')) { + bindModelessEvents(instance); + } + + // resizable + if (instance.get('resizable')) { + bindResizableEvents(instance); + } + + // movable + if (instance.get('movable')) { + bindMovableEvents(instance); + } + } + + /** + * Unbind dialogs events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function unbindEvents(instance) { + // if last dialog, remove global handlers + if (openDialogs.length === 1) { + //global + off(window, 'resize', windowResize); + off(document.body, 'keyup', keyupHandler); + off(document.body, 'keydown', keydownHandler); + off(document.body, 'focus', onReset); + //move + off(document.documentElement, 'mousemove', move); + off(document.documentElement, 'mouseup', endMove); + //resize + off(document.documentElement, 'mousemove', resize); + off(document.documentElement, 'mouseup', endResize); + } + + // common events + off(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler); + off(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler); + off(instance.elements.reset[0], 'focus', instance.__internal.resetHandler); + off(instance.elements.reset[1], 'focus', instance.__internal.resetHandler); + + // hook out transition handler + on(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler); + + // modelss only events + if (!instance.get('modal')) { + unbindModelessEvents(instance); + } + + // movable + if (instance.get('movable')) { + unbindMovableEvents(instance); + } + + // resizable + if (instance.get('resizable')) { + unbindResizableEvents(instance); + } + + } + + /** + * Bind modeless specific events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function bindModelessEvents(instance) { + on(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true); + } + + /** + * Unbind modeless specific events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function unbindModelessEvents(instance) { + off(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true); + } + + + + /** + * Bind movable specific events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function bindMovableEvents(instance) { + on(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler); + on(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler); + } + + /** + * Unbind movable specific events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function unbindMovableEvents(instance) { + off(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler); + off(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler); + } + + + + /** + * Bind resizable specific events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function bindResizableEvents(instance) { + on(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler); + on(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler); + } + + /** + * Unbind resizable specific events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function unbindResizableEvents(instance) { + off(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler); + off(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler); + } + + /** + * Bind closable events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function bindClosableEvents(instance) { + on(instance.elements.modal, 'click', instance.__internal.modalClickHandler); + } + + /** + * Unbind closable specific events + * + * @param {Object} instance The dilog instance. + * + * @return {undefined} + */ + function unbindClosableEvents(instance) { + off(instance.elements.modal, 'click', instance.__internal.modalClickHandler); + } + // dialog API + return { + __init:initialize, + /** + * Check if dialog is currently open + * + * @return {Boolean} + */ + isOpen: function () { + return this.__internal.isOpen; + }, + isModal: function (){ + return this.elements.root.className.indexOf(classes.modeless) < 0; + }, + isMaximized:function(){ + return this.elements.root.className.indexOf(classes.maximized) > -1; + }, + isPinned:function(){ + return this.elements.root.className.indexOf(classes.unpinned) < 0; + }, + maximize:function(){ + if(!this.isMaximized()){ + maximize(this); + } + return this; + }, + restore:function(){ + if(this.isMaximized()){ + restore(this); + } + return this; + }, + pin:function(){ + if(!this.isPinned()){ + pin(this); + } + return this; + }, + unpin:function(){ + if(this.isPinned()){ + unpin(this); + } + return this; + }, + /** + * Move the dialog to a specific x/y coordinates + * + * @param {Number} x The new dialog x coordinate in pixels. + * @param {Number} y The new dialog y coordinate in pixels. + * + * @return {Object} The dialog instance. + */ + moveTo:function(x,y){ + if(!isNaN(x) && !isNaN(y)){ + var element = this.elements.dialog, + current = element, + offsetLeft = 0, + offsetTop = 0; + + //subtract existing left,top + if (element.style.left) { + offsetLeft -= parseInt(element.style.left, 10); + } + if (element.style.top) { + offsetTop -= parseInt(element.style.top, 10); + } + //calc offset + do { + offsetLeft += current.offsetLeft; + offsetTop += current.offsetTop; + } while (current = current.offsetParent); + + //calc left, top + var left = (x - offsetLeft); + var top = (y - offsetTop); + + //// rtl handling + if (isRightToLeft()) { + left *= -1; + } + + element.style.left = left + 'px'; + element.style.top = top + 'px'; + } + return this; + }, + /** + * Resize the dialog to a specific width/height (the dialog must be 'resizable'). + * The dialog can be resized to: + * A minimum width equal to the initial display width + * A minimum height equal to the sum of header/footer heights. + * + * + * @param {Number or String} width The new dialog width in pixels or in percent. + * @param {Number or String} height The new dialog height in pixels or in percent. + * + * @return {Object} The dialog instance. + */ + resizeTo:function(width,height){ + var w = parseFloat(width), + h = parseFloat(height), + regex = /(\d*\.\d+|\d+)%/ + ; + + if(!isNaN(w) && !isNaN(h) && this.get('resizable') === true){ + + if(('' + width).match(regex)){ + w = w / 100 * document.documentElement.clientWidth ; + } + + if(('' + height).match(regex)){ + h = h / 100 * document.documentElement.clientHeight; + } + + var element = this.elements.dialog; + if (element.style.maxWidth !== 'none') { + element.style.minWidth = (minWidth = element.offsetWidth) + 'px'; + } + element.style.maxWidth = 'none'; + element.style.minHeight = this.elements.header.offsetHeight + this.elements.footer.offsetHeight + 'px'; + element.style.width = w + 'px'; + element.style.height = h + 'px'; + } + return this; + }, + /** + * Gets or Sets dialog settings/options + * + * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs. + * @param {Object} value Optional, the value associated with the key (in case it was a string). + * + * @return {undefined} + */ + setting : function (key, value) { + var self = this; + var result = update(this, this.__internal.options, function(k,o,n){ optionUpdated(self,k,o,n); }, key, value); + if(result.op === 'get'){ + if(result.found){ + return result.value; + }else if(typeof this.settings !== 'undefined'){ + return update(this, this.settings, this.settingUpdated || function(){}, key, value).value; + }else{ + return undefined; + } + }else if(result.op === 'set'){ + if(result.items.length > 0){ + var callback = this.settingUpdated || function(){}; + for(var x=0;x 0) { + var self = this; + this.__internal.timer = setTimeout(function () { self.dismiss(); }, this.__internal.delay * 1000); + } + return this; + }, + /* + * Sets the notification message contents + * @param {string or DOMElement} content The notification message content + * + */ + setContent: function (content) { + if (typeof content === 'string') { + clearContents(this.element); + this.element.innerHTML = content; + } else if (content instanceof window.HTMLElement && this.element.firstChild !== content) { + clearContents(this.element); + this.element.appendChild(content); + } + return this; + }, + /* + * Dismisses all open notifications except this. + * + */ + dismissOthers: function () { + notifier.dismissAll(this); + return this; + } + }); + } + + //notifier api + return { + /** + * Gets or Sets notifier settings. + * + * @param {string} key The setting name + * @param {Variant} value The setting value. + * + * @return {Object} if the called as a setter, return the notifier instance. + */ + setting: function (key, value) { + //ensure init + initialize(this); + + if (typeof value === 'undefined') { + //get + return this.__internal[key]; + } else { + //set + switch (key) { + case 'position': + this.__internal.position = value; + updatePosition(this); + break; + case 'delay': + this.__internal.delay = value; + break; + } + } + return this; + }, + /** + * [Alias] Sets dialog settings/options + */ + set:function(key,value){ + this.setting(key,value); + return this; + }, + /** + * [Alias] Gets dialog settings/options + */ + get:function(key){ + return this.setting(key); + }, + /** + * Creates a new notification message + * + * @param {string} type The type of notification message (simply a CSS class name 'ajs-{type}' to be added). + * @param {Function} callback A callback function to be invoked when the message is dismissed. + * + * @return {undefined} + */ + create: function (type, callback) { + //ensure notifier init + initialize(this); + //create new notification message + var div = document.createElement('div'); + div.className = classes.message + ((typeof type === 'string' && type !== '') ? ' ajs-' + type : ''); + return create(div, callback); + }, + /** + * Dismisses all open notifications. + * + * @param {Object} excpet [optional] The notification object to exclude from dismissal. + * + */ + dismissAll: function (except) { + var clone = openInstances.slice(0); + for (var x = 0; x < clone.length; x += 1) { + var instance = clone[x]; + if (except === undefined || except !== instance) { + instance.dismiss(); + } + } + } + }; + })(); + /** + * Alertify public API + * This contains everything that is exposed through the alertify object. + * + * @return {Object} + */ + function Alertify() { + + // holds a references of created dialogs + var dialogs = {}; + + /** + * Extends a given prototype by merging properties from base into sub. + * + * @sub {Object} sub The prototype being overwritten. + * @base {Object} base The prototype being written. + * + * @return {Object} The extended prototype. + */ + function extend(sub, base) { + // copy dialog pototype over definition. + for (var prop in base) { + if (base.hasOwnProperty(prop)) { + sub[prop] = base[prop]; + } + } + return sub; + } + + + /** + * Helper: returns a dialog instance from saved dialogs. + * and initializes the dialog if its not already initialized. + * + * @name {String} name The dialog name. + * + * @return {Object} The dialog instance. + */ + function get_dialog(name) { + var dialog = dialogs[name].dialog; + //initialize the dialog if its not already initialized. + if (dialog && typeof dialog.__init === 'function') { + dialog.__init(dialog); + } + return dialog; + } + + /** + * Helper: registers a new dialog definition. + * + * @name {String} name The dialog name. + * @Factory {Function} Factory a function resposible for creating dialog prototype. + * @transient {Boolean} transient True to create a new dialog instance each time the dialog is invoked, false otherwise. + * @base {String} base the name of another dialog to inherit from. + * + * @return {Object} The dialog definition. + */ + function register(name, Factory, transient, base) { + var definition = { + dialog: null, + factory: Factory + }; + + //if this is based on an existing dialog, create a new definition + //by applying the new protoype over the existing one. + if (base !== undefined) { + definition.factory = function () { + return extend(new dialogs[base].factory(), new Factory()); + }; + } + + if (!transient) { + //create a new definition based on dialog + definition.dialog = extend(new definition.factory(), dialog); + } + return dialogs[name] = definition; + } + + return { + /** + * Alertify defaults + * + * @type {Object} + */ + defaults: defaults, + /** + * Dialogs factory + * + * @param {string} Dialog name. + * @param {Function} A Dialog factory function. + * @param {Boolean} Indicates whether to create a singleton or transient dialog. + * @param {String} The name of the base type to inherit from. + */ + dialog: function (name, Factory, transient, base) { + + // get request, create a new instance and return it. + if (typeof Factory !== 'function') { + return get_dialog(name); + } + + if (this.hasOwnProperty(name)) { + throw new Error('alertify.dialog: name already exists'); + } + + // register the dialog + var definition = register(name, Factory, transient, base); + + if (transient) { + + // make it public + this[name] = function () { + //if passed with no params, consider it a get request + if (arguments.length === 0) { + return definition.dialog; + } else { + var instance = extend(new definition.factory(), dialog); + //ensure init + if (instance && typeof instance.__init === 'function') { + instance.__init(instance); + } + instance['main'].apply(instance, arguments); + return instance['show'].apply(instance); + } + }; + } else { + // make it public + this[name] = function () { + //ensure init + if (definition.dialog && typeof definition.dialog.__init === 'function') { + definition.dialog.__init(definition.dialog); + } + //if passed with no params, consider it a get request + if (arguments.length === 0) { + return definition.dialog; + } else { + var dialog = definition.dialog; + dialog['main'].apply(definition.dialog, arguments); + return dialog['show'].apply(definition.dialog); + } + }; + } + }, + /** + * Close all open dialogs. + * + * @param {Object} excpet [optional] The dialog object to exclude from closing. + * + * @return {undefined} + */ + closeAll: function (except) { + var clone = openDialogs.slice(0); + for (var x = 0; x < clone.length; x += 1) { + var instance = clone[x]; + if (except === undefined || except !== instance) { + instance.close(); + } + } + }, + /** + * Gets or Sets dialog settings/options. if the dialog is transient, this call does nothing. + * + * @param {string} name The dialog name. + * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs. + * @param {Variant} value Optional, the value associated with the key (in case it was a string). + * + * @return {undefined} + */ + setting: function (name, key, value) { + + if (name === 'notifier') { + return notifier.setting(key, value); + } + + var dialog = get_dialog(name); + if (dialog) { + return dialog.setting(key, value); + } + }, + /** + * [Alias] Sets dialog settings/options + */ + set: function(name,key,value){ + return this.setting(name, key,value); + }, + /** + * [Alias] Gets dialog settings/options + */ + get: function(name, key){ + return this.setting(name, key); + }, + /** + * Creates a new notification message. + * If a type is passed, a class name "ajs-{type}" will be added. + * This allows for custom look and feel for various types of notifications. + * + * @param {String | DOMElement} [message=undefined] Message text + * @param {String} [type=''] Type of log message + * @param {String} [wait=''] Time (in seconds) to wait before auto-close + * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. + * + * @return {Object} Notification object. + */ + notify: function (message, type, wait, callback) { + return notifier.create(type, callback).push(message, wait); + }, + /** + * Creates a new notification message. + * + * @param {String} [message=undefined] Message text + * @param {String} [wait=''] Time (in seconds) to wait before auto-close + * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. + * + * @return {Object} Notification object. + */ + message: function (message, wait, callback) { + return notifier.create(null, callback).push(message, wait); + }, + /** + * Creates a new notification message of type 'success'. + * + * @param {String} [message=undefined] Message text + * @param {String} [wait=''] Time (in seconds) to wait before auto-close + * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. + * + * @return {Object} Notification object. + */ + success: function (message, wait, callback) { + return notifier.create('success', callback).push(message, wait); + }, + /** + * Creates a new notification message of type 'error'. + * + * @param {String} [message=undefined] Message text + * @param {String} [wait=''] Time (in seconds) to wait before auto-close + * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. + * + * @return {Object} Notification object. + */ + error: function (message, wait, callback) { + return notifier.create('error', callback).push(message, wait); + }, + /** + * Creates a new notification message of type 'warning'. + * + * @param {String} [message=undefined] Message text + * @param {String} [wait=''] Time (in seconds) to wait before auto-close + * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. + * + * @return {Object} Notification object. + */ + warning: function (message, wait, callback) { + return notifier.create('warning', callback).push(message, wait); + }, + /** + * Dismisses all open notifications + * + * @return {undefined} + */ + dismissAll: function () { + notifier.dismissAll(); + } + }; + } + var alertify = new Alertify(); + + /** + * Alert dialog definition + * + * invoked by: + * alertify.alert(message); + * alertify.alert(title, message); + * alertify.alert(message, onok); + * alertify.alert(title, message, onok); + */ + alertify.dialog('alert', function () { + return { + main: function (_title, _message, _onok) { + var title, message, onok; + switch (arguments.length) { + case 1: + message = _title; + break; + case 2: + if (typeof _message === 'function') { + message = _title; + onok = _message; + } else { + title = _title; + message = _message; + } + break; + case 3: + title = _title; + message = _message; + onok = _onok; + break; + } + this.set('title', title); + this.set('message', message); + this.set('onok', onok); + return this; + }, + setup: function () { + return { + buttons: [ + { + text: alertify.defaults.glossary.ok, + key: keys.ESC, + invokeOnClose: true, + className: alertify.defaults.theme.ok, + } + ], + focus: { + element: 0, + select: false + }, + options: { + maximizable: false, + resizable: false + } + }; + }, + build: function () { + // nothing + }, + prepare: function () { + //nothing + }, + setMessage: function (message) { + this.setContent(message); + }, + settings: { + message: undefined, + onok: undefined, + label: undefined, + }, + settingUpdated: function (key, oldValue, newValue) { + switch (key) { + case 'message': + this.setMessage(newValue); + break; + case 'label': + if (this.__internal.buttons[0].element) { + this.__internal.buttons[0].element.innerHTML = newValue; + } + break; + } + }, + callback: function (closeEvent) { + if (typeof this.get('onok') === 'function') { + var returnValue = this.get('onok').call(this, closeEvent); + if (typeof returnValue !== 'undefined') { + closeEvent.cancel = !returnValue; + } + } + } + }; + }); + /** + * Confirm dialog object + * + * alertify.confirm(message); + * alertify.confirm(message, onok); + * alertify.confirm(message, onok, oncancel); + * alertify.confirm(title, message, onok, oncancel); + */ + alertify.dialog('confirm', function () { + + var autoConfirm = { + timer: null, + index: null, + text: null, + duration: null, + task: function (event, self) { + if (self.isOpen()) { + self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text + ' (‏' + autoConfirm.duration + '‏) '; + autoConfirm.duration -= 1; + if (autoConfirm.duration === -1) { + clearAutoConfirm(self); + var button = self.__internal.buttons[autoConfirm.index]; + var closeEvent = createCloseEvent(autoConfirm.index, button); + + if (typeof self.callback === 'function') { + self.callback.apply(self, [closeEvent]); + } + //close the dialog. + if (closeEvent.close !== false) { + self.close(); + } + } + } else { + clearAutoConfirm(self); + } + } + }; + + function clearAutoConfirm(self) { + if (autoConfirm.timer !== null) { + clearInterval(autoConfirm.timer); + autoConfirm.timer = null; + self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text; + } + } + + function startAutoConfirm(self, index, duration) { + clearAutoConfirm(self); + autoConfirm.duration = duration; + autoConfirm.index = index; + autoConfirm.text = self.__internal.buttons[index].element.innerHTML; + autoConfirm.timer = setInterval(delegate(self, autoConfirm.task), 1000); + autoConfirm.task(null, self); + } + + + return { + main: function (_title, _message, _onok, _oncancel) { + var title, message, onok, oncancel; + switch (arguments.length) { + case 1: + message = _title; + break; + case 2: + message = _title; + onok = _message; + break; + case 3: + message = _title; + onok = _message; + oncancel = _onok; + break; + case 4: + title = _title; + message = _message; + onok = _onok; + oncancel = _oncancel; + break; + } + this.set('title', title); + this.set('message', message); + this.set('onok', onok); + this.set('oncancel', oncancel); + return this; + }, + setup: function () { + return { + buttons: [ + { + text: alertify.defaults.glossary.ok, + key: keys.ENTER, + className: alertify.defaults.theme.ok, + }, + { + text: alertify.defaults.glossary.cancel, + key: keys.ESC, + invokeOnClose: true, + className: alertify.defaults.theme.cancel, + } + ], + focus: { + element: 0, + select: false + }, + options: { + maximizable: false, + resizable: false + } + }; + }, + build: function () { + //nothing + }, + prepare: function () { + //nothing + }, + setMessage: function (message) { + this.setContent(message); + }, + settings: { + message: null, + labels: null, + onok: null, + oncancel: null, + defaultFocus: null, + reverseButtons: null, + }, + settingUpdated: function (key, oldValue, newValue) { + switch (key) { + case 'message': + this.setMessage(newValue); + break; + case 'labels': + if ('ok' in newValue && this.__internal.buttons[0].element) { + this.__internal.buttons[0].text = newValue.ok; + this.__internal.buttons[0].element.innerHTML = newValue.ok; + } + if ('cancel' in newValue && this.__internal.buttons[1].element) { + this.__internal.buttons[1].text = newValue.cancel; + this.__internal.buttons[1].element.innerHTML = newValue.cancel; + } + break; + case 'reverseButtons': + if (newValue === true) { + this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element); + } else { + this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element); + } + break; + case 'defaultFocus': + this.__internal.focus.element = newValue === 'ok' ? 0 : 1; + break; + } + }, + callback: function (closeEvent) { + clearAutoConfirm(this); + var returnValue; + switch (closeEvent.index) { + case 0: + if (typeof this.get('onok') === 'function') { + returnValue = this.get('onok').call(this, closeEvent); + if (typeof returnValue !== 'undefined') { + closeEvent.cancel = !returnValue; + } + } + break; + case 1: + if (typeof this.get('oncancel') === 'function') { + returnValue = this.get('oncancel').call(this, closeEvent); + if (typeof returnValue !== 'undefined') { + closeEvent.cancel = !returnValue; + } + } + break; + } + }, + autoOk: function (duration) { + startAutoConfirm(this, 0, duration); + return this; + }, + autoCancel: function (duration) { + startAutoConfirm(this, 1, duration); + return this; + } + }; + }); + /** + * Prompt dialog object + * + * invoked by: + * alertify.prompt(message); + * alertify.prompt(message, value); + * alertify.prompt(message, value, onok); + * alertify.prompt(message, value, onok, oncancel); + * alertify.prompt(title, message, value, onok, oncancel); + */ + alertify.dialog('prompt', function () { + var input = document.createElement('INPUT'); + var p = document.createElement('P'); + return { + main: function (_title, _message, _value, _onok, _oncancel) { + var title, message, value, onok, oncancel; + switch (arguments.length) { + case 1: + message = _title; + break; + case 2: + message = _title; + value = _message; + break; + case 3: + message = _title; + value = _message; + onok = _value; + break; + case 4: + message = _title; + value = _message; + onok = _value; + oncancel = _onok; + break; + case 5: + title = _title; + message = _message; + value = _value; + onok = _onok; + oncancel = _oncancel; + break; + } + this.set('title', title); + this.set('message', message); + this.set('value', value); + this.set('onok', onok); + this.set('oncancel', oncancel); + return this; + }, + setup: function () { + return { + buttons: [ + { + text: alertify.defaults.glossary.ok, + key: keys.ENTER, + className: alertify.defaults.theme.ok, + }, + { + text: alertify.defaults.glossary.cancel, + key: keys.ESC, + invokeOnClose: true, + className: alertify.defaults.theme.cancel, + } + ], + focus: { + element: input, + select: true + }, + options: { + maximizable: false, + resizable: false + } + }; + }, + build: function () { + input.className = alertify.defaults.theme.input; + input.setAttribute('type', 'text'); + input.value = this.get('value'); + this.elements.content.appendChild(p); + this.elements.content.appendChild(input); + }, + prepare: function () { + //nothing + }, + setMessage: function (message) { + if (typeof message === 'string') { + clearContents(p); + p.innerHTML = message; + } else if (message instanceof window.HTMLElement && p.firstChild !== message) { + clearContents(p); + p.appendChild(message); + } + }, + settings: { + message: undefined, + labels: undefined, + onok: undefined, + oncancel: undefined, + value: '', + type:'text', + reverseButtons: undefined, + }, + settingUpdated: function (key, oldValue, newValue) { + switch (key) { + case 'message': + this.setMessage(newValue); + break; + case 'value': + input.value = newValue; + break; + case 'type': + switch (newValue) { + case 'text': + case 'color': + case 'date': + case 'datetime-local': + case 'email': + case 'month': + case 'number': + case 'password': + case 'search': + case 'tel': + case 'time': + case 'week': + input.type = newValue; + break; + default: + input.type = 'text'; + break; + } + break; + case 'labels': + if (newValue.ok && this.__internal.buttons[0].element) { + this.__internal.buttons[0].element.innerHTML = newValue.ok; + } + if (newValue.cancel && this.__internal.buttons[1].element) { + this.__internal.buttons[1].element.innerHTML = newValue.cancel; + } + break; + case 'reverseButtons': + if (newValue === true) { + this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element); + } else { + this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element); + } + break; + } + }, + callback: function (closeEvent) { + var returnValue; + switch (closeEvent.index) { + case 0: + this.settings.value = input.value; + if (typeof this.get('onok') === 'function') { + returnValue = this.get('onok').call(this, closeEvent, this.settings.value); + if (typeof returnValue !== 'undefined') { + closeEvent.cancel = !returnValue; + } + } + break; + case 1: + if (typeof this.get('oncancel') === 'function') { + returnValue = this.get('oncancel').call(this, closeEvent); + if (typeof returnValue !== 'undefined') { + closeEvent.cancel = !returnValue; + } + } + break; + } + } + }; + }); + + // CommonJS + if ( typeof module === 'object' && typeof module.exports === 'object' ) { + module.exports = alertify; + // AMD + } else if ( typeof define === 'function' && define.amd) { + define( [], function () { + return alertify; + } ); + // window + } else if ( !window.alertify ) { + window.alertify = alertify; + } + +} ( typeof window !== 'undefined' ? window : this ) ); diff --git a/web/pgadmin/static/js/alertifyjs/alertify.min.js b/web/pgadmin/static/js/alertifyjs/alertify.min.js index 2fa3c5d9d..b7c488ccb 100644 --- a/web/pgadmin/static/js/alertifyjs/alertify.min.js +++ b/web/pgadmin/static/js/alertifyjs/alertify.min.js @@ -1,3 +1,4 @@ -/*! AlertifyJS - v1.1.0 - Mohammad Younes (http://alertifyjs.com) */ -!function(a){"use strict";function b(a,b){a.className+=" "+b}function c(a,b){for(var c=b.split(" "),d=0;d0){for(var c=[],d=0;d0&&document.body.className.indexOf(sb.noOverflow)<0&&b(document.body,sb.noOverflow)}function p(a,d,e){"string"==typeof e&&c(a.elements.root,sb.prefix+e),b(a.elements.root,sb.prefix+d),pb=a.elements.root.offsetWidth}function q(a){a.get("modal")?(c(a.elements.root,sb.modeless),a.isOpen()&&(hb(a),G(a),k())):(b(a.elements.root,sb.modeless),a.isOpen()&&(gb(a),G(a),k()))}function s(a){a.get("basic")?b(a.elements.root,sb.basic):c(a.elements.root,sb.basic)}function t(a){a.get("frameless")?b(a.elements.root,sb.frameless):c(a.elements.root,sb.frameless)}function u(a,b){for(var c=l.indexOf(b),d=c+1;d-1?(L(b,function(a){return a.key===c}),!1):void 0}function O(a){var b=l[l.length-1],c=a.keyCode;if(c===j.LEFT||c===j.RIGHT){for(var d=b.__internal.buttons,e=0;ej.F1-1&&ob.indexOf(c)>-1)return a.preventDefault(),a.stopPropagation(),L(b,function(a){return a.key===c}),!1}function P(a,b){if(b)b.focus();else{var c=a.__internal.focus,d=c.element;switch(typeof c.element){case"number":a.__internal.buttons.length>c.element&&(d=a.get("basic")===!0?a.elements.reset[0]:a.__internal.buttons[c.element].element);break;case"string":d=a.elements.body.querySelector(c.element);break;case"function":d=c.element.call(a)}"undefined"!=typeof d&&null!==d||0!==a.__internal.buttons.length||(d=a.elements.reset[0]),d&&d.focus&&(d.focus(),c.select&&d.select&&d.select())}}function Q(a,b){if(!b)for(var c=l.length-1;c>-1;c-=1)if(l[c].isModal()){b=l[c];break}if(b&&b.isModal()){var d,e=a.srcElement||a.target,f=e===b.elements.reset[1]||0===b.__internal.buttons.length&&e===document.body;f&&(b.get("maximizable")?d=b.elements.commands.maximize:b.get("closable")&&(d=b.elements.commands.close)),void 0===d&&("number"==typeof b.__internal.focus.element?e===b.elements.reset[0]?d=b.elements.buttons.auxiliary.firstChild||b.elements.buttons.primary.firstChild:f&&(d=b.elements.reset[0]):e===b.elements.reset[0]&&(d=b.elements.buttons.primary.lastChild||b.elements.buttons.auxiliary.lastChild)),P(b,d)}}function R(a,b){clearTimeout(b.__internal.timerIn),P(b),ub=!1,"function"==typeof b.get("onfocus")&&b.get("onfocus")(),n(b.elements.dialog,o.type,b.__internal.transitionInHandler),c(b.elements.root,sb.animationIn)}function S(a,b){clearTimeout(b.__internal.timerOut),n(b.elements.dialog,o.type,b.__internal.transitionOutHandler),X(b),bb(b),b.isMaximized()&&!b.get("startMaximized")&&C(b),r.defaults.maintainFocus&&b.__internal.activeElement&&(b.__internal.activeElement.focus(),b.__internal.activeElement=null)}function T(a,b){b.style.left=a[yb]-wb+"px",b.style.top=a[zb]-xb+"px"}function U(a,c){if(null===Ab&&!c.isMaximized()&&c.get("movable")){var d;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0],yb="clientX",zb="clientY"):0===a.button&&(d=a),d){vb=c,wb=d[yb],xb=d[zb];var e=c.elements.dialog;return b(e,sb.capture),e.style.left&&(wb-=parseInt(e.style.left,10)),e.style.top&&(xb-=parseInt(e.style.top,10)),T(d,e),b(document.body,sb.noSelection),!1}}}function V(a){if(vb){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&T(b,vb.elements.dialog)}}function W(){if(vb){var a=vb.elements.dialog;vb=null,c(document.body,sb.noSelection),c(a,sb.capture)}}function X(a){vb=null;var b=a.elements.dialog;b.style.left=b.style.top=""}function Y(a){a.get("movable")?(b(a.elements.root,sb.movable),a.isOpen()&&ib(a)):(X(a),c(a.elements.root,sb.movable),a.isOpen()&&jb(a))}function Z(a,b,c){var e=b,f=0,g=0;do f+=e.offsetLeft,g+=e.offsetTop;while(e=e.offsetParent);var h,i;c===!0?(h=a.pageX,i=a.pageY):(h=a.clientX,i=a.clientY);var j=d();if(j&&(h=document.body.offsetWidth-h,isNaN(Bb)||(f=document.body.offsetWidth-f-b.offsetWidth)),b.style.height=i-g+Eb+"px",b.style.width=h-f+Eb+"px",!isNaN(Bb)){var k=.5*Math.abs(b.offsetWidth-Cb);j&&(k*=-1),b.offsetWidth>Cb?b.style.left=Bb+k+"px":b.offsetWidth>=Db&&(b.style.left=Bb-k+"px")}}function $(a,c){if(!c.isMaximized()){var d;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0]):0===a.button&&(d=a),d){Ab=c,Eb=c.elements.resizeHandle.offsetHeight/2;var e=c.elements.dialog;return b(e,sb.capture),Bb=parseInt(e.style.left,10),e.style.height=e.offsetHeight+"px",e.style.minHeight=c.elements.header.offsetHeight+c.elements.footer.offsetHeight+"px",e.style.width=(Cb=e.offsetWidth)+"px","none"!==e.style.maxWidth&&(e.style.minWidth=(Db=e.offsetWidth)+"px"),e.style.maxWidth="none",b(document.body,sb.noSelection),!1}}}function _(a){if(Ab){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&Z(b,Ab.elements.dialog,!Ab.get("modal")&&!Ab.get("pinned"))}}function ab(){if(Ab){var a=Ab.elements.dialog;Ab=null,c(document.body,sb.noSelection),c(a,sb.capture),tb=!0}}function bb(a){Ab=null;var b=a.elements.dialog;"none"===b.style.maxWidth&&(b.style.maxWidth=b.style.minWidth=b.style.width=b.style.height=b.style.minHeight=b.style.left="",Bb=Number.Nan,Cb=Db=Eb=0)}function cb(a){a.get("resizable")?(b(a.elements.root,sb.resizable),a.isOpen()&&kb(a)):(bb(a),c(a.elements.root,sb.resizable),a.isOpen()&&lb(a))}function db(){for(var a=0;a-1&&a.navigator.userAgent.indexOf("Chrome")<0,rb={dimmer:'
',modal:'
',dialog:'
',reset:'',commands:'
',header:'
',body:'
',content:'
',footer:'',buttons:{primary:'
',auxiliary:'
'},button:'',resizeHandle:'
'},sb={base:"alertify",prefix:"ajs-",hidden:"ajs-hidden",noSelection:"ajs-no-selection",noOverflow:"ajs-no-overflow",noPadding:"ajs-no-padding",modeless:"ajs-modeless",movable:"ajs-movable",resizable:"ajs-resizable",capture:"ajs-capture",fixed:"ajs-fixed",closable:"ajs-closable",maximizable:"ajs-maximizable",maximize:"ajs-maximize",restore:"ajs-restore",pinnable:"ajs-pinnable",unpinned:"ajs-unpinned",pin:"ajs-pin",maximized:"ajs-maximized",animationIn:"ajs-in",animationOut:"ajs-out",shake:"ajs-shake",basic:"ajs-basic",frameless:"ajs-frameless"},tb=!1,ub=!1,vb=null,wb=0,xb=0,yb="pageX",zb="pageY",Ab=null,Bb=Number.Nan,Cb=0,Db=0,Eb=0;return{__init:i,isOpen:function(){return this.__internal.isOpen},isModal:function(){return this.elements.root.className.indexOf(sb.modeless)<0},isMaximized:function(){return this.elements.root.className.indexOf(sb.maximized)>-1},isPinned:function(){return this.elements.root.className.indexOf(sb.unpinned)<0},maximize:function(){return this.isMaximized()||B(this),this},restore:function(){return this.isMaximized()&&C(this),this},pin:function(){return this.isPinned()||z(this),this},unpin:function(){return this.isPinned()&&A(this),this},moveTo:function(a,b){if(!isNaN(a)&&!isNaN(b)){var c=this.elements.dialog,e=c,f=0,g=0;c.style.left&&(f-=parseInt(c.style.left,10)),c.style.top&&(g-=parseInt(c.style.top,10));do f+=e.offsetLeft,g+=e.offsetTop;while(e=e.offsetParent);var h=a-f,i=b-g;d()&&(h*=-1),c.style.left=h+"px",c.style.top=i+"px"}return this},resizeTo:function(a,b){if(!isNaN(a)&&!isNaN(b)&&this.get("resizable")===!0){var c=this.elements.dialog;"none"!==c.style.maxWidth&&(c.style.minWidth=(Db=c.offsetWidth)+"px"),c.style.maxWidth="none",c.style.minHeight=this.elements.header.offsetHeight+this.elements.footer.offsetHeight+"px",c.style.width=a+"px",c.style.height=b+"px"}return this},setting:function(a,b){var c=this,d=w(this,this.__internal.options,function(a,b,d){v(c,a,b,d)},a,b);if("get"===d.op)return d.found?d.value:"undefined"!=typeof this.settings?w(this,this.settings,this.settingUpdated||function(){},a,b).value:void 0;if("set"===d.op){if(d.items.length>0)for(var e=this.settingUpdated||function(){},f=0;f0){var b=this;this.__internal.timer=setTimeout(function(){b.dismiss()},1e3*this.__internal.delay)}return this},setContent:function(a){return"string"==typeof a?this.element.innerHTML=a:this.element.appendChild(a),this},dismissOthers:function(){return q.dismissAll(this),this}})}var i,j,k=[],l={base:"alertify-notifier",message:"ajs-message",top:"ajs-top",right:"ajs-right",bottom:"ajs-bottom",left:"ajs-left",visible:"ajs-visible",hidden:"ajs-hidden"};return{setting:function(b,c){if(a(this),"undefined"==typeof c)return this.__internal[b];switch(b){case"position":this.__internal.position=c,f(this);break;case"delay":this.__internal.delay=c}return this},set:function(a,b){return this.setting(a,b),this},get:function(a){return this.setting(a)},create:function(b,c){a(this);var d=document.createElement("div");return d.className=l.message+("string"==typeof b&&""!==b?" ajs-"+b:""),h(d,c)},dismissAll:function(a){for(var b=k.slice(0),c=0;c (http://alertifyjs.com) */ +!function(a){"use strict";function b(a,b){a.className+=" "+b}function c(a,b){for(var c=b.split(" "),d=0;d0){for(var c=[],d=0;d0&&document.body.className.indexOf(xa.noOverflow)<0&&b(document.body,xa.noOverflow)}function t(a,d,e){"string"==typeof e&&c(a.elements.root,xa.prefix+e),b(a.elements.root,xa.prefix+d),ua=a.elements.root.offsetWidth}function u(a){a.get("modal")?(c(a.elements.root,xa.modeless),a.isOpen()&&(ka(a),J(a),r())):(b(a.elements.root,xa.modeless),a.isOpen()&&(ja(a),J(a),r()))}function v(a){a.get("basic")?b(a.elements.root,xa.basic):c(a.elements.root,xa.basic)}function w(a){a.get("frameless")?b(a.elements.root,xa.frameless):c(a.elements.root,xa.frameless)}function x(a,b){for(var c=m.indexOf(b),d=c+1;d-1?(O(b,function(a){return a.key===c}),!1):void 0}function R(a){var b=m[m.length-1],c=a.keyCode;if(c===k.LEFT||c===k.RIGHT){for(var d=b.__internal.buttons,e=0;ek.F1-1&&ta.indexOf(c)>-1)return a.preventDefault(),a.stopPropagation(),O(b,function(a){return a.key===c}),!1}function S(a,b){if(b)b.focus();else{var c=a.__internal.focus,d=c.element;switch(typeof c.element){case"number":a.__internal.buttons.length>c.element&&(d=a.get("basic")===!0?a.elements.reset[0]:a.__internal.buttons[c.element].element);break;case"string":d=a.elements.body.querySelector(c.element);break;case"function":d=c.element.call(a)}"undefined"!=typeof d&&null!==d||0!==a.__internal.buttons.length||(d=a.elements.reset[0]),d&&d.focus&&(d.focus(),c.select&&d.select&&d.select())}}function T(a,b){if(!b)for(var c=m.length-1;c>-1;c-=1)if(m[c].isModal()){b=m[c];break}if(b&&b.isModal()){var d,e=a.srcElement||a.target,f=e===b.elements.reset[1]||0===b.__internal.buttons.length&&e===document.body;f&&(b.get("maximizable")?d=b.elements.commands.maximize:b.get("closable")&&(d=b.elements.commands.close)),void 0===d&&("number"==typeof b.__internal.focus.element?e===b.elements.reset[0]?d=b.elements.buttons.auxiliary.firstChild||b.elements.buttons.primary.firstChild:f&&(d=b.elements.reset[0]):e===b.elements.reset[0]&&(d=b.elements.buttons.primary.lastChild||b.elements.buttons.auxiliary.lastChild)),S(b,d)}}function U(a,b){clearTimeout(b.__internal.timerIn),S(b),q(),za=!1,"function"==typeof b.get("onfocus")&&b.get("onfocus").call(b),o(b.elements.dialog,p.type,b.__internal.transitionInHandler),c(b.elements.root,xa.animationIn)}function V(a,b){clearTimeout(b.__internal.timerOut),o(b.elements.dialog,p.type,b.__internal.transitionOutHandler),$(b),ea(b),b.isMaximized()&&!b.get("startMaximized")&&F(b),s.defaults.maintainFocus&&b.__internal.activeElement&&(b.__internal.activeElement.focus(),b.__internal.activeElement=null)}function W(a,b){b.style.left=a[Da]-Ba+"px",b.style.top=a[Ea]-Ca+"px"}function X(a,c){if(null===Fa&&!c.isMaximized()&&c.get("movable")){var d;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0],Da="clientX",Ea="clientY"):0===a.button&&(d=a),d){Aa=c,Ba=d[Da],Ca=d[Ea];var e=c.elements.dialog;return b(e,xa.capture),e.style.left&&(Ba-=parseInt(e.style.left,10)),e.style.top&&(Ca-=parseInt(e.style.top,10)),W(d,e),b(document.body,xa.noSelection),!1}}}function Y(a){if(Aa){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&W(b,Aa.elements.dialog)}}function Z(){if(Aa){var a=Aa.elements.dialog;Aa=null,c(document.body,xa.noSelection),c(a,xa.capture)}}function $(a){Aa=null;var b=a.elements.dialog;b.style.left=b.style.top=""}function _(a){a.get("movable")?(b(a.elements.root,xa.movable),a.isOpen()&&la(a)):($(a),c(a.elements.root,xa.movable),a.isOpen()&&ma(a))}function aa(a,b,c){var e=b,f=0,g=0;do f+=e.offsetLeft,g+=e.offsetTop;while(e=e.offsetParent);var h,i;c===!0?(h=a.pageX,i=a.pageY):(h=a.clientX,i=a.clientY);var j=d();if(j&&(h=document.body.offsetWidth-h,isNaN(Ga)||(f=document.body.offsetWidth-f-b.offsetWidth)),b.style.height=i-g+Ja+"px",b.style.width=h-f+Ja+"px",!isNaN(Ga)){var k=.5*Math.abs(b.offsetWidth-Ha);j&&(k*=-1),b.offsetWidth>Ha?b.style.left=Ga+k+"px":b.offsetWidth>=Ia&&(b.style.left=Ga-k+"px")}}function ba(a,c){if(!c.isMaximized()){var d;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0]):0===a.button&&(d=a),d){Fa=c,Ja=c.elements.resizeHandle.offsetHeight/2;var e=c.elements.dialog;return b(e,xa.capture),Ga=parseInt(e.style.left,10),e.style.height=e.offsetHeight+"px",e.style.minHeight=c.elements.header.offsetHeight+c.elements.footer.offsetHeight+"px",e.style.width=(Ha=e.offsetWidth)+"px","none"!==e.style.maxWidth&&(e.style.minWidth=(Ia=e.offsetWidth)+"px"),e.style.maxWidth="none",b(document.body,xa.noSelection),!1}}}function ca(a){if(Fa){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&aa(b,Fa.elements.dialog,!Fa.get("modal")&&!Fa.get("pinned"))}}function da(){if(Fa){var a=Fa.elements.dialog;Fa=null,c(document.body,xa.noSelection),c(a,xa.capture),ya=!0}}function ea(a){Fa=null;var b=a.elements.dialog;"none"===b.style.maxWidth&&(b.style.maxWidth=b.style.minWidth=b.style.width=b.style.height=b.style.minHeight=b.style.left="",Ga=Number.Nan,Ha=Ia=Ja=0)}function fa(a){a.get("resizable")?(b(a.elements.root,xa.resizable),a.isOpen()&&na(a)):(ea(a),c(a.elements.root,xa.resizable),a.isOpen()&&oa(a))}function ga(){for(var a=0;a-1&&a.navigator.userAgent.indexOf("Chrome")<0,wa={dimmer:'
',modal:'
',dialog:'
',reset:'',commands:'
',header:'
',body:'
',content:'
',footer:'',buttons:{primary:'
',auxiliary:'
'},button:'',resizeHandle:'
'},xa={base:"alertify",prefix:"ajs-",hidden:"ajs-hidden",noSelection:"ajs-no-selection",noOverflow:"ajs-no-overflow",noPadding:"ajs-no-padding",modeless:"ajs-modeless",movable:"ajs-movable",resizable:"ajs-resizable",capture:"ajs-capture",fixed:"ajs-fixed",closable:"ajs-closable",maximizable:"ajs-maximizable",maximize:"ajs-maximize",restore:"ajs-restore",pinnable:"ajs-pinnable",unpinned:"ajs-unpinned",pin:"ajs-pin",maximized:"ajs-maximized",animationIn:"ajs-in",animationOut:"ajs-out",shake:"ajs-shake",basic:"ajs-basic",frameless:"ajs-frameless"},ya=!1,za=!1,Aa=null,Ba=0,Ca=0,Da="pageX",Ea="pageY",Fa=null,Ga=Number.Nan,Ha=0,Ia=0,Ja=0;return{__init:j,isOpen:function(){return this.__internal.isOpen},isModal:function(){return this.elements.root.className.indexOf(xa.modeless)<0},isMaximized:function(){return this.elements.root.className.indexOf(xa.maximized)>-1},isPinned:function(){return this.elements.root.className.indexOf(xa.unpinned)<0},maximize:function(){return this.isMaximized()||E(this),this},restore:function(){return this.isMaximized()&&F(this),this},pin:function(){return this.isPinned()||C(this),this},unpin:function(){return this.isPinned()&&D(this),this},moveTo:function(a,b){if(!isNaN(a)&&!isNaN(b)){var c=this.elements.dialog,e=c,f=0,g=0;c.style.left&&(f-=parseInt(c.style.left,10)),c.style.top&&(g-=parseInt(c.style.top,10));do f+=e.offsetLeft,g+=e.offsetTop;while(e=e.offsetParent);var h=a-f,i=b-g;d()&&(h*=-1),c.style.left=h+"px",c.style.top=i+"px"}return this},resizeTo:function(a,b){var c=parseFloat(a),d=parseFloat(b),e=/(\d*\.\d+|\d+)%/;if(!isNaN(c)&&!isNaN(d)&&this.get("resizable")===!0){(""+a).match(e)&&(c=c/100*document.documentElement.clientWidth),(""+b).match(e)&&(d=d/100*document.documentElement.clientHeight);var f=this.elements.dialog;"none"!==f.style.maxWidth&&(f.style.minWidth=(Ia=f.offsetWidth)+"px"),f.style.maxWidth="none",f.style.minHeight=this.elements.header.offsetHeight+this.elements.footer.offsetHeight+"px",f.style.width=c+"px",f.style.height=d+"px"}return this},setting:function(a,b){var c=this,d=z(this,this.__internal.options,function(a,b,d){y(c,a,b,d)},a,b);if("get"===d.op)return d.found?d.value:"undefined"!=typeof this.settings?z(this,this.settings,this.settingUpdated||function(){},a,b).value:void 0;if("set"===d.op){if(d.items.length>0)for(var e=this.settingUpdated||function(){},f=0;f0){var b=this;this.__internal.timer=setTimeout(function(){b.dismiss()},1e3*this.__internal.delay)}return this},setContent:function(b){return"string"==typeof b?(g(this.element),this.element.innerHTML=b):b instanceof a.HTMLElement&&this.element.firstChild!==b&&(g(this.element),this.element.appendChild(b)),this},dismissOthers:function(){return r.dismissAll(this),this}})}var k,l,m=[],q={base:"alertify-notifier",message:"ajs-message",top:"ajs-top",right:"ajs-right",bottom:"ajs-bottom",left:"ajs-left",visible:"ajs-visible",hidden:"ajs-hidden"};return{setting:function(a,b){if(d(this),"undefined"==typeof b)return this.__internal[a];switch(a){case"position":this.__internal.position=b,i(this);break;case"delay":this.__internal.delay=b}return this},set:function(a,b){return this.setting(a,b),this},get:function(a){return this.setting(a)},create:function(a,b){d(this);var c=document.createElement("div");return c.className=q.message+("string"==typeof a&&""!==a?" ajs-"+a:""),j(c,b)},dismissAll:function(a){for(var b=m.slice(0),c=0;c