| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379 |
- /*!
- * 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 = $('<button type="button" class="btn"></button>')
- .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 = '<i class="' + this.closeIconClass + '"></i>';
- 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 ? '<i class="' + this.icon + '"></i>' : '');
- 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 = $('<span class="countdown"> (' + seconds + ')</span>')
- .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: '' +
- '<div class="jconfirm">' +
- '<div class="jconfirm-bg jconfirm-bg-h"></div>' +
- '<div class="jconfirm-scrollpane">' +
- '<div class="jconfirm-row">' +
- '<div class="jconfirm-cell">' +
- '<div class="jconfirm-holder">' +
- '<div class="jc-bs3-container">' +
- '<div class="jc-bs3-row">' +
- '<div class="jconfirm-box-container jconfirm-animated">' +
- '<div class="jconfirm-box" role="dialog" aria-labelledby="labelled" tabindex="-1">' +
- '<div class="jconfirm-closeIcon">×</div>' +
- '<div class="jconfirm-title-c">' +
- '<span class="jconfirm-icon-c"></span>' +
- '<span class="jconfirm-title"></span>' +
- '</div>' +
- '<div class="jconfirm-content-pane">' +
- '<div class="jconfirm-content"></div>' +
- '</div>' +
- '<div class="jconfirm-buttons">' +
- '</div>' +
- '<div class="jconfirm-clear">' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div></div>',
- 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);
- });
- }));
|