| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903 | //--------------------------------------------------------------------------// HEADSUP!// Please be sure to re-run gulp again if you do not see the config changes//--------------------------------------------------------------------------var myapp_config = {	/*	APP VERSION	*/	VERSION: '4.0.2',	/*	SAVE INSTANCE REFERENCE	Save a reference to the global object (window in the browser)	*/	root_: $('body'), // used for core app reference	root_logo: $('.page-sidebar > .page-logo'), // used for core app reference	/*	DELAY VAR FOR FIRING REPEATED EVENTS (eg., scroll & resize events)	Lowering the variable makes faster response time but taxing on the CPU	Reference: http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/	*/	throttleDelay: 450, // for window.scrolling & window.resizing	filterDelay: 150,   // for keyup.functions 	/*	DETECT MOBILE DEVICES	Description: Detects mobile device - if any of the listed device is 	detected a class is inserted to $.root_ and the variable thisDevice 	is decleard. (so far this is covering most hand held devices)	*/	thisDevice: null, // desktop or mobile	isMobile: (/iphone|ipad|ipod|android|blackberry|mini|windows\sce|palm/i.test(navigator.userAgent.toLowerCase())), //popular device types available on the market	mobileMenuTrigger: null, // used by pagescrolling and appHeight script, do not change!	mobileResolutionTrigger: 992, //the resolution when the mobile activation fires	/*	DETECT IF WEBKIT	Description: this variable is used to fire the custom scroll plugin. 	If it is a non-webkit it will fire the plugin.	*/	isWebkit: ((!!window.chrome && !!window.chrome.webstore) === true || Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 === true),	/*	DETECT CHROME	Description: this variable is used to fire the custom CSS hacks	*/	isChrome: (/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())),	/*	DETECT IE (it only detects the newer versions of IE)	Description: this variable is used to fire the custom CSS hacks	*/	isIE: ( (window.navigator.userAgent.indexOf('Trident/') ) > 0 === true ),	/*	DEBUGGING MODE	debugState = true; will spit all debuging message inside browser console.	*/	debugState: true, // outputs debug information on browser console	/*	Turn on ripple effect for buttons and touch events	Dependency: 	*/	rippleEffect: true, // material design effect that appears on all buttons	/*	Primary theme anchor point ID	This anchor is created dynamically and CSS is loaded as an override theme	*/	mythemeAnchor: '#mytheme',	/*	Primary menu anchor point #js-primary-nav	This is the root anchor point where the menu script will begin its build	*/	navAnchor: $('#js-primary-nav'), //changing this may implicate slimscroll plugin target	navHooks: $('#js-nav-menu'), //changing this may implicate CSS targets	navAccordion: true, //nav item when one is expanded the other closes	navInitalized: 'js-nav-built', //nav finished class 	navFilterInput: $('#nav_filter_input'), //changing this may implicate CSS targets	navHorizontalWrapperId: 'js-nav-menu-wrapper',	/*	The rate at which the menu expands revealing child elements on click	Lower rate reels faster expansion of nav childs	*/	navSpeed: 500, //ms	/*	Color profile reference hook (needed for getting CSS value for theme colors in charts and various graphs)	*/	mythemeColorProfileID: $('#js-color-profile'),	/*	Nav close and open signs	This uses the fontawesome css class	*/	navClosedSign: 'fal fa-angle-down',	navOpenedSign: 'fal fa-angle-up',	/*	App date ID	found inside the breadcrumb unit, displays current date to the app on pageload	*/	appDateHook: $('.js-get-date'),	/*	* SaveSettings to localStorage	* DOC: to store settings to a DB instead of LocalStorage see below:	*    initApp.pushSettings("className1 className2") //sets value	*    var DB_string = initApp.getSettings(); //returns setting string	*/	storeLocally: true,	/*	* Used with initApp.loadScripts	* DOC: Please leave it blank	*/	jsArray : []}; /*! * jQuery app.navigation v1.0.0 * * Copyright 2019, 2020 SmartAdmin WebApp * Released under Marketplace License (see your license details for usage) * * Publish Date: 2018-01-01T17:42Z */(function($) {	/**	 * Menu Plugin	 **/	$.fn.extend({		/**		 * pass the options variable to the function		 *		 *   $(id).navigation({ 		 *       accordion: true,		 *       animate: 'easeOutExpo',		 *       speed: 200,		 *       closedSign: '[+]',		 *       openedSign: '[-]',		 *       initClass: 'js-nav-built'		 *   });		 *		 **/	     	    navigation: function(options) {	        var defaults = {					accordion: true,					animate: 'easeOutExpo',					speed: 200,					closedSign: '[+]',					openedSign: '[-]',					initClass: 'js-nav-built'	            },	            /**	             * extend our default options with those provided.	             **/	            opts = $.extend(defaults, options),	            /**	             * assign current element to variable, in this case is UL element	             **/	            self = $(this);				if (!self.hasClass(opts.initClass)) {				    /**				     * confirm build to prevent rebuild error				     **/				    self.addClass(opts.initClass);				    /**				     * add a mark [+] to a multilevel menu				     **/				    self.find("li").each(function() {				        if ($(this).find("ul").length !== 0) {				            /**				             * add the multilevel sign next to the link				             **/				            $(this).find("a:first").append("<b class='collapse-sign'>" + opts.closedSign + "</b>");				            /**				             * avoid jumping to the top of the page when the href is an #				             **/				            if ($(this).find("a:first").attr('href') == "#") {				                $(this).find("a:first").click(function() {				                    return false;				                });				            }				        }				    });				    /**				     * add open sign to all active lists				     **/				    self.find("li.active").each(function() {				        $(this).parents("ul")				        	.parent("li")				        	.find("a:first")				        	.attr('aria-expanded', true)				        	.find("b:first")				        	.html(opts.openedSign);				    });				    /**				     * click events				     **/				    self.find("li a").on('mousedown', function(e) {				        if ($(this).parent().find("ul").length !== 0) {				            if (opts.accordion) {				                /**				                 * do nothing when the list is open				                 **/				                if (!$(this).parent().find("ul").is(':visible')) {				                    parents = $(this).parent().parents("ul");				                    visible = self.find("ul:visible");				                    visible.each(function(visibleIndex) {				                        var close = true;				                        parents.each(function(parentIndex) {				                            if (parents[parentIndex] == visible[visibleIndex]) {				                                close = false;				                                return false;				                            }				                        });				                        if (close) {				                            if ($(this).parent().find("ul") != visible[visibleIndex]) {				                                $(visible[visibleIndex]).slideUp(opts.speed + 300, opts.animate, function() {				                                    $(this).parent("li")				                                    	.removeClass("open")				                                    	.find("a:first")				                                    	.attr('aria-expanded', false)				                                    	.find("b:first")				                                    	.html(opts.closedSign);				                                    if (myapp_config.debugState)				                                        console.log("nav item closed")    				                                });				                            }				                        }				                    });				                }				            }				            /**				             * Add active class to open element				             **/				            if ($(this).parent().find("ul:first").is(":visible") && !$(this).parent().find("ul:first").hasClass("active")) {				                $(this).parent().find("ul:first").slideUp(opts.speed + 100, opts.animate, function() {				                    $(this).parent("li")				                    	.removeClass("open")				                    	.find("a:first")				                    	.attr('aria-expanded', false)				                    	.find("b:first").delay(opts.speed)				                    	.html(opts.closedSign);  				                    if (myapp_config.debugState)				                        console.log("nav item closed")				                });				            } else {				                $(this).parent().find("ul:first").slideDown(opts.speed, opts.animate, function() {				                    $(this).parent("li")				                    	.addClass("open")				                    	.find("a:first")				                    	.attr('aria-expanded', true)				                    	.find("b:first").delay(opts.speed)				                    	.html(opts.openedSign);				                    if (myapp_config.debugState)				                        console.log("nav item opened");				                });				            }				        }				    });    				} else {				    				    if (myapp_config.debugState)				        console.log(self.get(0) + " this menu already exists");       				}	    },	    /**	     * DOC: $(id).destroy();	     **/	    navigationDestroy: function() {	        			self = $(this);			if (self.hasClass(myapp_config.navInitalized)) {			    self.find("li").removeClass("active open");			    self.find("li a").off('mousedown').removeClass("active").removeAttr("aria-expanded").find(".collapse-sign").remove();			    self.removeClass(myapp_config.navInitalized).find("ul").removeAttr("style");			    if (myapp_config.debugState)			        console.log( self.get(0) + " destroyed");     			} else {			    console.log("menu does not exist")			}	        	    }	}); })(jQuery, window, document); /*! * jQuery menuSlider v1.0.0 * * Copyright 2019, 2020 SmartAdmin WebApp * Released under Marketplace License (see your license details for usage) * * Publish Date: 2019-01-01T17:42Z */;(function($) {    var pluginName = 'menuSlider';    function Plugin(element, options) {        var $el = $(element),             el = element;        options = $.extend({}, $.fn[pluginName].defaults, options);        function init() {            /* reset margin */            $el.css('margin-left', '0px');            /* add wrapper around navigation */            $el.wrap( '<div id="'+options.wrapperId+'" class="nav-menu-wrapper d-flex flex-grow-1 width-0 overflow-hidden"></div>' );            /* add buttons for scroller */            $('#' + options.wrapperId).before('<a href="#" id="' + options.wrapperId + '-left-btn" class="d-flex align-items-center justify-content-center width-4 btn mt-1 mb-1 mr-2 ml-1 p-0 fs-xxl text-primary"><i class="fal fa-angle-left"></i></a>');            $('#' + options.wrapperId).after('<a href="#" id="' + options.wrapperId + '-right-btn" class="d-flex align-items-center justify-content-center width-4 btn mt-1 mb-1 mr-1 ml-2 p-0 fs-xxl text-primary"><i class="fal fa-angle-right"></i></a>');            var getListWidth = $.map($el.children('li:not(.nav-title)'),function(val){ return $(val).outerWidth(true);}),                /* define variables */                wrapperWidth,                currentMarginLeft,                contentWidth,                               setMargin,                maxMargin,                /* update variables for margin calculations */                _getValues = function() {                    wrapperWidth = $('#' + options.wrapperId).outerWidth(); /* incase its changed we get it again */                    contentWidth = $.map( $el.children('li:not(.nav-title)'), function(val){ return $(val).outerWidth(true); }).reduce(function(a, b) { return a + b; }, 0);                    currentMarginLeft = parseFloat($el.css('margin-left'));                    /*console.log("got new values");                    console.log("wrapperWidth :" + wrapperWidth);                    console.log("contentWidth :" + contentWidth);                    console.log("currentMarginLeft :" + currentMarginLeft);*/                },                /* scroll right */                navMenuScrollRight = function() {                    _getValues();                    if (-currentMarginLeft + wrapperWidth < contentWidth) {                        setMargin = Math.max(currentMarginLeft - wrapperWidth, -(contentWidth - wrapperWidth) );                    } else {                        setMargin = currentMarginLeft;                        console.log("right end");                    }                    $el.css({                        marginLeft: setMargin                    });                },                /* scroll left */                navMenuScrollLeft = function() {                    _getValues();                    if (currentMarginLeft < 0) {                        setMargin = Math.min(currentMarginLeft + wrapperWidth, 0);                    } else {                        setMargin = currentMarginLeft;                        console.log("left end");                    }                    $el.css({                        marginLeft: setMargin                    });                };            /* assign buttons for right*/            $('#' + options.wrapperId + '-left-btn').click(function(e) {                navMenuScrollLeft();                e.preventDefault();            });            /* assign buttons for left */             $('#' + options.wrapperId + '-right-btn').click(function(e) {                navMenuScrollRight();                e.preventDefault();            });            hook('onInit');        }        function option(key, val) {            if (val) {                options[key] = val;            } else {                return options[key];            }        }        function destroy(options) {            $el.each(function() {                var el = this;                var $el = $(this);                // Add code to restore the element to its original state...                $el.css('margin-left', '0px');                                           $el.unwrap(parent);                $el.prev().off().remove();                $el.next().off().remove();                hook('onDestroy');                $el.removeData('plugin_' + pluginName);            });        }        function hook(hookName) {            if (options[hookName] !== undefined) {                options[hookName].call(el);            }        }        init();        return {            option: option,            destroy: destroy        };    }    $.fn[pluginName] = function(options) {        if (typeof arguments[0] === 'string') {            var methodName = arguments[0];            var args = Array.prototype.slice.call(arguments, 1);            var returnVal;            this.each(function() {                if ($.data(this, 'plugin_' + pluginName) && typeof $.data(this, 'plugin_' + pluginName)[methodName] === 'function') {                    returnVal = $.data(this, 'plugin_' + pluginName)[methodName].apply(this, args);                } else {                    throw new Error('Method ' + methodName + ' does not exist on jQuery.' + pluginName);                }            });            if (returnVal !== undefined) {                return returnVal;            } else {                return this;            }        } else if (typeof options === "object" || !options) {            return this.each(function() {                if (!$.data(this, 'plugin_' + pluginName)) {                    $.data(this, 'plugin_' + pluginName, new Plugin(this, options));                }            });        }    };    $.fn[pluginName].defaults = {        onInit: function() {},        onDestroy: function() {},        element: myapp_config.navHooks,        wrapperId: myapp_config.navHorizontalWrapperId    };})(jQuery); /*! * jQuery SmartAdmin v4.0.0 * * Copyright 2019, 2020 SmartAdmin WebApp * Released under Marketplace License (see your license details for usage) * * Publish Date: 2019-01-01T17:42Z */var initApp = (function(app) {	/**	 * List filter 	 * DOC: searches list items, it could be UL or DIV elements	 * usage: initApp.listFilter($('.list'), $('#intput-id'));	 *        inside the .list you will need to insert 'data-filter-tags' inside <a>	 * @param  list	 * @param  input 	 * @param  anchor	 * @return 	 */	app.listFilter = function (list, input, anchor) {		/* add class to filter hide/show */		if (anchor) {			$(anchor).addClass('js-list-filter');		} else {			$(list).addClass('js-list-filter');		}		/* on change keyboard */		$(input).change( function () {			var filter = $(this).val().toLowerCase(),				listPrev = $(list).next().filter('.js-filter-message');				/* when user types more than 1 letter start search filter */			if(filter.length > 1) {				/* this finds all data-filter-tags in a list that contain the input val,				   hiding the ones not containing the input while showing the ones that do */								/* (1) hide all that does not match */   				$(list).find($("[data-filter-tags]:not([data-filter-tags*='" + filter + "'])"))					.parentsUntil(list).removeClass('js-filter-show')					.addClass('js-filter-hide');				/* (2) hide all that does match */					$(list).find($("[data-filter-tags*='" + filter + "']"))					.parentsUntil(list).removeClass('js-filter-hide')					.addClass('js-filter-show');				/* if element exists then print results */					if (listPrev){						listPrev.text("showing " + $(list).find('li.js-filter-show').length + " from " + $(list).find('[data-filter-tags]').length + " total");				}			} else {				/* when filter length is blank reset the classes */				$(list).find('[data-filter-tags]').parentsUntil(list).removeClass('js-filter-hide js-filter-show');				/* if element exists reset print results */				if (listPrev){					listPrev.text("");				}			} 			return false;		}).keyup( $.debounce( myapp_config.filterDelay, function (e) {			/* fire the above change event after every letter is typed with a delay of 250ms */			$(this).change();			/*if(e.keyCode == 13) {				console.log( $(list).find(".filter-show:not(.filter-hide) > a") );			}*/		}));	};	/**	 * Load scripts using lazyload method 	 * usage: initApp.loadScript("js/my_lovely_script.js", myFunction);	 * @param  {[type]}   scriptName	 * @param  {Function} callback  	 * @return {[type]}             	 */	app.loadScript = function (scriptName, callback) {		if (!myapp_config.jsArray[scriptName]) {				var promise = jQuery.Deferred();			/* adding the script tag to the head as suggested before */			var body = document.getElementsByTagName('body')[0],				script = document.createElement('script');				script.type = 'text/javascript';				script.src = scriptName;			/* then bind the event to the callback function			   there are several events for cross browser compatibility */			script.onload = function() {				promise.resolve();			};			/* fire the loading */			body.appendChild(script);			myapp_config.jsArray[scriptName] = promise.promise();		}			else if (myapp_config.debugState)			console.log("This script was already loaded: " + scriptName);		myapp_config.jsArray[scriptName].then(function () {			if(typeof callback === 'function') {				callback();			}		});	};	/**	 * Javascript Animation for save settings 	 * @return	 **/	app.saveSettings = function () {		/* if saveSettings function exists */				if (typeof saveSettings !== 'undefined' && $.isFunction(saveSettings) && myapp_config.storeLocally) {			/* call accessIndicator animation */			initApp.accessIndicator();			/* call saveSettings function from myapp_config.root_ (HTML) */			saveSettings();			if (myapp_config.debugState)				console.log('Theme settings: ' + '\n' +localStorage.getItem('themeSettings'));		} else {			console.log("save function does not exist");		}			};	/**	 * Reset settings 	 * DOC: removes all classes from root_ then saves	 * @return {[type]}	 **/	app.resetSettings = function () {		/* remove all setting classes nav|header|mod|display */		myapp_config.root_.removeClass (function (index, className) {			return (className.match (/(^|\s)(nav-|header-|mod-|display-)\S+/g) || []).join(' ');		});		/* detach custom css skin */		$(myapp_config.mythemeAnchor).attr('href', "");		/* check non-conflicting plugins */		initApp.checkNavigationOrientation();		/* save settings if "storeLocally == true" */		initApp.saveSettings();		if (myapp_config.debugState)			console.log("App reset successful");	};	/**	 * Factory Reset 	 * DOC: Resets all of localstorage	 * @return {[type]}	 **/	app.factoryReset = function () {		//backdrop sound		initApp.playSound('media/sound', 'messagebox');		//hide settings modal to bootstrap avoid modal bug		$('.js-modal-settings').modal('hide');		if (typeof bootbox  != 'undefined') {			bootbox.confirm({				title: "<i class='fal fa-exclamation-triangle text-warning mr-2'></i> You are about to reset all of your localStorage settings",				message: "<span><strong>Warning:</strong> This action is not reversable. You will lose all your layout settings.</span>",				centerVertical: true,				swapButtonOrder: true,				buttons: {					confirm: {						label: 'Factory Reset',						className: 'btn-warning shadow-0'					},					cancel: {						label: 'Cancel',						className: 'btn-success'					}				},				className: "modal-alert",				closeButton: false,				callback: function (result) {					if (result == true) {						//close panel 						localStorage.clear();						initApp.resetSettings();						location.reload();					}				}			});		} else {			if (confirm( 'You are about to reset all of your localStorage to null state. Do you wish to continue?' )) {				localStorage.clear();				initApp.resetSettings();				location.reload();			}		}						//e.preventDefault();		if (myapp_config.debugState)			console.log("App reset successful");	};	/**	 * Access Indicator	 * DOC: spinning icon that appears whenever you	 * access localstorage or change settings	 * @return {[type]}	 **/	app.accessIndicator = function () {		myapp_config.root_.addClass('saving').delay(600).queue(function(){			$(this).removeClass('saving').dequeue();			return true;		});	};	/*	 * usage: initApp.pushSettings("className1 className2")	 * save settings to localstorage: initApp.pushSettings("className1 className2", true)	 * DOC: pushSettings will also auto save to localStorage if "storeLocally == true" 	 * we will use this "pushSettings" when loading settings from a database	 * @param  {[type]} DB_string   	 * @param  {[type]} saveToLocal	 * @return {[type]}            	 */	app.pushSettings = function (DB_string, saveToLocal) {		/* clear localstorage variable 'themeSettings' */		if (saveToLocal != false)		localStorage.setItem("themeSettings", "");		/* replace classes from <body> with fetched DB string */		myapp_config.root_.addClass(DB_string); //ommited .removeClass()		/* destroy or enable slimscroll */		initApp.checkNavigationOrientation();		/* save settings if "storeLocally == true" && "saveToLocal is true" */		if (saveToLocal != false)		initApp.saveSettings();		/* return string */		return DB_string;	};	/*	 * usage: var DB_string = initApp.getSettings();	 * we will use this "getSettings" when storing settings to a database	 * @return {[type]}	 */	app.getSettings = function () {		return myapp_config.root_.attr('class').split(/[^\w-]+/).filter(function(item) {			return /^(nav|header|mod|display)-/i.test(item);		}).join(' ');	};	/*	 * Play Sounds	 * usage: initApp.playSound(path, sound);	 * @param  {[string]} path 	 * @param  {[string]} sound 	 */	app.playSound = function(path, sound) {		var audioElement = document.createElement('audio');		if (navigator.userAgent.match('Firefox/'))			audioElement.setAttribute('src', path + "/" + sound + '.ogg');		else			audioElement.setAttribute('src', path + "/" + sound + '.mp3');		//$.get();// <-- ??		audioElement.addEventListener("load", function () {			audioElement.play();		}, true);		audioElement.pause();		audioElement.play();	}	/*	 * Checks and sets active settings selections	 * DOC: ?	 */	/*app.indicateSelections = function () {		var classNames = initApp.getSettings()			.split(' ')			.map(function(c) {				return '[data-class="' +  c + '"].js-indicateSelections';			})			.join(',');		$('[data-class].active.js-indicateSelections').removeClass('active');		$(classNames).addClass('active');		if (myapp_config.debugState)			console.log(classNames);	}*/	/**	 * detect browser type	 * DOC: detect if browser supports webkit CSS	 * @return {[type]}	 **/	app.detectBrowserType = function () {		/* safari, chrome or IE detect */			if(myapp_config.isChrome){			myapp_config.root_.addClass('chrome webkit');			return 'chrome webkit';		} else if (myapp_config.isWebkit) {			myapp_config.root_.addClass('webkit');			return 'webkit';		} else if (myapp_config.isIE) {			myapp_config.root_.addClass('ie');			return 'ie';		}	};	/**	 * Add device type	 * DOC: Detect if mobile or desktop	 **/			app.addDeviceType = function() {				if (!myapp_config.isMobile) {			/* desktop */				myapp_config.root_.addClass('desktop');			myapp_config.thisDevice = 'desktop';		} else {			/* mobile */			myapp_config.root_.addClass('mobile');			myapp_config.thisDevice = 'mobile';			 		}		return myapp_config.thisDevice;			};	/**	 * Fix logo position on .header-function-fixed & .nav-function-hidden	 * DOC: Counters browser bug for fixed position and overflow:hidden for the logo (firefox/IE/Safari)	 *      Will not fire for webkit devices or Chrome as its not needed	 * @return {[type]}     	 **/	 app.windowScrollEvents = function () {		if ( myapp_config.root_.is('.nav-function-hidden.header-function-fixed:not(.nav-function-top)') &&  myapp_config.thisDevice === 'desktop') {			myapp_config.root_logo.css({				'top': $(window).scrollTop()			});		} else if ( myapp_config.root_.is('.header-function-fixed:not(.nav-function-top):not(.nav-function-hidden)') &&  myapp_config.thisDevice === 'desktop') {			myapp_config.root_logo.attr("style", "");		}	 };	/**	 * checkNavigationOrientation by checking layout conditions	 * DOC: sometimes settings can trigger certain plugins; so we check this condition and activate accordingly	 * E.g: the fixed navigation activates custom scroll plugin for the navigation, but this only happens when	 *		it detects desktop browser and destroys the plugin when navigation is on top or if its not fixed.	 * @return {[type]}			 **/	 app.checkNavigationOrientation = function() {		/**		 * DOC: add the plugin with the following rules: fixed navigation is selected, top navigation is not active, minify nav is not active, 		 * and the device is desktop. We do not need to activate the plugin when loading from a mobile phone as it is not needed for touch screens.		 **/		switch ( true ) {			case ( myapp_config.root_.hasClass('nav-function-fixed') && !myapp_config.root_.is('.nav-function-top, .nav-function-minify, .mod-main-boxed') && myapp_config.thisDevice === 'desktop' ):				/* start slimscroll on nav */				if ( typeof $.fn.slimScroll !== 'undefined' ) {					myapp_config.navAnchor.slimScroll({						height: '100%',						color: '#fff',						size: '4px',						distance: '4px',						railOpacity: 0.4,						wheelStep: 10					});					if ( document.getElementById(myapp_config.navHorizontalWrapperId) ) {						myapp_config.navHooks.menuSlider('destroy');												if (myapp_config.debugState)						console.log("----top controls destroyed");					}					if (myapp_config.debugState)					console.log("slimScroll created");				} else {					console.log("$.fn.slimScroll...NOT FOUND");				}					break;						case ( myapp_config.navAnchor.parent().hasClass('slimScrollDiv') && myapp_config.thisDevice === 'desktop' && typeof $.fn.slimScroll !== 'undefined' ):				/* destroy the plugin if it is in violation of rules above */				myapp_config.navAnchor.slimScroll({ destroy: true });				myapp_config.navAnchor.attr('style', '');				/* clear event listners (IE bug) */				events = jQuery._data( myapp_config.navAnchor[0], "events" );				if (events) 					jQuery._removeData( myapp_config.navAnchor[0], "events" );				if (myapp_config.debugState)					console.log("slimScroll destroyed");				break;							}		switch ( true ) {			/* fires when user switches to nav-function-top on desktop view */			case ( $.fn.menuSlider && myapp_config.root_.hasClass('nav-function-top') && $("#js-nav-menu-wrapper").length == false && !myapp_config.root_.hasClass('mobile-view-activated') ):				/* build horizontal navigation */				myapp_config.navHooks.menuSlider({					element: myapp_config.navHooks,					wrapperId: myapp_config.navHorizontalWrapperId				});				/* build horizontal nav */				if (myapp_config.debugState)				console.log("----top controls created -- case 1");				break;			/* fires when user resizes screen to mobile size or app is loaded on mobile resolution */			case ( myapp_config.root_.hasClass('nav-function-top') && $("#js-nav-menu-wrapper").length == true && myapp_config.root_.hasClass('mobile-view-activated') ):				/* destroy horizontal nav */				myapp_config.navHooks.menuSlider('destroy');				/* build horizontal nav */				if (myapp_config.debugState)				console.log("----top controls destroyed -- case 2");				break;				/* fires when users switch off nav-function-top class */			case ( !myapp_config.root_.hasClass('nav-function-top') && $("#js-nav-menu-wrapper").length == true ):				/* destroy horizontal nav */				myapp_config.navHooks.menuSlider('destroy');				/* build horizontal nav */				if (myapp_config.debugState)				console.log("----top controls destroyed -- case 3");								break;			}	};		/**	 * Activate Nav	 * DOC: activation should not take place if top navigation is on	 * @param  {[type]} id 	 * @return {[type]} 	 **/	app.buildNavigation = function(id) {				/**		 * build nav		 * app.navigation.js		 **/		if ($.fn.navigation) {			$(id).navigation({ 				accordion : myapp_config.navAccordion,				speed : myapp_config.navSpeed,				closedSign : '<em class="' + myapp_config.navClosedSign + '"></em>',				openedSign : '<em class="' + myapp_config.navOpenedSign + '"></em>',				initClass: myapp_config.navInitalized			});			return (id);		} else {			if (myapp_config.debugState)			console.log( "WARN: navigation plugin missing" );		}	};	/**	 * Destroy Nav	 * @param  {[type]} id 	 * @return {[type]} 	 **/	app.destroyNavigation = function(id) {				/**		 * destroy nav		 * app.navigation.js		 **/		if ($.fn.navigation) {			$(id).navigationDestroy(); 			return (id);		} else {			if (myapp_config.debugState)			console.log( "WARN: navigation plugin missing" );		}	};	/**	 * App Forms	 * DOC: detects if input is selected or blured	 * @param  {[type]} parentClass	 * @param  {[type]} focusClass	 * @param  {[type]} disabledClass	 * @return {[type]} 	 **/	app.appForms = function(parentClass,focusClass,disabledClass){		/* go through each .form-control */		/*$('.form-control').each(function () {			checkLength(this);		});*/		/* if input has 'some value' add class .has-length to .form-group */		/*function checkLength(e) {			if (e.value.length > 0 ) {				$(e).parents(parentClass).addClass(focusClass);				if($(e).is('[readonly]') || $(e).is('[disabled]')) {					$(e).parents(parentClass).addClass(disabledClass);				}			} else {				$(e).parents(parentClass).removeClass(focusClass);				if($(e).is('[readonly]') || $(e).is('[disabled]')) {					$(e).parents(parentClass).removeClass(disabledClass);				}			}		}*/		function setClass(e, parentClass, focusClass) {			$(e).parents(parentClass).addClass(focusClass);		}		function deleteClass(e, parentClass, focusClass) {			/*if(e.value.length) {			} else {*/				$(e).parents(parentClass).removeClass(focusClass);			/*}*/		}		$(parentClass).each(function () {			var input = $(this).find('.form-control');			input.on('focus', function(){				setClass(this, parentClass, focusClass);			});			input.on('blur', function(){				deleteClass(this, parentClass, focusClass);			});		});	}; 		/**	 * Mobile Check Activate	 * DOC: check on window resize if screen width is less than [value]	 * @return {int}	 */	app.mobileCheckActivation = function(){				if ( window.innerWidth < myapp_config.mobileResolutionTrigger ) {			myapp_config.root_.addClass('mobile-view-activated');			myapp_config.mobileMenuTrigger = true;		} else {			myapp_config.root_.removeClass('mobile-view-activated');			myapp_config.mobileMenuTrigger = false;		}		if (myapp_config.debugState)			console.log( "mobileCheckActivation on " + $(window).width() + " | activated: " + myapp_config.mobileMenuTrigger);		return myapp_config.mobileMenuTrigger;	}; 	/**	 *  Toggle visibility	 * 	DOC: show and hide content with a button action	 *  Usage: onclick="initApp.toggleVisibility('foo');"	 *  @param  {[type]} id 	 *  @return {[type]}	 **/	app.toggleVisibility = function (id) {		var e = document.getElementById(id);		if (e.style.display == 'block')			e.style.display = 'none';		else			e.style.display = 'block';	};	/**	 * Miscelaneous DOM ready functions	 * DOC: start jQuery(document).ready calls	 * @return {[type]}	 **/	app.domReadyMisc = function() {		/* Add file name path to input files */		$('.custom-file input').change(function (e) {			var files = [];			for (var i = 0; i < $(this)[0].files.length; i++) {				files.push($(this)[0].files[i].name);			}			$(this).next('.custom-file-label').html(files.join(', '));		});		/* Give modal backdrop an extra class to make it customizable */		$('.modal-backdrop-transparent').on('show.bs.modal', function (e) {			setTimeout(function(){				$('.modal-backdrop').addClass('modal-backdrop-transparent');			});		});				/* Add app date to js-get-date */		if ( myapp_config.appDateHook.length ) {			var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],				day = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],				now = new Date(),				formatted = day[now.getDay()] + ', ' +  							months[now.getMonth()] + ' ' +  							now.getDate() + ', ' +							now.getFullYear();			myapp_config.appDateHook.text(formatted);						}		/* Check conflicting classes to build/destroy slimscroll */		initApp.checkNavigationOrientation();		/* Activate the last tab clicked using localStorage */		var lastTab = localStorage.getItem('lastTab');		 		$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {			localStorage.setItem('lastTab', $(this).attr('href'));		});				if (lastTab) {			$('[href="' + lastTab + '"]').tab('show');		} 		/**		 * all options:		 * --------------			width: '300px',			height: '500px',			size: '10px',			position: 'left',			color: '#ffcc00',			alwaysVisible: true,			distance: '20px',			start: $('#child_image_element'),			railVisible: true,			railColor: '#222',			railOpacity: 0.3,			wheelStep: 10,			allowPageScroll: false,			disableFadeOut: false		 **/		if ( typeof $.fn.slimScroll !== 'undefined' && myapp_config.thisDevice === 'desktop') {			$('.custom-scroll:not(.disable-slimscroll) >:first-child').slimscroll({				height: $(this).data('scrollHeight') || '100%',				size: $(this).data('scrollSize') || '4px',				position: $(this).data('scrollPosition') || 'right',				color: $(this).data('scrollColor') || 'rgba(0,0,0,0.6)',				alwaysVisible: $(this).data('scrollAlwaysVisible') || false,				distance: $(this).data('scrollDistance') || '4px',				railVisible: $(this).data('scrollRailVisible') || false,				railColor: $(this).data('scrollRailColor') || '#fafafa',				allowPageScroll: false,				disableFadeOut: false			});			if (myapp_config.debugState)				console.log("%c✔ SlimScroll plugin active", "color: #148f32");			} else {			console.log("WARN! $.fn.slimScroll not loaded or user is on desktop");			myapp_config.root_.addClass("no-slimscroll");		}		/**		 * Activate listFilters		 * usage: <input id="inputID" data-listfilter="listFilter" />		 **/		if( typeof initApp.listFilter !== 'undefined' && $.isFunction(initApp.listFilter) && $('[data-listfilter]').length ) {			var inputID = $('[data-listfilter]').attr('id'),				listFilter = $('[data-listfilter]').attr("data-listfilter");			/* initApp.listFilter($('.list'), $('#intput-id')); */			initApp.listFilter(listFilter, '#' + inputID);		}		/**		 * Start bootstrap tooltips		 **/		if( typeof($.fn.tooltip) !== 'undefined' && $('[data-toggle="tooltip"]').length ){			$('[data-toggle="tooltip"]').tooltip(); /*{html: true}*/		} else {			console.log("OOPS! bs.tooltip is not loaded");		}		/**		 * Start bootstrap popovers		 **/		if( typeof($.fn.popover) !== 'undefined' && $('[data-toggle="popover"]').length ){			/* BS4 sanatize */			var myDefaultWhiteList = $.fn.tooltip.Constructor.Default.whiteList			/* init popover */			/* data-sanitize="false" was not working so had to add this globally */			/* DOC: https://getbootstrap.com/docs/4.3/getting-started/javascript/#sanitizer */			$('[data-toggle="popover"]').popover({sanitize:false}); /*{trigger: "focus"}*/		} /*else {			console.log("OOPS! bs.popover is not loaded");			console.log("this")		}*/		/* 		 * Disable popper.js's forced hardware accelaration styles		 */		if( typeof($.fn.dropdown) !== 'undefined'){ 			Popper.Defaults.modifiers.computeStyle.gpuAcceleration = false;		} else {			console.log("OOPS! bs.popover is not loaded");		} 		/**		 * Dropdowns will not close on click		 * doc: close dropdowns on click outside hit area		 **/		$(document).on('click', '.dropdown-menu:not(.js-auto-close)', function (e) {			e.stopPropagation();		});		/**		 * Waves effect (plugin has issues with IE9)		 * DOC: http://fian.my.id/Waves/#start 		 **/		if (window.Waves && myapp_config.rippleEffect) {			Waves.attach('.nav-menu:not(.js-waves-off) a, .btn:not(.js-waves-off):not(.btn-switch), .js-waves-on', ['waves-themed']);			Waves.init();			if (myapp_config.debugState)				console.log("%c✔ Waves plugin active", "color: #148f32");						} else {			if (myapp_config.debugState)				console.log("%c✘ Waves plugin inactive! ", "color: #fd3995");		}		/**		 * Action buttons		 **/				myapp_config.root_			.on('click touchend', '[data-action]', function(e) {				var actiontype = $(this).data('action');				switch ( true ) {					/**					 * toggle trigger					 * Usage 1 (body): <a href="#" data-action="toggle" data-class="add-this-class-to-body">...</a>					 * Usage 2 (target): <a href="#" data-action="toggle" data-class="add-this-class-to-target" data-target="target">...</a>					 **/					case ( actiontype === 'toggle' ):						var target = $(this).attr('data-target') || myapp_config.root_,							dataClass = $(this).attr('data-class'),							inputFocus = $(this).attr('data-focus');						/* remove previous background image if alternate is selected */						if ( dataClass.indexOf('mod-bg-') !== -1 ) {							$(target).removeClass (function (index, css) {								return (css.match (/(^|\s)mod-bg-\S+/g) || []).join(' ');							});						}						/* trigger class change */						$(target).toggleClass( dataClass );						/* this allows us to add active class for dropdown toggle components */						if ( $(this).hasClass('dropdown-item') ) {							$(this).toggleClass('active');						}						/* focus input if available 						   FAQ: We had to put a delay timer to slow it down for chrome						*/						if(inputFocus != undefined) {							setTimeout(function(){ $('#' + inputFocus).focus(); }, 200);						}						/* save settings */						if ( typeof classHolder != 'undefined' || classHolder != null ) {							/* NOTE: saveSettings function is located right after <body> tag */							initApp.checkNavigationOrientation();							initApp.saveSettings();						}						break;					/**					 * toggle swap trigger					 * Usage (target): <a href="#" data-action="toggle-swap" data-class=".add-this-class-to-target .another-class" data-target="#id">...</a>					 **/					case ( actiontype === 'toggle-swap' ):						var target = $(this).attr('data-target'),							dataClass = $(this).attr('data-class');						/* trigger class change */						$(target).removeClass().addClass( dataClass );						break;					/**					 * panel 'collapse' trigger					 **/					case ( actiontype === 'panel-collapse' ):						var selectedPanel = $(this).closest('.panel');						selectedPanel.children('.panel-container').collapse('toggle')						.on('show.bs.collapse', function() {							selectedPanel.removeClass("panel-collapsed");							if (myapp_config.debugState)								console.log( "panel id:" + selectedPanel.attr('id') + " | action: uncollapsed" );						}).on('hidden.bs.collapse', function(){							selectedPanel.addClass("panel-collapsed");							if (myapp_config.debugState)								console.log( "panel id:" + selectedPanel.attr('id') + " | action: collapsed" );						});										/* return ID of panel */						//return selectedPanel.attr('id');						break;					/**					 * panel 'fullscreen' trigger					 **/					case ( actiontype === 'panel-fullscreen' ):						var selectedPanel = $(this).closest('.panel');						selectedPanel.toggleClass('panel-fullscreen');						myapp_config.root_.toggleClass('panel-fullscreen');						if (myapp_config.debugState)						console.log( "panel id:" + selectedPanel.attr('id') + " | action: fullscreen" );						/* return ID of panel */						//return selectedPanel.attr('id');						break;					/**					 * panel 'close' trigger					 **/					case ( actiontype === 'panel-close' ):						var selectedPanel = $(this).closest('.panel');						var killPanel = function (){							selectedPanel.fadeOut(500,function(){								/* remove panel */								$(this).remove();								if (myapp_config.debugState)								console.log( "panel id:" + selectedPanel.attr('id') + " | action: removed" );							});						};						if (typeof bootbox  != 'undefined') {							initApp.playSound('media/sound', 'messagebox')							bootbox.confirm({								title: "<i class='fal fa-times-circle text-danger mr-2'></i> Do you wish to delete panel <span class='fw-500'> '" +selectedPanel.children('.panel-hdr').children('h2').text().trim()+ "' </span>?",								message: "<span><strong>Warning:</strong> This action cannot be undone!</span>",								centerVertical: true,								swapButtonOrder: true,								buttons: {									confirm: {										label: 'Yes',										className: 'btn-danger shadow-0'									},									cancel: {										label: 'No',										className: 'btn-default'									}								},								className: "modal-alert",								closeButton: false,								callback: function (result) {									if (result == true) {										killPanel();									}								}							});						} else {														if (confirm( 'Do you wish to delete panel ' + selectedPanel.children('.panel-hdr').children('h2').text().trim() + '?' )) {								killPanel();							}						}						break;					/**					 * update header css, 'theme-update' trigger					 * eg:  data-action = "theme-update" 					 *      data-theme = "css/cust-theme-1.css"					 **/					case ( actiontype === 'theme-update' ):						if ( $(myapp_config.mythemeAnchor).length) {							$(myapp_config.mythemeAnchor).attr('href', $(this).attr('data-theme') );						} else {							var mytheme = $("<link>", {id: myapp_config.mythemeAnchor.replace('#', ''), "rel": "stylesheet", "href" : $(this).attr('data-theme') });							$('head').append(mytheme);						}						if ( $(this).attr('data-themesave') != undefined ) {							initApp.saveSettings();						}						break;					/**					 * theme 'app-reset' trigger					 **/					case ( actiontype === 'app-reset' ):						initApp.resetSettings();						break;					/**					 * theme 'factory-reset' trigger					 **/					case ( actiontype === 'factory-reset' ):						initApp.factoryReset();						break;						/**					 * app print					 * starts print priview for browser					 **/					case ( actiontype === 'app-print' ):						window.print();						break;					/**					 * ondemand					 * load onDemand scripts					 **/					case ( actiontype === 'app-loadscript' ):						var loadurl = $(this).attr('data-loadurl'),							loadfunction = $(this).attr('data-loadfunction');						initApp.loadScript(loadurl,loadfunction);						break;						/**					 * app language selection					 * lazyloads i18n plugin and activates selected language					 **/					case ( actiontype === 'lang' ):						var applang = $(this).attr('data-lang').toString();						if (!$.i18n) {						//jQuery.getScript('http://url/to/the/script');							initApp.loadScript("js/i18n/i18n.js", 								function activateLang () {																		$.i18n.init({										resGetPath: 'media/data/__lng__.json',										load: 'unspecific',										fallbackLng: false,										lng: applang									}, function (t){										$('[data-i18n]').i18n();									});																									}							);						} else {							i18n.setLng(applang, function(){								$('[data-i18n]').i18n();								$('[data-lang]').removeClass('active');								$(this).addClass('active');							});						}						break;						/**					 * app 'fullscreen' trigger					 **/					case ( actiontype === 'app-fullscreen' ):						/* NOTE: this may not work for all browsers if the browser security does not permit it 						   IE issues: http://stackoverflow.com/questions/33732805/fullscreen-not-working-in-ie */						if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) {							if (document.documentElement.requestFullscreen) {								/* Standard browsers */								document.documentElement.requestFullscreen();							} else if (document.documentElement.msRequestFullscreen) {								/* Internet Explorer */								document.documentElement.msRequestFullscreen();							} else if (document.documentElement.mozRequestFullScreen) {								/* Firefox */								document.documentElement.mozRequestFullScreen();							} else if (document.documentElement.webkitRequestFullscreen) {								/* Chrome */								document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);							}							if (myapp_config.debugState)								console.log( "app fullscreen toggle active" );						} else {							if (document.exitFullscreen) {								document.exitFullscreen();							} else if (document.msExitFullscreen) {								document.msExitFullscreen();							} else if (document.mozCancelFullScreen) {								document.mozCancelFullScreen();							} else if (document.webkitExitFullscreen) {								document.webkitExitFullscreen();							}							if (myapp_config.debugState)								console.log("%capp fullscreen toggle inactive! ", "color: #ed1c24");						}						break; 									/**					 * app 'playsound' trigger					 * usage: data-action="playsound" data-soundpath="media/sound/" data-soundfile="filename" (no file extensions)					 **/					case ( actiontype === 'playsound' ):						var path = $(this).attr('data-soundpath') || "media/sound/",							sound = $(this).attr('data-soundfile');						initApp.playSound(path,sound);						break;				}				/* hide tooltip if any present */				$(this).tooltip('hide');				if (myapp_config.debugState)					console.log("data-action clicked: " + actiontype);				/* stop default link action */								e.stopPropagation(); 				e.preventDefault();				}); 		/**		 * Windows mobile 8 fix ~		 * DOC: bootstrap related		 **/		if (navigator.userAgent.match(/IEMobile\/10\.0/)) {			var msViewportStyle = document.createElement('style');			msViewportStyle.appendChild(				document.createTextNode(					'@-ms-viewport{width:auto!important}'				)			);			document.head.appendChild(msViewportStyle)		};		/**		 * Display APP version		 * DOC: only show this if debug state tree		 **/		 if (myapp_config.debugState)			console.log("%c✔ Finished app.init() v" + myapp_config.VERSION + '\n' + "---------------------------", "color: #148f32");		};	return app;	})({});/*	"Night is a bag that bursts with the golden dust of dawn..."	Oh wow, you actually opened this file and read it all the way though! Congrats! 	Please do drop me a line at @myplaneticket :)*//** * Bind the throttled handler to the resize event. * NOTE: Please do not change the order displayed (e.g. 1a, 1b, 2a, 2b...etc) **/$(window).resize( 	$.throttle( myapp_config.throttleDelay, function (e) {		 /**		  * (1a) ADD CLASS WHEN BELOW CERTAIN WIDTH (MOBILE MENU)		  * Description: tracks the page min-width of #CONTENT and NAV when navigation is resized.		  * This is to counter bugs for minimum page width on many desktop and mobile devices.		  **/		  initApp.mobileCheckActivation();		 /**		  * (1b) CHECK NAVIGATION STATUS (IF HORIZONTAL OR VERTICAL)		  * Description: fires an event to check for navigation orientation.		  * Based on the condition, it will initliaze or destroy the slimscroll, or horizontal nav plugins		  **/		  initApp.checkNavigationOrientation();		 /** -- insert your resize codes below this line -- **/	 	})); /** * Bind the throttled handler to the scroll event **/$(window).scroll( 	$.throttle( myapp_config.throttleDelay, function (e) {		 /**		  * FIX APP HEIGHT		  * Compare the height of nav and content;		  * If one is longer/shorter than the other, measure them to be equal.		  * This event is only fired on desktop.		  **/		  		  /** -- insert your other scroll codes below this line -- **/	}));/** * Initiate scroll events **/$(window).on('scroll', initApp.windowScrollEvents);/** * DOCUMENT LOADED EVENT * DOC: Fire when DOM is ready * Do not change order a, b, c, d... **/document.addEventListener('DOMContentLoaded', function() {	/**	 * detect desktop or mobile 	 **/	initApp.addDeviceType();	/**	 * detect Webkit Browser 	 **/	initApp.detectBrowserType();	/**	 * a. check for mobile view width and add class .mobile-view-activated	 **/	initApp.mobileCheckActivation(); 	/**	 * b. build navigation	 **/	initApp.buildNavigation(myapp_config.navHooks); 	/**	 * c. initialize nav filter	 **/	initApp.listFilter(myapp_config.navHooks, myapp_config.navFilterInput, myapp_config.navAnchor); 	/**	 * d. run DOM misc functions	 **/	initApp.domReadyMisc(); 	/**	 * e. run app forms class detectors [parentClass,focusClass,disabledClass]	 **/	initApp.appForms('.input-group', 'has-length', 'has-disabled');}); /** * Mobile orientation change events * DOC: recalculates app height **/$( window ).on( "orientationchange", function( event ) {	/* reset any .CSS heights and force appHeight function to recalculate */	if (myapp_config.debugState)		console.log("orientationchange event");});/** * Window load function * DOC: window focus blur detection **/$(window).on("blur focus", function(e) {    var prevType = $(this).data("prevType");    /**     * reduce double fire issues     **/    if (prevType != e.type) {           switch (e.type) {            case "blur":                myapp_config.root_.toggleClass("blur")                 if (myapp_config.debugState)                console.log("blur");                            break;            case "focus":                myapp_config.root_.toggleClass("blur")                if (myapp_config.debugState)                console.log("focused");                break;        }    }    $(this).data("prevType", e.type);})var color = {	primary: {		_50:  rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-50').css('color'))  || '#ccbfdf',		_100: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-100').css('color')) || '#beaed7',		_200: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-200').css('color')) || '#b19dce',		_300: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-300').css('color')) || '#a38cc6',		_400: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-400').css('color')) || '#967bbd',		_500: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-500').css('color')) || '#886ab5',		_600: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-600').css('color')) || '#7a59ad',		_700: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-700').css('color')) || '#6e4e9e',		_800: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-800').css('color')) || '#62468d',		_900: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-primary-900').css('color')) || '#563d7c'	},	success: {		_50:  rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-50').css('color'))  || '#7aece0',		_100: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-100').css('color')) || '#63e9db',		_200: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-200').css('color')) || '#4de5d5',		_300: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-300').css('color')) || '#37e2d0',		_400: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-400').css('color')) || '#21dfcb',		_500: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-500').css('color')) || '#1dc9b7',		_600: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-600').css('color')) || '#1ab3a3',		_700: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-700').css('color')) || '#179c8e',		_800: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-800').css('color')) || '#13867a',		_900: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-success-900').css('color')) || '#107066'	},	info: {		_50:  rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-50').css('color'))  || '#9acffa',		_100: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-100').css('color')) || '#82c4f8',		_200: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-200').css('color')) || '#6ab8f7',		_300: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-300').css('color')) || '#51adf6',		_400: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-400').css('color')) || '#39a1f4',		_500: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-500').css('color')) || '#2196F3',		_600: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-600').css('color')) || '#0d8aee',		_700: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-700').css('color')) || '#0c7cd5',		_800: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-800').css('color')) || '#0a6ebd',		_900: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-info-900').css('color')) || '#0960a5'	},	warning: {		_50:  rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-50').css('color'))  || '#ffebc1',		_100: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-100').css('color')) || '#ffe3a7',		_200: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-200').css('color')) || '#ffdb8e',		_300: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-300').css('color')) || '#ffd274',		_400: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-400').css('color')) || '#ffca5b',		_500: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-500').css('color')) || '#ffc241',		_600: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-600').css('color')) || '#ffba28',		_700: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-700').css('color')) || '#ffb20e',		_800: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-800').css('color')) || '#f4a500',		_900: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-warning-900').css('color')) || '#da9400'	},	danger: {		_50:  rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-50').css('color'))  || '#feb7d9',		_100: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-100').css('color')) || '#fe9ecb',		_200: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-200').css('color')) || '#fe85be',		_300: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-300').css('color')) || '#fe6bb0',		_400: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-400').css('color')) || '#fd52a3',		_500: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-500').css('color')) || '#fd3995',		_600: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-600').css('color')) || '#fd2087',		_700: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-700').css('color')) || '#fc077a',		_800: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-800').css('color')) || '#e7026e',		_900: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-danger-900').css('color')) || '#ce0262'	},	fusion: {		_50:  rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-50').css('color'))  || '#909090',		_100: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-100').css('color')) || '#838383',		_200: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-200').css('color')) || '#767676',		_300: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-300').css('color')) || '#696969',		_400: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-400').css('color')) || '#5d5d5d',		_500: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-500').css('color')) || '#505050',		_600: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-600').css('color')) || '#434343',		_700: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-700').css('color')) || '#363636',		_800: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-800').css('color')) || '#2a2a2a',		_900: rgb2hex(myapp_config.mythemeColorProfileID.find('.color-fusion-900').css('color')) || '#1d1d1d'	}}function autoFlashHeight(){    $(".dialog-sheet").height($(window).height()-58);};
 |