( function ( window ) { 'use strict'; var NOT_DISABLED_NOT_RESET = ':not(:disabled):not(.ajs-reset)'; /** * Keys enum * @type {Object} */ var keys = { ENTER: 13, ESC: 27, F1: 112, F12: 123, LEFT: 37, RIGHT: 39, TAB: 9 }; /** * Default options * @type {Object} */ var defaults = { autoReset:true, basic:false, closable:true, closableByDimmer:true, invokeOnCloseOff:false, frameless:false, defaultFocusOff:false, maintainFocus:true, //global default not per instance, applies to all dialogs maximizable:true, modal:true, movable:true, moveBounded:false, overflow:true, padding: true, pinnable:true, pinned:true, preventBodyShift:false, //global default not per instance, applies to all dialogs resizable:true, startMaximized:false, transition:'pulse', transitionOff:false, tabbable:['button', '[href]', 'input', 'select', 'textarea', '[tabindex]:not([tabindex^="-"])'+NOT_DISABLED_NOT_RESET].join(NOT_DISABLED_NOT_RESET+','),//global notifier:{ delay:5, position:'bottom-right', closeButton:false, classes: { base: 'alertify-notifier', prefix:'ajs-', message: 'ajs-message', top: 'ajs-top', right: 'ajs-right', bottom: 'ajs-bottom', left: 'ajs-left', center: 'ajs-center', visible: 'ajs-visible', hidden: 'ajs-hidden', close: 'ajs-close' } }, glossary:{ title:'AlertifyJS', ok: 'OK', cancel: 'Cancel', acccpt: 'Accept', deny: 'Deny', confirm: 'Confirm', decline: 'Decline', close: 'Close', maximize: 'Maximize', restore: 'Restore', }, theme:{ input:'ajs-input', ok:'ajs-ok', cancel:'ajs-cancel', }, hooks:{ preinit:function(){}, postinit:function(){} } }; //holds open dialogs instances var openDialogs = []; /** * [Helper] Adds the specified class(es) to the element. * * @element {node} The element * @className {string} One or more space-separated classes to be added to the class attribute of the element. * * @return {undefined} */ function addClass(element,classNames){ element.className += ' ' + classNames; } /** * [Helper] Removes the specified class(es) from the element. * * @element {node} The element * @className {string} One or more space-separated classes to be removed from the class attribute of the element. * * @return {undefined} */ function removeClass(element, classNames) { var original = element.className.split(' '); var toBeRemoved = classNames.split(' '); for (var x = 0; x < toBeRemoved.length; x += 1) { var index = original.indexOf(toBeRemoved[x]); if (index > -1){ original.splice(index,1); } } element.className = original.join(' '); } /** * [Helper] Checks if the document is RTL * * @return {Boolean} True if the document is RTL, false otherwise. */ function isRightToLeft(){ return window.getComputedStyle(document.body).direction === 'rtl'; } /** * [Helper] Get the document current scrollTop * * @return {Number} current document scrollTop value */ function getScrollTop(){ return ((document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop); } /** * [Helper] Get the document current scrollLeft * * @return {Number} current document scrollLeft value */ function getScrollLeft(){ return ((document.documentElement && document.documentElement.scrollLeft) || document.body.scrollLeft); } /** * Helper: clear contents * */ function clearContents(element){ while (element.lastChild) { element.removeChild(element.lastChild); } } /** * detects strings, checks for both string and String instances * this is unlike typeof(x) === 'string' which only accepts primitive strings * */ function isString(thing) { return Object.prototype.toString.call(thing) === '[object String]'; } /** * Extends a given prototype by merging properties from base into sub. * * @sub {Object} sub The prototype being overwritten. * @base {Object} base The prototype being written. * * @return {Object} The extended prototype. */ function copy(src) { if(null === src){ return src; } var cpy; if(Array.isArray(src)){ cpy = []; for(var x=0;x