From ee7492a21e52f5b4531f0fe35f830aafecf597aa Mon Sep 17 00:00:00 2001 From: Rupesh Maharjan Date: Fri, 25 Oct 2019 15:03:25 +1100 Subject: [PATCH 1/2] Added confirm dialog for removing cookies --- background.js | 29 +- css/jquery-confirm.css | 1140 +++++++++++++++++++++++++++++++++ index.html | 2 + js/jquery-confirm.js | 1379 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2541 insertions(+), 9 deletions(-) create mode 100644 css/jquery-confirm.css create mode 100644 js/jquery-confirm.js diff --git a/background.js b/background.js index 993711e..1c27533 100644 --- a/background.js +++ b/background.js @@ -121,19 +121,30 @@ function onCookieChanged(){ onCookieChanged(); - function clearAllCookies(){ - console.log("cookies cleared"); - chrome.cookies.getAll({}, function(cookies) { - for (var i in cookies) { - removeCookie(cookies[i]); +function clearAllCookies(){ + $.confirm({ + title: 'Confirm ?', + content: 'Are you sure you want to clear all cookies for this domain?', + buttons: { + confirm: function () { + console.log("cookies cleared"); + chrome.cookies.getAll({}, function(cookies) { + for (var i in cookies) { + removeCookie(cookies[i]); + } + }); + document.getElementById("banner").className="alert alert-danger alert-dismissible"; + document.getElementById("message").innerHTML = "All Cookies are cleared!"; + setCookieCount(); + }, + cancel: function () { + } } - }); - document.getElementById("banner").className="alert alert-danger alert-dismissible"; - document.getElementById("message").innerHTML = "All Cookies are cleared!"; - setCookieCount(); + }); } function removeCookie(cookie) { + var url = "http" + (cookie.secure ? "s" : "") + "://" + cookie.domain + cookie.path; chrome.cookies.remove({"url": url, "name": cookie.name}); diff --git a/css/jquery-confirm.css b/css/jquery-confirm.css new file mode 100644 index 0000000..4f32367 --- /dev/null +++ b/css/jquery-confirm.css @@ -0,0 +1,1140 @@ +/*! + * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) + * Author: boniface pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2019 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */ + @-webkit-keyframes jconfirm-spin { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes jconfirm-spin { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +body[class*=jconfirm-no-scroll-] { + overflow: hidden !important; +} + +.jconfirm { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 99999999; + font-family: inherit; + overflow: hidden; +} + +.jconfirm .jconfirm-bg { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: opacity .4s; + transition: opacity .4s; +} + +.jconfirm .jconfirm-bg.jconfirm-bg-h { + opacity: 0 !important; +} + +.jconfirm .jconfirm-scrollpane { + -webkit-perspective: 500px; + perspective: 500px; + -webkit-perspective-origin: center; + perspective-origin: center; + display: table; + width: 100%; + height: 100%; +} + +.jconfirm .jconfirm-row { + display: table-row; + width: 100%; +} + +.jconfirm .jconfirm-cell { + display: table-cell; + vertical-align: middle; +} + +.jconfirm .jconfirm-holder { + max-height: 100%; + padding: 50px 0; +} + +.jconfirm .jconfirm-box-container { + -webkit-transition: -webkit-transform; + transition: -webkit-transform; + transition: transform; + transition: transform, -webkit-transform; +} + +.jconfirm .jconfirm-box-container.jconfirm-no-transition { + -webkit-transition: none !important; + transition: none !important; +} + +.jconfirm .jconfirm-box { + background: white; + border-radius: 4px; + position: relative; + outline: none; + padding: 15px 15px 0; + overflow: hidden; + margin-left: auto; + margin-right: auto; +} + +@-webkit-keyframes type-blue { + 1%, + 100% { + border-color: #3498db; + } + 50% { + border-color: #5faee3; + } +} + +@keyframes type-blue { + 1%, + 100% { + border-color: #3498db; + } + 50% { + border-color: #5faee3; + } +} + +@-webkit-keyframes type-green { + 1%, + 100% { + border-color: #2ecc71; + } + 50% { + border-color: #54d98c; + } +} + +@keyframes type-green { + 1%, + 100% { + border-color: #2ecc71; + } + 50% { + border-color: #54d98c; + } +} + +@-webkit-keyframes type-red { + 1%, + 100% { + border-color: #e74c3c; + } + 50% { + border-color: #ed7669; + } +} + +@keyframes type-red { + 1%, + 100% { + border-color: #e74c3c; + } + 50% { + border-color: #ed7669; + } +} + +@-webkit-keyframes type-orange { + 1%, + 100% { + border-color: #f1c40f; + } + 50% { + border-color: #f4d03f; + } +} + +@keyframes type-orange { + 1%, + 100% { + border-color: #f1c40f; + } + 50% { + border-color: #f4d03f; + } +} + +@-webkit-keyframes type-purple { + 1%, + 100% { + border-color: #9b59b6; + } + 50% { + border-color: #b07cc6; + } +} + +@keyframes type-purple { + 1%, + 100% { + border-color: #9b59b6; + } + 50% { + border-color: #b07cc6; + } +} + +@-webkit-keyframes type-dark { + 1%, + 100% { + border-color: #34495e; + } + 50% { + border-color: #46627f; + } +} + +@keyframes type-dark { + 1%, + 100% { + border-color: #34495e; + } + 50% { + border-color: #46627f; + } +} + +.jconfirm .jconfirm-box.jconfirm-type-animated { + -webkit-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.jconfirm .jconfirm-box.jconfirm-type-blue { + border-top: solid 7px #3498db; + -webkit-animation-name: type-blue; + animation-name: type-blue; +} + +.jconfirm .jconfirm-box.jconfirm-type-green { + border-top: solid 7px #2ecc71; + -webkit-animation-name: type-green; + animation-name: type-green; +} + +.jconfirm .jconfirm-box.jconfirm-type-red { + border-top: solid 7px #e74c3c; + -webkit-animation-name: type-red; + animation-name: type-red; +} + +.jconfirm .jconfirm-box.jconfirm-type-orange { + border-top: solid 7px #f1c40f; + -webkit-animation-name: type-orange; + animation-name: type-orange; +} + +.jconfirm .jconfirm-box.jconfirm-type-purple { + border-top: solid 7px #9b59b6; + -webkit-animation-name: type-purple; + animation-name: type-purple; +} + +.jconfirm .jconfirm-box.jconfirm-type-dark { + border-top: solid 7px #34495e; + -webkit-animation-name: type-dark; + animation-name: type-dark; +} + +.jconfirm .jconfirm-box.loading { + height: 120px; +} + +.jconfirm .jconfirm-box.loading:before { + content: ''; + position: absolute; + left: 0; + background: white; + right: 0; + top: 0; + bottom: 0; + border-radius: 10px; + z-index: 1; +} + +.jconfirm .jconfirm-box.loading:after { + opacity: 0.6; + content: ''; + height: 30px; + width: 30px; + border: solid 3px transparent; + position: absolute; + left: 50%; + margin-left: -15px; + border-radius: 50%; + -webkit-animation: jconfirm-spin 1s infinite linear; + animation: jconfirm-spin 1s infinite linear; + border-bottom-color: dodgerblue; + top: 50%; + margin-top: -15px; + z-index: 2; +} + +.jconfirm .jconfirm-box div.jconfirm-closeIcon { + height: 20px; + width: 20px; + position: absolute; + top: 10px; + right: 10px; + cursor: pointer; + opacity: .6; + text-align: center; + font-size: 27px !important; + line-height: 14px !important; + display: none; + z-index: 1; +} + +.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty { + display: none; +} + +.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa { + font-size: 16px; +} + +.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon { + font-size: 16px; +} + +.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi { + font-size: 16px; +} + +.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover { + opacity: 1; +} + +.jconfirm .jconfirm-box div.jconfirm-title-c { + display: block; + font-size: 22px; + line-height: 20px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: default; + padding-bottom: 15px; +} + +.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand { + cursor: move; +} + +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + font-size: inherit; + display: inline-block; + vertical-align: middle; +} + +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i { + vertical-align: middle; +} + +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty { + display: none; +} + +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-size: inherit; + font-family: inherit; + display: inline-block; + vertical-align: middle; +} + +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty { + display: none; +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane { + margin-bottom: 15px; + height: auto; + -webkit-transition: height 0.4s ease-in; + transition: height 0.4s ease-in; + display: inline-block; + width: 100%; + position: relative; + overflow-x: hidden; + overflow-y: auto; +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll { + overflow-y: hidden; +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar { + width: 3px; +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.1); +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb { + background: #666; + border-radius: 3px; +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content { + overflow: auto; +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img { + max-width: 100%; + height: auto; +} + +.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty { + display: none; +} + +.jconfirm .jconfirm-box .jconfirm-buttons { + padding-bottom: 11px; +} + +.jconfirm .jconfirm-box .jconfirm-buttons > button { + margin-bottom: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button { + display: inline-block; + padding: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-radius: 4px; + min-height: 1em; + -webkit-transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease; + transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease; + transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease; + transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease; + -webkit-tap-highlight-color: transparent; + border: none; + background-image: none; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue { + background-color: #3498db; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover { + background-color: #2980b9; + color: #FFF; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green { + background-color: #2ecc71; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover { + background-color: #27ae60; + color: #FFF; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red { + background-color: #e74c3c; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover { + background-color: #c0392b; + color: #FFF; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange { + background-color: #f1c40f; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover { + background-color: #f39c12; + color: #FFF; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default { + background-color: #ecf0f1; + color: #000; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover { + background-color: #bdc3c7; + color: #000; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple { + background-color: #9b59b6; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover { + background-color: #8e44ad; + color: #FFF; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark { + background-color: #34495e; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} + +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover { + background-color: #2c3e50; + color: #FFF; +} + +.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c { + color: #e74c3c !important; +} + +.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c { + color: #3498db !important; +} + +.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c { + color: #2ecc71 !important; +} + +.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c { + color: #9b59b6 !important; +} + +.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c { + color: #f1c40f !important; +} + +.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c { + color: #34495e !important; +} + +.jconfirm .jconfirm-clear { + clear: both; +} + +.jconfirm.jconfirm-rtl { + direction: rtl; +} + +.jconfirm.jconfirm-rtl div.jconfirm-closeIcon { + left: 5px; + right: auto; +} + +.jconfirm.jconfirm-white .jconfirm-bg, +.jconfirm.jconfirm-light .jconfirm-bg { + background-color: #444; + opacity: .2; +} + +.jconfirm.jconfirm-white .jconfirm-box, +.jconfirm.jconfirm-light .jconfirm-box { + -webkit-box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); + border-radius: 5px; +} + +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} + +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons { + float: right; +} + +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button { + text-transform: uppercase; + font-size: 14px; + font-weight: bold; + text-shadow: none; +} + +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default { + -webkit-box-shadow: none; + box-shadow: none; + color: #333; +} + +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover { + background: #ddd; +} + +.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} + +.jconfirm.jconfirm-black .jconfirm-bg, +.jconfirm.jconfirm-dark .jconfirm-bg { + background-color: darkslategray; + opacity: .4; +} + +.jconfirm.jconfirm-black .jconfirm-box, +.jconfirm.jconfirm-dark .jconfirm-box { + -webkit-box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); + background: #444; + border-radius: 5px; + color: white; +} + +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} + +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons { + float: right; +} + +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button { + border: none; + background-image: none; + text-transform: uppercase; + font-size: 14px; + font-weight: bold; + text-shadow: none; + -webkit-transition: background .1s; + transition: background .1s; + color: white; +} + +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default { + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + background: none; +} + +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover { + background: #666; +} + +.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} + +.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake { + -webkit-animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow { + -webkit-animation: glow 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + animation: glow 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +@-webkit-keyframes shake { + 10%, + 90% { + -webkit-transform: translate3d(-2px, 0, 0); + transform: translate3d(-2px, 0, 0); + } + 20%, + 80% { + -webkit-transform: translate3d(4px, 0, 0); + transform: translate3d(4px, 0, 0); + } + 30%, + 50%, + 70% { + -webkit-transform: translate3d(-8px, 0, 0); + transform: translate3d(-8px, 0, 0); + } + 40%, + 60% { + -webkit-transform: translate3d(8px, 0, 0); + transform: translate3d(8px, 0, 0); + } +} + +@keyframes shake { + 10%, + 90% { + -webkit-transform: translate3d(-2px, 0, 0); + transform: translate3d(-2px, 0, 0); + } + 20%, + 80% { + -webkit-transform: translate3d(4px, 0, 0); + transform: translate3d(4px, 0, 0); + } + 30%, + 50%, + 70% { + -webkit-transform: translate3d(-8px, 0, 0); + transform: translate3d(-8px, 0, 0); + } + 40%, + 60% { + -webkit-transform: translate3d(8px, 0, 0); + transform: translate3d(8px, 0, 0); + } +} + +@-webkit-keyframes glow { + 0%, + 100% { + -webkit-box-shadow: 0 0 0px red; + box-shadow: 0 0 0px red; + } + 50% { + -webkit-box-shadow: 0 0 30px red; + box-shadow: 0 0 30px red; + } +} + +@keyframes glow { + 0%, + 100% { + -webkit-box-shadow: 0 0 0px red; + box-shadow: 0 0 0px red; + } + 50% { + -webkit-box-shadow: 0 0 30px red; + box-shadow: 0 0 30px red; + } +} + +/*Transition rules*/ +.jconfirm { + -webkit-perspective: 400px; + perspective: 400px; +} + +.jconfirm .jconfirm-box { + opacity: 1; + -webkit-transition-property: all; + transition-property: all; +} + +.jconfirm .jconfirm-box.jconfirm-animation-top, +.jconfirm .jconfirm-box.jconfirm-animation-left, +.jconfirm .jconfirm-box.jconfirm-animation-right, +.jconfirm .jconfirm-box.jconfirm-animation-bottom, +.jconfirm .jconfirm-box.jconfirm-animation-opacity, +.jconfirm .jconfirm-box.jconfirm-animation-zoom, +.jconfirm .jconfirm-box.jconfirm-animation-scale, +.jconfirm .jconfirm-box.jconfirm-animation-none, +.jconfirm .jconfirm-box.jconfirm-animation-rotate, +.jconfirm .jconfirm-box.jconfirm-animation-rotatex, +.jconfirm .jconfirm-box.jconfirm-animation-rotatey, +.jconfirm .jconfirm-box.jconfirm-animation-scaley, +.jconfirm .jconfirm-box.jconfirm-animation-scalex { + opacity: 0; +} + +.jconfirm .jconfirm-box.jconfirm-animation-rotate { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} + +.jconfirm .jconfirm-box.jconfirm-animation-rotatex { + -webkit-transform: rotateX(90deg); + transform: rotateX(90deg); + -webkit-transform-origin: center; + transform-origin: center; +} + +.jconfirm .jconfirm-box.jconfirm-animation-rotatexr { + -webkit-transform: rotateX(-90deg); + transform: rotateX(-90deg); + -webkit-transform-origin: center; + transform-origin: center; +} + +.jconfirm .jconfirm-box.jconfirm-animation-rotatey { + -webkit-transform: rotatey(90deg); + transform: rotatey(90deg); + -webkit-transform-origin: center; + transform-origin: center; +} + +.jconfirm .jconfirm-box.jconfirm-animation-rotateyr { + -webkit-transform: rotatey(-90deg); + transform: rotatey(-90deg); + -webkit-transform-origin: center; + transform-origin: center; +} + +.jconfirm .jconfirm-box.jconfirm-animation-scaley { + -webkit-transform: scaley(1.5); + transform: scaley(1.5); + -webkit-transform-origin: center; + transform-origin: center; +} + +.jconfirm .jconfirm-box.jconfirm-animation-scalex { + -webkit-transform: scalex(1.5); + transform: scalex(1.5); + -webkit-transform-origin: center; + transform-origin: center; +} + +.jconfirm .jconfirm-box.jconfirm-animation-top { + -webkit-transform: translate(0px, -100px); + transform: translate(0px, -100px); +} + +.jconfirm .jconfirm-box.jconfirm-animation-left { + -webkit-transform: translate(-100px, 0px); + transform: translate(-100px, 0px); +} + +.jconfirm .jconfirm-box.jconfirm-animation-right { + -webkit-transform: translate(100px, 0px); + transform: translate(100px, 0px); +} + +.jconfirm .jconfirm-box.jconfirm-animation-bottom { + -webkit-transform: translate(0px, 100px); + transform: translate(0px, 100px); +} + +.jconfirm .jconfirm-box.jconfirm-animation-zoom { + -webkit-transform: scale(1.2); + transform: scale(1.2); +} + +.jconfirm .jconfirm-box.jconfirm-animation-scale { + -webkit-transform: scale(0.5); + transform: scale(0.5); +} + +.jconfirm .jconfirm-box.jconfirm-animation-none { + visibility: hidden; +} + +.jconfirm.jconfirm-supervan .jconfirm-bg { + background-color: rgba(54, 70, 93, 0.95); +} + +.jconfirm.jconfirm-supervan .jconfirm-box { + background-color: transparent; +} + +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue { + border: none; +} + +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green { + border: none; +} + +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red { + border: none; +} + +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange { + border: none; +} + +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple { + border: none; +} + +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark { + border: none; +} + +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon { + color: white; +} + +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c { + text-align: center; + color: white; + font-size: 28px; + font-weight: normal; +} + +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c > * { + padding-bottom: 25px; +} + +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} + +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane { + margin-bottom: 25px; +} + +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content { + text-align: center; + color: white; +} + +.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons { + text-align: center; +} + +.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button { + font-size: 16px; + border-radius: 2px; + background: #303f53; + text-shadow: none; + border: none; + color: white; + padding: 10px; + min-width: 100px; +} + +.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} + +.jconfirm.jconfirm-material .jconfirm-bg { + background-color: rgba(0, 0, 0, 0.67); +} + +.jconfirm.jconfirm-material .jconfirm-box { + background-color: white; + -webkit-box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + padding: 30px 25px 10px 25px; +} + +.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} + +.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon { + color: rgba(0, 0, 0, 0.87); +} + +.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c { + color: rgba(0, 0, 0, 0.87); + font-size: 22px; + font-weight: bold; +} + +.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content { + color: rgba(0, 0, 0, 0.87); +} + +.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons { + text-align: right; +} + +.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button { + text-transform: uppercase; + font-weight: 500; +} + +.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} + +.jconfirm.jconfirm-bootstrap .jconfirm-bg { + background-color: rgba(0, 0, 0, 0.21); +} + +.jconfirm.jconfirm-bootstrap .jconfirm-box { + background-color: white; + -webkit-box-shadow: 0 3px 8px 0px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 8px 0px rgba(0, 0, 0, 0.2); + border: solid 1px rgba(0, 0, 0, 0.4); + padding: 15px 0 0; +} + +.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} + +.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon { + color: rgba(0, 0, 0, 0.87); +} + +.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c { + color: rgba(0, 0, 0, 0.87); + font-size: 22px; + font-weight: bold; + padding-left: 15px; + padding-right: 15px; +} + +.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content { + color: rgba(0, 0, 0, 0.87); + padding: 0px 15px; +} + +.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons { + text-align: right; + padding: 10px; + margin: -5px 0 0px; + border-top: solid 1px #ddd; + overflow: hidden; + border-radius: 0 0 4px 4px; +} + +.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button { + font-weight: 500; +} + +.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} + +.jconfirm.jconfirm-modern .jconfirm-bg { + background-color: slategray; + opacity: .6; +} + +.jconfirm.jconfirm-modern .jconfirm-box { + background-color: white; + -webkit-box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + padding: 30px 30px 15px; +} + +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon { + color: rgba(0, 0, 0, 0.87); + top: 15px; + right: 15px; +} + +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c { + color: rgba(0, 0, 0, 0.87); + font-size: 24px; + font-weight: bold; + text-align: center; + margin-bottom: 10px; +} + +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + -webkit-transition: -webkit-transform .5s; + transition: -webkit-transform .5s; + transition: transform .5s; + transition: transform .5s, -webkit-transform .5s; + -webkit-transform: scale(0); + transform: scale(0); + display: block; + margin-right: 0px; + margin-left: 0px; + margin-bottom: 10px; + font-size: 69px; + color: #aaa; +} + +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content { + text-align: center; + font-size: 15px; + color: #777; + margin-bottom: 25px; +} + +.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons { + text-align: center; +} + +.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button { + font-weight: bold; + text-transform: uppercase; + -webkit-transition: background .1s; + transition: background .1s; + padding: 10px 20px; +} + +.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button + button { + margin-left: 4px; +} + +.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + -webkit-transform: scale(1); + transform: scale(1); +} diff --git a/index.html b/index.html index 14c92e8..612eb81 100644 --- a/index.html +++ b/index.html @@ -7,6 +7,7 @@ + + diff --git a/js/jquery-confirm.js b/js/jquery-confirm.js new file mode 100644 index 0000000..a1f6747 --- /dev/null +++ b/js/jquery-confirm.js @@ -0,0 +1,1379 @@ +/*! + * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) + * Author: Boniface Pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2019 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */ + + +/** + * UMD (Universal Module Definition) to support CommonJS, AMD and browser + * Thanks to https://github.com/umdjs/umd + */ +(function(factory){ + if(typeof define === 'function' && define.amd){ + // AMD. Register as an anonymous module. + define(['jquery'], factory); + }else if(typeof module === 'object' && module.exports){ + // Node/CommonJS + module.exports = function(root, jQuery){ + if(jQuery === undefined){ + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if(typeof window !== 'undefined'){ + jQuery = require('jquery'); + } + else{ + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + }else{ + // Browser globals + factory(jQuery); + } +}(function($){ + "use strict"; + + // locally assign window + var w = window; + // w.jconfirm + // w.Jconfirm; + + $.fn.confirm = function(options, option2){ + if(typeof options === 'undefined') options = {}; + if(typeof options === 'string'){ + options = { + content: options, + title: (option2) ? option2 : false + }; + } + /* + * Alias of $.confirm to emulate native confirm() + */ + $(this).each(function(){ + var $this = $(this); + if($this.attr('jc-attached')){ + console.warn('jConfirm has already been attached to this element ', $this[0]); + return; + } + + $this.on('click', function(e){ + e.preventDefault(); + var jcOption = $.extend({}, options); + if($this.attr('data-title')) + jcOption['title'] = $this.attr('data-title'); + if($this.attr('data-content')) + jcOption['content'] = $this.attr('data-content'); + if(typeof jcOption['buttons'] === 'undefined') + jcOption['buttons'] = {}; + + jcOption['$target'] = $this; + if($this.attr('href') && Object.keys(jcOption['buttons']).length === 0){ + var buttons = $.extend(true, {}, w.jconfirm.pluginDefaults.defaultButtons, (w.jconfirm.defaults || {}).defaultButtons || {}); + var firstBtn = Object.keys(buttons)[0]; + jcOption['buttons'] = buttons; + jcOption.buttons[firstBtn].action = function(){ + location.href = $this.attr('href'); + }; + } + jcOption['closeIcon'] = false; + var instance = $.confirm(jcOption); + }); + + $this.attr('jc-attached', true); + }); + return $(this); + }; + $.confirm = function(options, option2){ + if(typeof options === 'undefined') options = {}; + if(typeof options === 'string'){ + options = { + content: options, + title: (option2) ? option2 : false + }; + } + + var putDefaultButtons = !(options['buttons'] === false); + + if(typeof options['buttons'] !== 'object') + options['buttons'] = {}; + + if(Object.keys(options['buttons']).length === 0 && putDefaultButtons){ + var buttons = $.extend(true, {}, w.jconfirm.pluginDefaults.defaultButtons, (w.jconfirm.defaults || {}).defaultButtons || {}); + options['buttons'] = buttons; + } + + /* + * Alias of jconfirm + */ + return w.jconfirm(options); + }; + $.alert = function(options, option2){ + if(typeof options === 'undefined') options = {}; + if(typeof options === 'string'){ + options = { + content: options, + title: (option2) ? option2 : false + }; + } + + var putDefaultButtons = !(options['buttons'] === false); + + if(typeof options.buttons !== 'object') + options.buttons = {}; + + if(Object.keys(options['buttons']).length === 0 && putDefaultButtons){ + var buttons = $.extend(true, {}, w.jconfirm.pluginDefaults.defaultButtons, (w.jconfirm.defaults || {}).defaultButtons || {}); + var firstBtn = Object.keys(buttons)[0]; + options['buttons'][firstBtn] = buttons[firstBtn]; + } + /* + * Alias of jconfirm + */ + return w.jconfirm(options); + }; + $.dialog = function(options, option2){ + if(typeof options === 'undefined') options = {}; + if(typeof options === 'string'){ + options = { + content: options, + title: (option2) ? option2 : false, + closeIcon: function(){ + // Just close the modal + } + }; + } + + options['buttons'] = {}; // purge buttons + + if(typeof options['closeIcon'] === 'undefined'){ + // Dialog must have a closeIcon. + options['closeIcon'] = function(){ + } + } + /* + * Alias of jconfirm + */ + options.confirmKeys = [13]; + return w.jconfirm(options); + }; + + w.jconfirm = function(options){ + if(typeof options === 'undefined') options = {}; + /* + * initial function for calling. + */ + var pluginOptions = $.extend(true, {}, w.jconfirm.pluginDefaults); + if(w.jconfirm.defaults){ + pluginOptions = $.extend(true, pluginOptions, w.jconfirm.defaults); + } + + /* + * merge options with plugin defaults. + */ + pluginOptions = $.extend(true, {}, pluginOptions, options); + var instance = new w.Jconfirm(pluginOptions); + w.jconfirm.instances.push(instance); + return instance; + }; + w.Jconfirm = function(options){ + /* + * constructor function Jconfirm, + * options = user options. + */ + $.extend(this, options); + this._init(); + }; + w.Jconfirm.prototype = { + _init: function(){ + var that = this; + + if(!w.jconfirm.instances.length) + w.jconfirm.lastFocused = $('body').find(':focus'); + + this._id = Math.round(Math.random() * 99999); + /** + * contentParsed maintains the contents for $content, before it is put in DOM + */ + this.contentParsed = $(document.createElement('div')); + + if(!this.lazyOpen){ + setTimeout(function(){ + that.open(); + }, 0); + } + }, + _buildHTML: function(){ + var that = this; + + // prefix the animation string and store in animationParsed + this._parseAnimation(this.animation, 'o'); + this._parseAnimation(this.closeAnimation, 'c'); + this._parseBgDismissAnimation(this.backgroundDismissAnimation); + this._parseColumnClass(this.columnClass); + this._parseTheme(this.theme); + this._parseType(this.type); + + /* + * Append html. + */ + var template = $(this.template); + template.find('.jconfirm-box').addClass(this.animationParsed).addClass(this.backgroundDismissAnimationParsed).addClass(this.typeParsed); + + if(this.typeAnimated) + template.find('.jconfirm-box').addClass('jconfirm-type-animated'); + + if(this.useBootstrap){ + template.find('.jc-bs3-row').addClass(this.bootstrapClasses.row); + template.find('.jc-bs3-row').addClass('justify-content-md-center justify-content-sm-center justify-content-xs-center justify-content-lg-center'); + + template.find('.jconfirm-box-container').addClass(this.columnClassParsed); + + if(this.containerFluid) + template.find('.jc-bs3-container').addClass(this.bootstrapClasses.containerFluid); + else + template.find('.jc-bs3-container').addClass(this.bootstrapClasses.container); + }else{ + template.find('.jconfirm-box').css('width', this.boxWidth); + } + + if(this.titleClass) + template.find('.jconfirm-title-c').addClass(this.titleClass); + + template.addClass(this.themeParsed); + var ariaLabel = 'jconfirm-box' + this._id; + template.find('.jconfirm-box').attr('aria-labelledby', ariaLabel).attr('tabindex', -1); + template.find('.jconfirm-content').attr('id', ariaLabel); + if(this.bgOpacity !== null) + template.find('.jconfirm-bg').css('opacity', this.bgOpacity); + if(this.rtl) + template.addClass('jconfirm-rtl'); + + this.$el = template.appendTo(this.container); + this.$jconfirmBoxContainer = this.$el.find('.jconfirm-box-container'); + this.$jconfirmBox = this.$body = this.$el.find('.jconfirm-box'); + this.$jconfirmBg = this.$el.find('.jconfirm-bg'); + this.$title = this.$el.find('.jconfirm-title'); + this.$titleContainer = this.$el.find('.jconfirm-title-c'); + this.$content = this.$el.find('div.jconfirm-content'); + this.$contentPane = this.$el.find('.jconfirm-content-pane'); + this.$icon = this.$el.find('.jconfirm-icon-c'); + this.$closeIcon = this.$el.find('.jconfirm-closeIcon'); + this.$holder = this.$el.find('.jconfirm-holder'); + // this.$content.css(this._getCSS(this.animationSpeed, this.animationBounce)); + this.$btnc = this.$el.find('.jconfirm-buttons'); + this.$scrollPane = this.$el.find('.jconfirm-scrollpane'); + + that.setStartingPoint(); + + // for loading content via URL + this._contentReady = $.Deferred(); + this._modalReady = $.Deferred(); + this.$holder.css({ + 'padding-top': this.offsetTop, + 'padding-bottom': this.offsetBottom, + }); + + this.setTitle(); + this.setIcon(); + this._setButtons(); + this._parseContent(); + this.initDraggable(); + + if(this.isAjax) + this.showLoading(false); + + $.when(this._contentReady, this._modalReady).then(function(){ + if(that.isAjaxLoading) + setTimeout(function(){ + that.isAjaxLoading = false; + that.setContent(); + that.setTitle(); + that.setIcon(); + setTimeout(function(){ + that.hideLoading(false); + that._updateContentMaxHeight(); + }, 100); + if(typeof that.onContentReady === 'function') + that.onContentReady(); + }, 50); + else{ + // that.setContent(); + that._updateContentMaxHeight(); + that.setTitle(); + that.setIcon(); + if(typeof that.onContentReady === 'function') + that.onContentReady(); + } + + // start countdown after content has loaded. + if(that.autoClose) + that._startCountDown(); + }).then(function(){ + that._watchContent(); + }); + + if(this.animation === 'none'){ + this.animationSpeed = 1; + this.animationBounce = 1; + } + + this.$body.css(this._getCSS(this.animationSpeed, this.animationBounce)); + this.$contentPane.css(this._getCSS(this.animationSpeed, 1)); + this.$jconfirmBg.css(this._getCSS(this.animationSpeed, 1)); + this.$jconfirmBoxContainer.css(this._getCSS(this.animationSpeed, 1)); + }, + _typePrefix: 'jconfirm-type-', + typeParsed: '', + _parseType: function(type){ + this.typeParsed = this._typePrefix + type; + }, + setType: function(type){ + var oldClass = this.typeParsed; + this._parseType(type); + this.$jconfirmBox.removeClass(oldClass).addClass(this.typeParsed); + }, + themeParsed: '', + _themePrefix: 'jconfirm-', + setTheme: function(theme){ + var previous = this.theme; + this.theme = theme || this.theme; + this._parseTheme(this.theme); + if(previous) + this.$el.removeClass(previous); + this.$el.addClass(this.themeParsed); + this.theme = theme; + }, + _parseTheme: function(theme){ + var that = this; + theme = theme.split(','); + $.each(theme, function(k, a){ + if(a.indexOf(that._themePrefix) === -1) + theme[k] = that._themePrefix + $.trim(a); + }); + this.themeParsed = theme.join(' ').toLowerCase(); + }, + backgroundDismissAnimationParsed: '', + _bgDismissPrefix: 'jconfirm-hilight-', + _parseBgDismissAnimation: function(bgDismissAnimation){ + var animation = bgDismissAnimation.split(','); + var that = this; + $.each(animation, function(k, a){ + if(a.indexOf(that._bgDismissPrefix) === -1) + animation[k] = that._bgDismissPrefix + $.trim(a); + }); + this.backgroundDismissAnimationParsed = animation.join(' ').toLowerCase(); + }, + animationParsed: '', + closeAnimationParsed: '', + _animationPrefix: 'jconfirm-animation-', + setAnimation: function(animation){ + this.animation = animation || this.animation; + this._parseAnimation(this.animation, 'o'); + }, + _parseAnimation: function(animation, which){ + which = which || 'o'; // parse what animation and store where. open or close? + var animations = animation.split(','); + var that = this; + $.each(animations, function(k, a){ + if(a.indexOf(that._animationPrefix) === -1) + animations[k] = that._animationPrefix + $.trim(a); + }); + var a_string = animations.join(' ').toLowerCase(); + if(which === 'o') + this.animationParsed = a_string; + else + this.closeAnimationParsed = a_string; + + return a_string; + }, + setCloseAnimation: function(closeAnimation){ + this.closeAnimation = closeAnimation || this.closeAnimation; + this._parseAnimation(this.closeAnimation, 'c'); + }, + setAnimationSpeed: function(speed){ + this.animationSpeed = speed || this.animationSpeed; + // this.$body.css(this._getCSS(this.animationSpeed, this.animationBounce)); + }, + columnClassParsed: '', + setColumnClass: function(colClass){ + if(!this.useBootstrap){ + console.warn("cannot set columnClass, useBootstrap is set to false"); + return; + } + this.columnClass = colClass || this.columnClass; + this._parseColumnClass(this.columnClass); + this.$jconfirmBoxContainer.addClass(this.columnClassParsed); + }, + _updateContentMaxHeight: function(){ + var height = $(window).height() - (this.$jconfirmBox.outerHeight() - this.$contentPane.outerHeight()) - (this.offsetTop + this.offsetBottom); + this.$contentPane.css({ + 'max-height': height + 'px' + }); + }, + setBoxWidth: function(width){ + if(this.useBootstrap){ + console.warn("cannot set boxWidth, useBootstrap is set to true"); + return; + } + this.boxWidth = width; + this.$jconfirmBox.css('width', width); + }, + _parseColumnClass: function(colClass){ + colClass = colClass.toLowerCase(); + var p; + switch(colClass){ + case 'xl': + case 'xlarge': + p = 'col-md-12'; + break; + case 'l': + case 'large': + p = 'col-md-8 col-md-offset-2'; + break; + case 'm': + case 'medium': + p = 'col-md-6 col-md-offset-3'; + break; + case 's': + case 'small': + p = 'col-md-4 col-md-offset-4'; + break; + case 'xs': + case 'xsmall': + p = 'col-md-2 col-md-offset-5'; + break; + default: + p = colClass; + } + this.columnClassParsed = p; + }, + initDraggable: function(){ + var that = this; + var $t = this.$titleContainer; + + this.resetDrag(); + if(this.draggable){ + $t.on('mousedown', function(e){ + $t.addClass('jconfirm-hand'); + that.mouseX = e.clientX; + that.mouseY = e.clientY; + that.isDrag = true; + }); + $(window).on('mousemove.' + this._id, function(e){ + if(that.isDrag){ + that.movingX = e.clientX - that.mouseX + that.initialX; + that.movingY = e.clientY - that.mouseY + that.initialY; + that.setDrag(); + } + }); + + $(window).on('mouseup.' + this._id, function(){ + $t.removeClass('jconfirm-hand'); + if(that.isDrag){ + that.isDrag = false; + that.initialX = that.movingX; + that.initialY = that.movingY; + } + }) + } + }, + resetDrag: function(){ + this.isDrag = false; + this.initialX = 0; + this.initialY = 0; + this.movingX = 0; + this.movingY = 0; + this.mouseX = 0; + this.mouseY = 0; + this.$jconfirmBoxContainer.css('transform', 'translate(' + 0 + 'px, ' + 0 + 'px)'); + }, + setDrag: function(){ + if(!this.draggable) + return; + + this.alignMiddle = false; + var boxWidth = this.$jconfirmBox.outerWidth(); + var boxHeight = this.$jconfirmBox.outerHeight(); + var windowWidth = $(window).width(); + var windowHeight = $(window).height(); + var that = this; + var dragUpdate = 1; + if(that.movingX % dragUpdate === 0 || that.movingY % dragUpdate === 0){ + if(that.dragWindowBorder){ + var leftDistance = (windowWidth / 2) - boxWidth / 2; + var topDistance = (windowHeight / 2) - boxHeight / 2; + topDistance -= that.dragWindowGap; + leftDistance -= that.dragWindowGap; + + if(leftDistance + that.movingX < 0){ + that.movingX = -leftDistance; + }else if(leftDistance - that.movingX < 0){ + that.movingX = leftDistance; + } + + if(topDistance + that.movingY < 0){ + that.movingY = -topDistance; + }else if(topDistance - that.movingY < 0){ + that.movingY = topDistance; + } + } + + that.$jconfirmBoxContainer.css('transform', 'translate(' + that.movingX + 'px, ' + that.movingY + 'px)'); + } + }, + _scrollTop: function(){ + if(typeof pageYOffset !== 'undefined'){ + //most browsers except IE before #9 + return pageYOffset; + } + else{ + var B = document.body; //IE 'quirks' + var D = document.documentElement; //IE with doctype + D = (D.clientHeight) ? D : B; + return D.scrollTop; + } + }, + _watchContent: function(){ + var that = this; + if(this._timer) clearInterval(this._timer); + + var prevContentHeight = 0; + this._timer = setInterval(function(){ + if(that.smoothContent){ + var contentHeight = that.$content.outerHeight() || 0; + if(contentHeight !== prevContentHeight){ + + // Commented out to prevent scroll to top when updating the content + // (for example when using ajax in forms in content) + // that.$contentPane.css({ + // 'height': contentHeight + // }).scrollTop(0); + prevContentHeight = contentHeight; + } + var wh = $(window).height(); + var total = that.offsetTop + that.offsetBottom + that.$jconfirmBox.height() - that.$contentPane.height() + that.$content.height(); + if(total < wh){ + that.$contentPane.addClass('no-scroll'); + }else{ + that.$contentPane.removeClass('no-scroll'); + } + } + }, this.watchInterval); + }, + _overflowClass: 'jconfirm-overflow', + _hilightAnimating: false, + highlight: function(){ + this.hiLightModal(); + }, + hiLightModal: function(){ + var that = this; + if(this._hilightAnimating) + return; + + that.$body.addClass('hilight'); + var duration = parseFloat(that.$body.css('animation-duration')) || 2; + this._hilightAnimating = true; + setTimeout(function(){ + that._hilightAnimating = false; + that.$body.removeClass('hilight'); + }, duration * 1000); + }, + _bindEvents: function(){ + var that = this; + this.boxClicked = false; + + this.$scrollPane.click(function(e){ // Ignore propagated clicks + if(!that.boxClicked){ // Background clicked + /* + If backgroundDismiss is a function and its return value is truthy + proceed to close the modal. + */ + var buttonName = false; + var shouldClose = false; + var str; + + if(typeof that.backgroundDismiss === 'function') + str = that.backgroundDismiss(); + else + str = that.backgroundDismiss; + + if(typeof str === 'string' && typeof that.buttons[str] !== 'undefined'){ + buttonName = str; + shouldClose = false; + }else if(typeof str === 'undefined' || !!(str) === true){ + shouldClose = true; + }else{ + shouldClose = false; + } + + if(buttonName){ + var btnResponse = that.buttons[buttonName].action.apply(that); + shouldClose = (typeof btnResponse === 'undefined') || !!(btnResponse); + } + + if(shouldClose) + that.close(); + else + that.hiLightModal(); + } + that.boxClicked = false; + }); + + this.$jconfirmBox.click(function(e){ + that.boxClicked = true; + }); + + var isKeyDown = false; + $(window).on('jcKeyDown.' + that._id, function(e){ + if(!isKeyDown){ + isKeyDown = true; + } + }); + $(window).on('keyup.' + that._id, function(e){ + if(isKeyDown){ + that.reactOnKey(e); + isKeyDown = false; + } + }); + + $(window).on('resize.' + this._id, function(){ + that._updateContentMaxHeight(); + setTimeout(function(){ + that.resetDrag(); + }, 100); + }); + }, + _cubic_bezier: '0.36, 0.55, 0.19', + _getCSS: function(speed, bounce){ + return { + '-webkit-transition-duration': speed / 1000 + 's', + 'transition-duration': speed / 1000 + 's', + '-webkit-transition-timing-function': 'cubic-bezier(' + this._cubic_bezier + ', ' + bounce + ')', + 'transition-timing-function': 'cubic-bezier(' + this._cubic_bezier + ', ' + bounce + ')' + }; + }, + _setButtons: function(){ + var that = this; + /* + * Settings up buttons + */ + + var total_buttons = 0; + if(typeof this.buttons !== 'object') + this.buttons = {}; + + $.each(this.buttons, function(key, button){ + total_buttons += 1; + if(typeof button === 'function'){ + that.buttons[key] = button = { + action: button + }; + } + + that.buttons[key].text = button.text || key; + that.buttons[key].btnClass = button.btnClass || 'btn-default'; + that.buttons[key].action = button.action || function(){ + }; + that.buttons[key].keys = button.keys || []; + that.buttons[key].isHidden = button.isHidden || false; + that.buttons[key].isDisabled = button.isDisabled || false; + + $.each(that.buttons[key].keys, function(i, a){ + that.buttons[key].keys[i] = a.toLowerCase(); + }); + + var button_element = $('') + .html(that.buttons[key].text) + .addClass(that.buttons[key].btnClass) + .prop('disabled', that.buttons[key].isDisabled) + .css('display', that.buttons[key].isHidden ? 'none' : '') + .click(function(e){ + e.preventDefault(); + var res = that.buttons[key].action.apply(that, [that.buttons[key]]); + that.onAction.apply(that, [key, that.buttons[key]]); + that._stopCountDown(); + if(typeof res === 'undefined' || res) + that.close(); + }); + + that.buttons[key].el = button_element; + that.buttons[key].setText = function(text){ + button_element.html(text); + }; + that.buttons[key].addClass = function(className){ + button_element.addClass(className); + }; + that.buttons[key].removeClass = function(className){ + button_element.removeClass(className); + }; + that.buttons[key].disable = function(){ + that.buttons[key].isDisabled = true; + button_element.prop('disabled', true); + }; + that.buttons[key].enable = function(){ + that.buttons[key].isDisabled = false; + button_element.prop('disabled', false); + }; + that.buttons[key].show = function(){ + that.buttons[key].isHidden = false; + button_element.css('display', ''); + }; + that.buttons[key].hide = function(){ + that.buttons[key].isHidden = true; + button_element.css('display', 'none'); + }; + /* + Buttons are prefixed with $_ or $$ for quick access + */ + that['$_' + key] = that['$$' + key] = button_element; + that.$btnc.append(button_element); + }); + + if(total_buttons === 0) this.$btnc.hide(); + if(this.closeIcon === null && total_buttons === 0){ + /* + in case when no buttons are present & closeIcon is null, closeIcon is set to true, + set closeIcon to true to explicitly tell to hide the close icon + */ + this.closeIcon = true; + } + + if(this.closeIcon){ + if(this.closeIconClass){ + // user requires a custom class. + var closeHtml = ''; + this.$closeIcon.html(closeHtml); + } + + this.$closeIcon.click(function(e){ + e.preventDefault(); + + var buttonName = false; + var shouldClose = false; + var str; + + if(typeof that.closeIcon === 'function'){ + str = that.closeIcon(); + }else{ + str = that.closeIcon; + } + + if(typeof str === 'string' && typeof that.buttons[str] !== 'undefined'){ + buttonName = str; + shouldClose = false; + }else if(typeof str === 'undefined' || !!(str) === true){ + shouldClose = true; + }else{ + shouldClose = false; + } + if(buttonName){ + var btnResponse = that.buttons[buttonName].action.apply(that); + shouldClose = (typeof btnResponse === 'undefined') || !!(btnResponse); + } + if(shouldClose){ + that.close(); + } + }); + this.$closeIcon.show(); + }else{ + this.$closeIcon.hide(); + } + }, + setTitle: function(string, force){ + force = force || false; + + if(typeof string !== 'undefined') + if(typeof string === 'string') + this.title = string; + else if(typeof string === 'function'){ + if(typeof string.promise === 'function') + console.error('Promise was returned from title function, this is not supported.'); + + var response = string(); + if(typeof response === 'string') + this.title = response; + else + this.title = false; + }else + this.title = false; + + if(this.isAjaxLoading && !force) + return; + + this.$title.html(this.title || ''); + this.updateTitleContainer(); + }, + setIcon: function(iconClass, force){ + force = force || false; + + if(typeof iconClass !== 'undefined') + if(typeof iconClass === 'string') + this.icon = iconClass; + else if(typeof iconClass === 'function'){ + var response = iconClass(); + if(typeof response === 'string') + this.icon = response; + else + this.icon = false; + } + else + this.icon = false; + + if(this.isAjaxLoading && !force) + return; + + this.$icon.html(this.icon ? '' : ''); + this.updateTitleContainer(); + }, + updateTitleContainer: function(){ + if(!this.title && !this.icon){ + this.$titleContainer.hide(); + }else{ + this.$titleContainer.show(); + } + }, + setContentPrepend: function(content, force){ + if(!content) + return; + + this.contentParsed.prepend(content); + }, + setContentAppend: function(content){ + if(!content) + return; + + this.contentParsed.append(content); + }, + setContent: function(content, force){ + force = !!force; + var that = this; + if(content) + this.contentParsed.html('').append(content); + if(this.isAjaxLoading && !force) + return; + + this.$content.html(''); + this.$content.append(this.contentParsed); + setTimeout(function(){ + that.$body.find('input[autofocus]:visible:first').focus(); + }, 100); + }, + loadingSpinner: false, + showLoading: function(disableButtons){ + this.loadingSpinner = true; + this.$jconfirmBox.addClass('loading'); + if(disableButtons) + this.$btnc.find('button').prop('disabled', true); + + }, + hideLoading: function(enableButtons){ + this.loadingSpinner = false; + this.$jconfirmBox.removeClass('loading'); + if(enableButtons) + this.$btnc.find('button').prop('disabled', false); + + }, + ajaxResponse: false, + contentParsed: '', + isAjax: false, + isAjaxLoading: false, + _parseContent: function(){ + var that = this; + var e = ' '; + + if(typeof this.content === 'function'){ + var res = this.content.apply(this); + if(typeof res === 'string'){ + this.content = res; + } + else if(typeof res === 'object' && typeof res.always === 'function'){ + // this is ajax loading via promise + this.isAjax = true; + this.isAjaxLoading = true; + res.always(function(data, status, xhr){ + that.ajaxResponse = { + data: data, + status: status, + xhr: xhr + }; + that._contentReady.resolve(data, status, xhr); + if(typeof that.contentLoaded === 'function') + that.contentLoaded(data, status, xhr); + }); + this.content = e; + }else{ + this.content = e; + } + } + + if(typeof this.content === 'string' && this.content.substr(0, 4).toLowerCase() === 'url:'){ + this.isAjax = true; + this.isAjaxLoading = true; + var u = this.content.substring(4, this.content.length); + $.get(u).done(function(html){ + that.contentParsed.html(html); + }).always(function(data, status, xhr){ + that.ajaxResponse = { + data: data, + status: status, + xhr: xhr + }; + that._contentReady.resolve(data, status, xhr); + if(typeof that.contentLoaded === 'function') + that.contentLoaded(data, status, xhr); + }); + } + + if(!this.content) + this.content = e; + + if(!this.isAjax){ + this.contentParsed.html(this.content); + this.setContent(); + that._contentReady.resolve(); + } + }, + _stopCountDown: function(){ + clearInterval(this.autoCloseInterval); + if(this.$cd) + this.$cd.remove(); + }, + _startCountDown: function(){ + var that = this; + var opt = this.autoClose.split('|'); + if(opt.length !== 2){ + console.error('Invalid option for autoClose. example \'close|10000\''); + return false; + } + + var button_key = opt[0]; + var time = parseInt(opt[1]); + if(typeof this.buttons[button_key] === 'undefined'){ + console.error('Invalid button key \'' + button_key + '\' for autoClose'); + return false; + } + + var seconds = Math.ceil(time / 1000); + this.$cd = $(' (' + seconds + ')') + .appendTo(this['$_' + button_key]); + + this.autoCloseInterval = setInterval(function(){ + that.$cd.html(' (' + (seconds -= 1) + ') '); + if(seconds <= 0){ + that['$$' + button_key].trigger('click'); + that._stopCountDown(); + } + }, 1000); + }, + _getKey: function(key){ + // very necessary keys. + switch(key){ + case 192: + return 'tilde'; + case 13: + return 'enter'; + case 16: + return 'shift'; + case 9: + return 'tab'; + case 20: + return 'capslock'; + case 17: + return 'ctrl'; + case 91: + return 'win'; + case 18: + return 'alt'; + case 27: + return 'esc'; + case 32: + return 'space'; + } + + // only trust alphabets with this. + var initial = String.fromCharCode(key); + if(/^[A-z0-9]+$/.test(initial)) + return initial.toLowerCase(); + else + return false; + }, + reactOnKey: function(e){ + var that = this; + + /* + Prevent keyup event if the dialog is not last! + */ + var a = $('.jconfirm'); + if(a.eq(a.length - 1)[0] !== this.$el[0]) + return false; + + var key = e.which; + /* + Do not react if Enter or Space is pressed on input elements + */ + if(this.$content.find(':input').is(':focus') && /13|32/.test(key)) + return false; + + var keyChar = this._getKey(key); + + // If esc is pressed + if(keyChar === 'esc' && this.escapeKey){ + if(this.escapeKey === true){ + this.$scrollPane.trigger('click'); + } + else if(typeof this.escapeKey === 'string' || typeof this.escapeKey === 'function'){ + var buttonKey; + if(typeof this.escapeKey === 'function'){ + buttonKey = this.escapeKey(); + }else{ + buttonKey = this.escapeKey; + } + + if(buttonKey) + if(typeof this.buttons[buttonKey] === 'undefined'){ + console.warn('Invalid escapeKey, no buttons found with key ' + buttonKey); + }else{ + this['$_' + buttonKey].trigger('click'); + } + } + } + + // check if any button is listening to this key. + $.each(this.buttons, function(key, button){ + if(button.keys.indexOf(keyChar) !== -1){ + that['$_' + key].trigger('click'); + } + }); + }, + setDialogCenter: function(){ + console.info('setDialogCenter is deprecated, dialogs are centered with CSS3 tables'); + }, + _unwatchContent: function(){ + clearInterval(this._timer); + }, + close: function(onClosePayload){ + var that = this; + + if(typeof this.onClose === 'function') + this.onClose(onClosePayload); + + this._unwatchContent(); + + /* + unbind the window resize & keyup event. + */ + $(window).unbind('resize.' + this._id); + $(window).unbind('keyup.' + this._id); + $(window).unbind('jcKeyDown.' + this._id); + + if(this.draggable){ + $(window).unbind('mousemove.' + this._id); + $(window).unbind('mouseup.' + this._id); + this.$titleContainer.unbind('mousedown'); + } + + that.$el.removeClass(that.loadedClass); + $('body').removeClass('jconfirm-no-scroll-' + that._id); + that.$jconfirmBoxContainer.removeClass('jconfirm-no-transition'); + + setTimeout(function(){ + that.$body.addClass(that.closeAnimationParsed); + that.$jconfirmBg.addClass('jconfirm-bg-h'); + var closeTimer = (that.closeAnimation === 'none') ? 1 : that.animationSpeed; + + setTimeout(function(){ + that.$el.remove(); + + var l = w.jconfirm.instances; + var i = w.jconfirm.instances.length - 1; + for(i; i >= 0; i--){ + if(w.jconfirm.instances[i]._id === that._id){ + w.jconfirm.instances.splice(i, 1); + } + } + + // Focusing a element, scrolls automatically to that element. + // no instances should be open, lastFocused should be true, the lastFocused element must exists in DOM + if(!w.jconfirm.instances.length){ + if(that.scrollToPreviousElement && w.jconfirm.lastFocused && w.jconfirm.lastFocused.length && $.contains(document, w.jconfirm.lastFocused[0])){ + var $lf = w.jconfirm.lastFocused; + if(that.scrollToPreviousElementAnimate){ + var st = $(window).scrollTop(); + var ot = w.jconfirm.lastFocused.offset().top; + var wh = $(window).height(); + if(!(ot > st && ot < (st + wh))){ + var scrollTo = (ot - Math.round((wh / 3))); + $('html, body').animate({ + scrollTop: scrollTo + }, that.animationSpeed, 'swing', function(){ + // gracefully scroll and then focus. + $lf.focus(); + }); + }else{ + // the element to be focused is already in view. + $lf.focus(); + } + }else{ + $lf.focus(); + } + w.jconfirm.lastFocused = false; + } + } + + if(typeof that.onDestroy === 'function') + that.onDestroy(); + + }, closeTimer * 0.40); + }, 50); + + return true; + }, + open: function(){ + if(this.isOpen()) + return false; + + // var that = this; + this._buildHTML(); + this._bindEvents(); + this._open(); + + return true; + }, + setStartingPoint: function(){ + var el = false; + + if(this.animateFromElement !== true && this.animateFromElement){ + el = this.animateFromElement; + w.jconfirm.lastClicked = false; + }else if(w.jconfirm.lastClicked && this.animateFromElement === true){ + el = w.jconfirm.lastClicked; + w.jconfirm.lastClicked = false; + }else{ + return false; + } + + if(!el) + return false; + + var offset = el.offset(); + + var iTop = el.outerHeight() / 2; + var iLeft = el.outerWidth() / 2; + + // placing position of jconfirm modal in center of clicked element + iTop -= this.$jconfirmBox.outerHeight() / 2; + iLeft -= this.$jconfirmBox.outerWidth() / 2; + + // absolute position on screen + var sourceTop = offset.top + iTop; + sourceTop = sourceTop - this._scrollTop(); + var sourceLeft = offset.left + iLeft; + + // window halved + var wh = $(window).height() / 2; + var ww = $(window).width() / 2; + + var targetH = wh - this.$jconfirmBox.outerHeight() / 2; + var targetW = ww - this.$jconfirmBox.outerWidth() / 2; + + sourceTop -= targetH; + sourceLeft -= targetW; + + // Check if the element is inside the viewable window. + if(Math.abs(sourceTop) > wh || Math.abs(sourceLeft) > ww) + return false; + + this.$jconfirmBoxContainer.css('transform', 'translate(' + sourceLeft + 'px, ' + sourceTop + 'px)'); + }, + _open: function(){ + var that = this; + if(typeof that.onOpenBefore === 'function') + that.onOpenBefore(); + + this.$body.removeClass(this.animationParsed); + this.$jconfirmBg.removeClass('jconfirm-bg-h'); + this.$body.focus(); + + that.$jconfirmBoxContainer.css('transform', 'translate(' + 0 + 'px, ' + 0 + 'px)'); + + setTimeout(function(){ + that.$body.css(that._getCSS(that.animationSpeed, 1)); + that.$body.css({ + 'transition-property': that.$body.css('transition-property') + ', margin' + }); + that.$jconfirmBoxContainer.addClass('jconfirm-no-transition'); + that._modalReady.resolve(); + if(typeof that.onOpen === 'function') + that.onOpen(); + + that.$el.addClass(that.loadedClass); + }, this.animationSpeed); + }, + loadedClass: 'jconfirm-open', + isClosed: function(){ + return !this.$el || this.$el.parent().length === 0; + }, + isOpen: function(){ + return !this.isClosed(); + }, + toggle: function(){ + if(!this.isOpen()) + this.open(); + else + this.close(); + } + }; + + w.jconfirm.instances = []; + w.jconfirm.lastFocused = false; + w.jconfirm.pluginDefaults = { + template: '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
', + title: 'Hello', + titleClass: '', + type: 'default', + typeAnimated: true, + draggable: true, + dragWindowGap: 15, + dragWindowBorder: true, + animateFromElement: true, + /** + * @deprecated + */ + alignMiddle: true, + smoothContent: true, + content: 'Are you sure to continue?', + buttons: {}, + defaultButtons: { + ok: { + action: function(){ + } + }, + close: { + action: function(){ + } + } + }, + contentLoaded: function(){ + }, + icon: '', + lazyOpen: false, + bgOpacity: null, + theme: 'light', + animation: 'scale', + closeAnimation: 'scale', + animationSpeed: 400, + animationBounce: 1, + escapeKey: true, + rtl: false, + container: 'body', + containerFluid: false, + backgroundDismiss: false, + backgroundDismissAnimation: 'shake', + autoClose: false, + closeIcon: null, + closeIconClass: false, + watchInterval: 100, + columnClass: 'col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1', + boxWidth: '50%', + scrollToPreviousElement: true, + scrollToPreviousElementAnimate: true, + useBootstrap: true, + offsetTop: 40, + offsetBottom: 40, + bootstrapClasses: { + container: 'container', + containerFluid: 'container-fluid', + row: 'row' + }, + onContentReady: function(){ + + }, + onOpenBefore: function(){ + + }, + onOpen: function(){ + + }, + onClose: function(){ + + }, + onDestroy: function(){ + + }, + onAction: function(){ + + } + }; + + /** + * This refers to the issue #241 and #246 + * + * Problem: + * Button A is clicked (keydown) using the Keyboard ENTER key + * A opens the jconfirm modal B, + * B has registered ENTER key for one of its button C + * A is released (keyup), B gets the keyup event and triggers C. + * + * Solution: + * Register a global keydown event, that tells jconfirm if the keydown originated inside jconfirm + */ + var keyDown = false; + $(window).on('keydown', function(e){ + if(!keyDown){ + var $target = $(e.target); + var pass = false; + if($target.closest('.jconfirm-box').length) + pass = true; + if(pass) + $(window).trigger('jcKeyDown'); + + keyDown = true; + } + }); + $(window).on('keyup', function(){ + keyDown = false; + }); + w.jconfirm.lastClicked = false; + $(document).on('mousedown', 'button, a, [jc-source]', function(){ + w.jconfirm.lastClicked = $(this); + }); +})); From 7490b21ab82ad96c046fc79f157eebdb20f304ed Mon Sep 17 00:00:00 2001 From: Rupesh Maharjan Date: Fri, 25 Oct 2019 15:08:48 +1100 Subject: [PATCH 2/2] Adding confirm dialog js --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 612eb81..b721ade 100644 --- a/index.html +++ b/index.html @@ -30,7 +30,6 @@ } - @@ -71,6 +70,7 @@

Cookie Manager

Developed by Vinit Shahdeo

+