{"version":3,"names":[],"mappings":"","sources":["scripts.bundle.js"],"sourcesContent":["/**\r\n * @class mApp App class\r\n */\r\n\r\nvar mApp = function () {\r\n\r\n /**\r\n * Initializes bootstrap tooltip\r\n */\r\n var initTooltip = function (el) {\r\n var skin = el.data('skin') ? 'm-tooltip--skin-' + el.data('skin') : '';\r\n var width = el.data('width') == 'auto' ? 'm-tooltop--auto-width' : '';\r\n var triggerValue = el.data('trigger') ? el.data('trigger') : 'hover';\r\n\r\n el.tooltip({\r\n trigger: triggerValue,\r\n html: true,\r\n placement: 'auto',\r\n template: '
\\\r\n
\\\r\n
\\\r\n
'\r\n });\r\n }\r\n\r\n /**\r\n * Initializes bootstrap tooltips\r\n */\r\n var initTooltips = function () {\r\n // init bootstrap tooltips\r\n $('[data-toggle=\"m-tooltip\"]').each(function () {\r\n initTooltip($(this));\r\n });\r\n }\r\n\r\n /**\r\n * Initializes bootstrap popover\r\n */\r\n var initPopover = function (el) {\r\n var skin = el.data('skin') ? 'm-popover--skin-' + el.data('skin') : '';\r\n var triggerValue = el.data('trigger') ? el.data('trigger') : 'hover';\r\n\r\n el.popover({\r\n trigger: triggerValue,\r\n template: '\\\r\n
\\\r\n
\\\r\n

\\\r\n
\\\r\n
'\r\n });\r\n }\r\n\r\n /**\r\n * Initializes bootstrap popovers\r\n */\r\n var initPopovers = function () {\r\n // init bootstrap popover\r\n $('[data-toggle=\"m-popover\"]').each(function () {\r\n initPopover($(this));\r\n });\r\n }\r\n\r\n /**\r\n * Initializes bootstrap file input\r\n */\r\n var initFileInput = function () {\r\n // init bootstrap popover\r\n $('.custom-file-input').on('change', function () {\r\n var fileName = $(this).val();\r\n $(this).next('.custom-file-control').addClass(\"selected\").html(fileName);\r\n });\r\n }\r\n\r\n /**\r\n * Initializes portlet\r\n */\r\n var initPortlet = function (el, options) {\r\n // init portlet tools\r\n el.mPortlet(options);\r\n }\r\n\r\n /**\r\n * Initializes portlets\r\n */\r\n var initPortlets = function () {\r\n // init portlet tools\r\n $('[data-portlet=\"true\"]').each(function () {\r\n var el = $(this);\r\n\r\n if (el.data('portlet-initialized') !== true) {\r\n initPortlet(el, {});\r\n el.data('portlet-initialized', true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Initializes scrollable contents\r\n */\r\n var initScrollables = function () {\r\n $('[data-scrollable=\"true\"]').each(function () {\r\n var maxHeight;\r\n var height;\r\n var el = $(this);\r\n\r\n if (mUtil.isInResponsiveRange('tablet-and-mobile')) {\r\n if (el.data('mobile-max-height')) {\r\n maxHeight = el.data('mobile-max-height');\r\n } else {\r\n maxHeight = el.data('max-height');\r\n }\r\n\r\n if (el.data('mobile-height')) {\r\n height = el.data('mobile-height');\r\n } else {\r\n height = el.data('height');\r\n }\r\n } else {\r\n maxHeight = el.data('max-height');\r\n height = el.data('max-height');\r\n }\r\n\r\n if (maxHeight) {\r\n el.css('max-height', maxHeight);\r\n }\r\n if (height) {\r\n el.css('height', height);\r\n }\r\n\r\n mApp.initScroller(el, {});\r\n });\r\n }\r\n\r\n /**\r\n * Initializes bootstrap alerts\r\n */\r\n var initAlerts = function () {\r\n // init bootstrap popover\r\n $('body').on('click', '[data-close=alert]', function () {\r\n $(this).closest('.alert').hide();\r\n });\r\n }\r\n\r\n /**\r\n * Initializes bootstrap collapse for accordion feature\r\n */\r\n var initAccordions = function (el) {\r\n\r\n }\r\n\r\n var hideTouchWarning = function () {\r\n jQuery.event.special.touchstart = {\r\n setup: function (_, ns, handle) {\r\n if (typeof this === 'function')\r\n if (ns.includes('noPreventDefault')) {\r\n this.addEventListener('touchstart', handle, { passive: false });\r\n } else {\r\n this.addEventListener('touchstart', handle, { passive: true });\r\n }\r\n },\r\n };\r\n jQuery.event.special.touchmove = {\r\n setup: function (_, ns, handle) {\r\n if (typeof this === 'function')\r\n if (ns.includes('noPreventDefault')) {\r\n this.addEventListener('touchmove', handle, { passive: false });\r\n } else {\r\n this.addEventListener('touchmove', handle, { passive: true });\r\n }\r\n },\r\n };\r\n jQuery.event.special.wheel = {\r\n setup: function (_, ns, handle) {\r\n if (typeof this === 'function')\r\n if (ns.includes('noPreventDefault')) {\r\n this.addEventListener('wheel', handle, { passive: false });\r\n } else {\r\n this.addEventListener('wheel', handle, { passive: true });\r\n }\r\n },\r\n };\r\n };\r\n\r\n return {\r\n /**\r\n * Main class initializer\r\n */\r\n init: function () {\r\n mApp.initComponents();\r\n },\r\n\r\n /**\r\n * Initializes components\r\n */\r\n initComponents: function () {\r\n hideTouchWarning();\r\n initScrollables();\r\n initTooltips();\r\n initPopovers();\r\n initAlerts();\r\n initPortlets();\r\n initFileInput();\r\n initAccordions();\r\n },\r\n\r\n /**\r\n * \r\n * @param {object} el jQuery element object\r\n */\r\n // wrJangoer function to scroll(focus) to an element\r\n initTooltips: function () {\r\n initTooltips();\r\n },\r\n\r\n /**\r\n * \r\n * @param {object} el jQuery element object\r\n */\r\n // wrJangoer function to scroll(focus) to an element\r\n initTooltip: function (el) {\r\n initTooltip(el);\r\n },\r\n\r\n /**\r\n * \r\n * @param {object} el jQuery element object\r\n */\r\n // wrJangoer function to scroll(focus) to an element\r\n initPopovers: function () {\r\n initPopovers();\r\n },\r\n\r\n /**\r\n * \r\n * @param {object} el jQuery element object\r\n */\r\n // wrJangoer function to scroll(focus) to an element\r\n initPopover: function (el) {\r\n initPopover(el);\r\n },\r\n\r\n /**\r\n * \r\n * @param {object} el jQuery element object\r\n */\r\n // function to init portlet\r\n initPortlet: function (el, options) {\r\n initPortlet(el, options);\r\n },\r\n\r\n /**\r\n * \r\n * @param {object} el jQuery element object\r\n */\r\n // function to init portlets\r\n initPortlets: function () {\r\n initPortlets();\r\n },\r\n\r\n /**\r\n * Scrolls to an element with animation\r\n * @param {object} el jQuery element object\r\n * @param {number} offset Offset to element scroll position\r\n */\r\n scrollTo: function (el, offset) {\r\n var pos = (el && el.length > 0) ? el.offset().top : 0;\r\n pos = pos + (offset ? offset : 0);\r\n\r\n jQuery('html,body').animate({\r\n scrollTop: pos\r\n }, 'slow');\r\n },\r\n\r\n /**\r\n * Scrolls until element is centered in the viewport \r\n * @param {object} el jQuery element object\r\n */\r\n // wrJangoer function to scroll(focus) to an element\r\n scrollToViewport: function (el) {\r\n var elOffset = el.offset().top;\r\n var elHeight = el.height();\r\n var windowHeight = mUtil.getViewPort().height;\r\n var offset = elOffset - ((windowHeight / 2) - (elHeight / 2));\r\n\r\n jQuery('html,body').animate({\r\n scrollTop: offset\r\n }, 'slow');\r\n },\r\n\r\n /**\r\n * Scrolls to the top of the page\r\n */\r\n // function to scroll to the top\r\n scrollTop: function () {\r\n mApp.scrollTo();\r\n },\r\n\r\n /**\r\n * Initializes scrollable content using mCustomScrollbar plugin\r\n * @param {object} el jQuery element object\r\n * @param {object} options mCustomScrollbar plugin options(refer: http://manos.malihu.gr/jquery-custom-content-scroller/)\r\n */\r\n initScroller: function (el, options) {\r\n if (mUtil.isMobileDevice()) {\r\n el.css('overflow', 'auto');\r\n } else {\r\n //el.mCustomScrollbar(\"destroy\");\r\n el.mCustomScrollbar({\r\n scrollInertia: 0,\r\n autoDraggerLength: true,\r\n autoHideScrollbar: true,\r\n autoExpandScrollbar: false,\r\n alwaysShowScrollbar: 0,\r\n axis: el.data('axis') ? el.data('axis') : 'y',\r\n mouseWheel: {\r\n scrollAmount: 120,\r\n preventDefault: true\r\n },\r\n setHeight: (options.height ? options.height : ''),\r\n theme: \"minimal-dark\"\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * Destroys scrollable content's mCustomScrollbar plugin instance\r\n * @param {object} el jQuery element object\r\n */\r\n destroyScroller: function (el) {\r\n el.mCustomScrollbar(\"destroy\");\r\n },\r\n\r\n /**\r\n * Shows bootstrap alert\r\n * @param {object} options\r\n * @returns {string} ID attribute of the created alert\r\n */\r\n alert: function (options) {\r\n options = $.extend(true, {\r\n container: \"\", // alerts parent container(by default placed after the page breadcrumbs)\r\n place: \"append\", // \"append\" or \"prepend\" in container \r\n type: 'success', // alert's type\r\n message: \"\", // alert's message\r\n close: true, // make alert closable\r\n reset: true, // close all previouse alerts first\r\n focus: true, // auto scroll to the alert after shown\r\n closeInSeconds: 0, // auto close after defined seconds\r\n icon: \"\" // put icon before the message\r\n }, options);\r\n\r\n var id = mUtil.getUniqueID(\"App_alert\");\r\n\r\n var html = '
' + (options.close ? '' : '') + (options.icon !== \"\" ? ' ' : '') + options.message + '
';\r\n\r\n if (options.reset) {\r\n $('.custom-alerts').remove();\r\n }\r\n\r\n if (!options.container) {\r\n if ($('.page-fixed-main-content').size() === 1) {\r\n $('.page-fixed-main-content').prepend(html);\r\n } else if (($('body').hasClass(\"page-container-bg-solid\") || $('body').hasClass(\"page-content-white\")) && $('.page-head').size() === 0) {\r\n $('.page-title').after(html);\r\n } else {\r\n if ($('.page-bar').size() > 0) {\r\n $('.page-bar').after(html);\r\n } else {\r\n $('.page-breadcrumb, .breadcrumbs').after(html);\r\n }\r\n }\r\n } else {\r\n if (options.place == \"append\") {\r\n $(options.container).append(html);\r\n } else {\r\n $(options.container).prepend(html);\r\n }\r\n }\r\n\r\n if (options.focus) {\r\n mApp.scrollTo($('#' + id));\r\n }\r\n\r\n if (options.closeInSeconds > 0) {\r\n setTimeout(function () {\r\n $('#' + id).remove();\r\n }, options.closeInSeconds * 1000);\r\n }\r\n\r\n return id;\r\n },\r\n\r\n /**\r\n * Blocks element with loading indiciator using http://malsup.com/jquery/block/\r\n * @param {object} target jQuery element object\r\n * @param {object} options \r\n */\r\n block: function (target, options) {\r\n var el = $(target);\r\n\r\n options = $.extend(true, {\r\n opacity: 0.1,\r\n overlayColor: '#000000',\r\n state: 'brand',\r\n type: 'loader',\r\n size: 'lg',\r\n centerX: true,\r\n centerY: true,\r\n message: '',\r\n shadow: true,\r\n width: 'auto'\r\n }, options);\r\n\r\n var skin;\r\n var state;\r\n var loading;\r\n\r\n if (options.type == 'spinner') {\r\n skin = options.skin ? 'm-spinner--skin-' + options.skin : '';\r\n state = options.state ? 'm-spinner--' + options.state : '';\r\n loading = '
0) {\r\n var classes = 'm-blockui ' + (options.shadow === false ? 'm-blockui-no-shadow' : '');\r\n html = '
' + options.message + '' + loading + '
';\r\n if (target == 'body') {\r\n html = '
' + options.message + '' + loading + '
';\r\n }\r\n } else {\r\n html = loading;\r\n }\r\n\r\n var params = {\r\n message: html,\r\n centerY: options.centerY,\r\n centerX: options.centerX,\r\n css: {\r\n top: '30%',\r\n left: '50%',\r\n border: '0',\r\n padding: '0',\r\n backgroundColor: 'none',\r\n width: options.width\r\n },\r\n overlayCSS: {\r\n backgroundColor: options.overlayColor,\r\n opacity: options.opacity,\r\n cursor: 'wait'\r\n },\r\n onUnblock: function () {\r\n if (el) {\r\n el.css('position', '');\r\n el.css('zoom', '');\r\n }\r\n }\r\n };\r\n\r\n if (target == 'body') {\r\n params.css.top = '50%';\r\n params.baseZ = 9999;\r\n $.blockUI(params);\r\n } else {\r\n var el = $(target);\r\n el.block(params);\r\n }\r\n },\r\n\r\n /**\r\n * Un-blocks the blocked element \r\n * @param {object} target jQuery element object\r\n */\r\n unblock: function (target) {\r\n if (target && target != 'body') {\r\n $(target).unblock();\r\n } else {\r\n $.unblockUI();\r\n }\r\n },\r\n\r\n /**\r\n * Blocks the page body element with loading indicator\r\n * @param {object} options \r\n */\r\n blockPage: function (options) {\r\n return mApp.block('body', options);\r\n },\r\n\r\n /**\r\n * Un-blocks the blocked page body element\r\n */\r\n unblockPage: function () {\r\n return mApp.unblock('body');\r\n },\r\n\r\n /**\r\n * Enable loader progress for button and other elements\r\n * @param {object} target jQuery element object\r\n * @param {object} options\r\n */\r\n progress: function (target, options) {\r\n var skin = (options && options.skin) ? options.skin : 'light';\r\n var alignment = (options && options.alignment) ? options.alignment : 'right';\r\n var size = (options && options.size) ? 'm-spinner--' + options.size : '';\r\n var classes = 'm-loader ' + 'm-loader--' + skin + ' m-loader--' + alignment + ' m-loader--' + size;\r\n\r\n mApp.unprogress(target);\r\n\r\n $(target).addClass(classes);\r\n $(target).data('progress-classes', classes);\r\n },\r\n\r\n /**\r\n * Disable loader progress for button and other elements\r\n * @param {object} target jQuery element object\r\n */\r\n unprogress: function (target) {\r\n $(target).removeClass($(target).data('progress-classes'));\r\n }\r\n };\r\n}();\r\n\r\n//== Initialize mApp class on document ready\r\n$(document).ready(function () {\r\n mApp.init();\r\n});\n/**\r\n * @class mUtil Metronic base utilize class that privides helper functions\r\n */\r\n\r\nvar mUtil = function() {\r\n var resizeHandlers = [];\r\n\r\n /** @type {object} breakpoints The device width breakpoints **/\r\n var breakpoints = { \r\n sm: 544, // Small screen / phone \r\n md: 768, // Medium screen / tablet \r\n lg: 992, // Large screen / desktop \r\n xl: 1200 // Extra large screen / wide desktop\r\n };\r\n\r\n /** @type {object} colors State colors **/\r\n var colors = {\r\n brand: '#716aca',\r\n metal: '#c4c5d6',\r\n light: '#ffffff',\r\n accent: '#00c5dc',\r\n primary: '#5867dd',\r\n success: '#34bfa3',\r\n info: '#36a3f7',\r\n warning: '#ffb822',\r\n danger: '#f4516c'\r\n };\r\n\r\n /**\r\n * Handle window resize event with some \r\n * delay to attach event handlers upon resize complete \r\n */\r\n var _windowResizeHandler = function() {\r\n var resize;\r\n var _runResizeHandlers = function() {\r\n // reinitialize other subscribed elements\r\n for (var i = 0; i < resizeHandlers.length; i++) {\r\n var each = resizeHandlers[i];\r\n each.call();\r\n }\r\n };\r\n\r\n jQuery(window).resize(function() {\r\n if (resize) {\r\n clearTimeout(resize);\r\n }\r\n resize = setTimeout(function() {\r\n _runResizeHandlers();\r\n }, 250); // wait 50ms until window resize finishes.\r\n });\r\n };\r\n\r\n return {\r\n /**\r\n * Class main initializer.\r\n * @param {object} options.\r\n * @returns null\r\n */\r\n //main function to initiate the theme\r\n init: function(options) {\r\n if (options && options.breakpoints) {\r\n breakpoints = options.breakpoints;\r\n }\r\n\r\n if (options && options.colors) {\r\n colors = options.colors;\r\n }\r\n\r\n _windowResizeHandler();\r\n },\r\n\r\n /**\r\n * Adds window resize event handler.\r\n * @param {function} callback function.\r\n */\r\n addResizeHandler: function(callback) {\r\n resizeHandlers.push(callback);\r\n },\r\n\r\n /**\r\n * Trigger window resize handlers.\r\n */\r\n runResizeHandlers: function() {\r\n _runResizeHandlers();\r\n }, \r\n\r\n /**\r\n * Get GET parameter value from URL.\r\n * @param {string} paramName Parameter name.\r\n * @returns {string} \r\n */\r\n getURLParam: function(paramName) {\r\n var searchString = window.location.search.substring(1),\r\n i, val, params = searchString.split(\"&\");\r\n\r\n for (i = 0; i < params.length; i++) {\r\n val = params[i].split(\"=\");\r\n if (val[0] == paramName) {\r\n return unescape(val[1]);\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n /**\r\n * Checks whether current device is mobile touch.\r\n * @returns {boolean} \r\n */\r\n isMobileDevice: function() {\r\n return (this.getViewPort().width < this.getBreakpoint('lg') ? true : false);\r\n },\r\n\r\n /**\r\n * Checks whether current device is desktop.\r\n * @returns {boolean} \r\n */\r\n isDesktopDevice: function() {\r\n return mUtil.isMobileDevice() ? false : true;\r\n },\r\n\r\n /**\r\n * Gets browser window viewport size. Ref: http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/\r\n * @returns {object} \r\n */\r\n getViewPort: function() {\r\n var e = window,\r\n a = 'inner';\r\n if (!('innerWidth' in window)) {\r\n a = 'client';\r\n e = document.documentElement || document.body;\r\n }\r\n\r\n return {\r\n width: e[a + 'Width'],\r\n height: e[a + 'Height']\r\n };\r\n },\r\n\r\n /**\r\n * Checks whether given device mode is currently activated.\r\n * @param {string} mode Responsive mode name(e.g: desktop, desktop-and-tablet, tablet, tablet-and-mobile, mobile)\r\n * @returns {boolean} \r\n */\r\n isInResponsiveRange: function(mode) {\r\n var breakpoint = this.getViewPort().width;\r\n\r\n if (mode == 'general') {\r\n return true;\r\n } else if (mode == 'desktop' && breakpoint >= (this.getBreakpoint('lg') + 1)) {\r\n return true;\r\n } else if (mode == 'tablet' && (breakpoint >= (this.getBreakpoint('md') + 1) && breakpoint < this.getBreakpoint('lg'))) {\r\n return true;\r\n } else if (mode == 'mobile' && breakpoint <= this.getBreakpoint('md')) {\r\n return true;\r\n } else if (mode == 'desktop-and-tablet' && breakpoint >= (this.getBreakpoint('md') + 1)) {\r\n return true;\r\n } else if (mode == 'tablet-and-mobile' && breakpoint <= this.getBreakpoint('lg')) {\r\n return true;\r\n } else if (mode == 'minimal-desktop-and-below' && breakpoint <= this.getBreakpoint('xl')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n /**\r\n * Generates unique ID for give prefix.\r\n * @param {string} prefix Prefix for generated ID\r\n * @returns {boolean} \r\n */\r\n getUniqueID: function(prefix) {\r\n return prefix + Math.floor(Math.random() * (new Date()).getTime());\r\n },\r\n\r\n /**\r\n * Gets window width for give breakpoint mode.\r\n * @param {string} mode Responsive mode name(e.g: xl, lg, md, sm)\r\n * @returns {number} \r\n */\r\n getBreakpoint: function(mode) {\r\n if ($.inArray(mode, breakpoints)) {\r\n return breakpoints[mode];\r\n }\r\n },\r\n\r\n /**\r\n * Checks whether object has property matchs given key path.\r\n * @param {object} obj Object contains values paired with given key path\r\n * @param {string} keys Keys path seperated with dots\r\n * @returns {object} \r\n */\r\n isset: function(obj, keys) {\r\n var stone;\r\n\r\n keys = keys || '';\r\n\r\n if (keys.indexOf('[') !== -1) {\r\n throw new Error('Unsupported object path notation.');\r\n }\r\n\r\n keys = keys.split('.');\r\n\r\n do {\r\n if (obj === undefined) {\r\n return false;\r\n }\r\n\r\n stone = keys.shift();\r\n\r\n if (!obj.hasOwnProperty(stone)) {\r\n return false;\r\n }\r\n\r\n obj = obj[stone];\r\n\r\n } while (keys.length);\r\n\r\n return true;\r\n },\r\n\r\n /**\r\n * Gets highest z-index of the given element parents\r\n * @param {object} el jQuery element object\r\n * @returns {number} \r\n */\r\n getHighestZindex: function(el) {\r\n var elem = $(el),\r\n position, value;\r\n\r\n while (elem.length && elem[0] !== document) {\r\n // Ignore z-index if position is set to a value where z-index is ignored by the browser\r\n // This makes behavior of this function consistent across browsers\r\n // WebKit always returns auto if the element is positioned\r\n position = elem.css(\"position\");\r\n\r\n if (position === \"absolute\" || position === \"relative\" || position === \"fixed\") {\r\n // IE returns 0 when zIndex is not specified\r\n // other browsers return a string\r\n // we ignore the case of nested elements with an explicit value of 0\r\n //
\r\n value = parseInt(elem.css(\"zIndex\"), 10);\r\n if (!isNaN(value) && value !== 0) {\r\n return value;\r\n }\r\n }\r\n elem = elem.parent();\r\n }\r\n },\r\n\r\n /**\r\n * Checks whether the element has given classes\r\n * @param {object} el jQuery element object\r\n * @param {string} Classes string\r\n * @returns {boolean} \r\n */\r\n hasClasses: function(el, classes) {\r\n var classesArr = classes.split(\" \");\r\n\r\n for ( var i = 0; i < classesArr.length; i++ ) {\r\n if ( el.hasClass( classesArr[i] ) == false ) {\r\n return false;\r\n }\r\n } \r\n\r\n return true;\r\n },\r\n\r\n /**\r\n * Gets element actual/real width\r\n * @param {object} el jQuery element object\r\n * @returns {number} \r\n */\r\n realWidth: function(el){\r\n var clone = $(el).clone();\r\n clone.css(\"visibility\",\"hidden\");\r\n clone.css('overflow', 'hidden');\r\n clone.css(\"height\",\"0\");\r\n $('body').append(clone);\r\n var width = clone.outerWidth();\r\n clone.remove();\r\n\r\n return width;\r\n },\r\n\r\n /**\r\n * Checks whether the element has any parent with fixed position\r\n * @param {object} el jQuery element object\r\n * @returns {boolean} \r\n */\r\n hasFixedPositionedParent: function(el) {\r\n var result = false;\r\n \r\n el.parents().each(function () {\r\n if ($(this).css('position') == 'fixed') {\r\n result = true;\r\n return;\r\n }\r\n });\r\n\r\n return result;\r\n },\r\n\r\n /**\r\n * Simulates delay\r\n */\r\n sleep: function(milliseconds) {\r\n var start = new Date().getTime();\r\n for (var i = 0; i < 1e7; i++) {\r\n if ((new Date().getTime() - start) > milliseconds){\r\n break;\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Gets randomly generated integer value within given min and max range\r\n * @param {number} min Range start value\r\n * @param {number} min Range end value\r\n * @returns {number} \r\n */\r\n getRandomInt: function(min, max) {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n },\r\n\r\n /**\r\n * Gets state color's hex code by color name\r\n * @param {string} name Color name\r\n * @returns {string} \r\n */\r\n getColor: function(name) {\r\n return colors[name];\r\n },\r\n\r\n /**\r\n * Checks whether Angular library is included\r\n * @returns {boolean} \r\n */\r\n isAngularVersion: function() {\r\n return window.Zone !== undefined ? true : false;\r\n }\r\n }\r\n}();\r\n\r\n//== Initialize mUtil class on document ready\r\n$(document).ready(function() {\r\n mUtil.init();\r\n});\n// jquery extension to add animation class into element\r\njQuery.fn.extend({\r\n animateClass: function(animationName, callback) {\r\n var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';\r\n jQuery(this).addClass('animated ' + animationName).one(animationEnd, function() {\r\n jQuery(this).removeClass('animated ' + animationName);\r\n });\r\n\r\n if (callback) {\r\n jQuery(this).one(animationEnd, callback);\r\n }\r\n },\r\n animateDelay: function(value) {\r\n var vendors = ['webkit-', 'moz-', 'ms-', 'o-', ''];\r\n for (var i = 0; i < vendors.length; i++) {\r\n jQuery(this).css(vendors[i] + 'animation-delay', value);\r\n }\r\n },\r\n animateDuration: function(value) {\r\n var vendors = ['webkit-', 'moz-', 'ms-', 'o-', ''];\r\n for (var i = 0; i < vendors.length; i++) {\r\n jQuery(this).css(vendors[i] + 'animation-duration', value);\r\n }\r\n }\r\n});\n(function ($) {\r\n // Plugin function\r\n $.fn.mDropdown = function (options) {\r\n // Plugin scope variable\r\n var dropdown = {};\r\n var element = $(this);\r\n\r\n // Plugin class\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (!element.data('dropdown')) { \r\n // create instance\r\n Plugin.init(options);\r\n Plugin.build();\r\n Plugin.setup();\r\n \r\n // assign instance to the element \r\n element.data('dropdown', dropdown);\r\n } else {\r\n // get instance from the element\r\n dropdown = element.data('dropdown');\r\n } \r\n\r\n return dropdown;\r\n },\r\n\r\n /**\r\n * Initialize\r\n */\r\n init: function(options) {\r\n dropdown.events = [];\r\n dropdown.eventOne = false;\r\n dropdown.close = element.find('.m-dropdown__close');\r\n dropdown.toggle = element.find('.m-dropdown__toggle');\r\n dropdown.arrow = element.find('.m-dropdown__arrow');\r\n dropdown.wrapper = element.find('.m-dropdown__wrapper');\r\n dropdown.scrollable = element.find('.m-dropdown__scrollable');\r\n dropdown.defaultDropPos = element.hasClass('m-dropdown--up') ? 'up' : 'down';\r\n dropdown.currentDropPos = dropdown.defaultDropPos;\r\n\r\n dropdown.options = $.extend(true, {}, $.fn.mDropdown.defaults, options);\r\n if (element.data('drop-auto') === true) {\r\n dropdown.options.dropAuto = true;\r\n } else if (element.data('drop-auto') === false) {\r\n dropdown.options.dropAuto = false;\r\n } \r\n\r\n if (dropdown.scrollable.length > 0) {\r\n if (dropdown.scrollable.data('min-height')) {\r\n dropdown.options.minHeight = dropdown.scrollable.data('min-height');\r\n }\r\n\r\n if (dropdown.scrollable.data('max-height')) {\r\n dropdown.options.maxHeight = dropdown.scrollable.data('max-height');\r\n }\r\n } \r\n },\r\n\r\n /**\r\n * Build DOM and init event handlers\r\n */\r\n build: function () {\r\n if (mUtil.isMobileDevice()) {\r\n if (element.data('dropdown-toggle') == 'hover' || element.data('dropdown-toggle') == 'click') { \r\n dropdown.options.toggle = 'click';\r\n } else {\r\n dropdown.options.toggle = 'click'; \r\n dropdown.toggle.click(Plugin.toggle); \r\n }\r\n } else {\r\n if (element.data('dropdown-toggle') == 'hover') { \r\n dropdown.options.toggle = 'hover'; \r\n element.mouseleave(Plugin.hide);\r\n } else if(element.data('dropdown-toggle') == 'click') {\r\n dropdown.options.toggle = 'click'; \r\n } else {\r\n if (dropdown.options.toggle == 'hover') {\r\n element.mouseenter(Plugin.show);\r\n element.mouseleave(Plugin.hide);\r\n } else {\r\n dropdown.toggle.click(Plugin.toggle); \r\n }\r\n }\r\n } \r\n\r\n // handle dropdown close icon\r\n if (dropdown.close.length) {\r\n dropdown.close.on('click', Plugin.hide);\r\n }\r\n\r\n // disable dropdown close\r\n Plugin.disableClose();\r\n }, \r\n\r\n /**\r\n * Setup dropdown\r\n */\r\n setup: function () {\r\n if (dropdown.options.placement) {\r\n element.addClass('m-dropdown--' + dropdown.options.placement);\r\n }\r\n\r\n if (dropdown.options.align) {\r\n element.addClass('m-dropdown--align-' + dropdown.options.align);\r\n } \r\n\r\n if (dropdown.options.width) {\r\n dropdown.wrapper.css('width', dropdown.options.width);\r\n }\r\n\r\n if (element.data('dropdown-persistent')) {\r\n dropdown.options.persistent = true;\r\n }\r\n \r\n // handle height\r\n if (dropdown.options.minHeight) {\r\n dropdown.scrollable.css('min-height', dropdown.options.minHeight); \r\n } \r\n\r\n if (dropdown.options.maxHeight) {\r\n dropdown.scrollable.css('max-height', dropdown.options.maxHeight); \r\n dropdown.scrollable.css('overflow-y', 'auto'); \r\n\r\n if (mUtil.isDesktopDevice()) {\r\n mApp.initScroller(dropdown.scrollable, {}); \r\n } \r\n } \r\n\r\n // set zindex\r\n Plugin.setZindex();\r\n },\r\n\r\n /**\r\n * sync \r\n */\r\n sync: function () {\r\n $(element).data('dropdown', dropdown);\r\n }, \r\n\r\n /**\r\n * Sync dropdown object with jQuery element\r\n */\r\n disableClose: function () {\r\n element.on('click', '.m-dropdown--disable-close, .mCSB_1_scrollbar', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n },\r\n\r\n /**\r\n * Toggle dropdown\r\n */\r\n toggle: function () {\r\n if (dropdown.open) {\r\n return Plugin.hide();\r\n } else {\r\n return Plugin.show();\r\n }\r\n },\r\n\r\n /**\r\n * Set content\r\n */\r\n setContent: function (content) {\r\n element.find('.m-dropdown__content').html(content);\r\n \r\n return dropdown;\r\n },\r\n\r\n /**\r\n * Show dropdown\r\n */\r\n show: function() {\r\n if (dropdown.options.toggle == 'hover' && element.data('hover')) {\r\n Plugin.clearHovered(); \r\n return dropdown;\r\n }\r\n\r\n if (dropdown.open) {\r\n return dropdown;\r\n }\r\n\r\n if (dropdown.arrow.length > 0) {\r\n Plugin.adjustArrowPos();\r\n }\r\n\r\n Plugin.eventTrigger('beforeShow'); \r\n\r\n Plugin.hideOpened();\r\n\r\n element.addClass('m-dropdown--open');\r\n\r\n if (mUtil.isMobileDevice() && dropdown.options.mobileOverlay) {\r\n var zIndex = dropdown.wrapper.css('zIndex') - 1;\r\n var dropdownoff = $('
');\r\n\r\n dropdownoff.css('zIndex', zIndex);\r\n dropdownoff.data('dropdown', element);\r\n element.data('dropoff', dropdownoff);\r\n element.after(dropdownoff);\r\n dropdownoff.click(function(e) {\r\n Plugin.hide();\r\n $(this).remove(); \r\n e.preventDefault();\r\n });\r\n } \r\n\r\n element.focus();\r\n element.attr('aria-expanded', 'true');\r\n dropdown.open = true;\r\n\r\n Plugin.handleDropPosition(); \r\n\r\n Plugin.eventTrigger('afterShow');\r\n\r\n return dropdown;\r\n },\r\n\r\n /**\r\n * Clear dropdown hover\r\n */\r\n clearHovered: function () {\r\n element.removeData('hover');\r\n var timeout = element.data('timeout');\r\n element.removeData('timeout');\r\n clearTimeout(timeout);\r\n },\r\n\r\n /**\r\n * Hide hovered dropdown\r\n */\r\n hideHovered: function(force) {\r\n if (force) {\r\n if (Plugin.eventTrigger('beforeHide') === false) {\r\n // cancel hide\r\n return;\r\n } \r\n\r\n Plugin.clearHovered(); \r\n element.removeClass('m-dropdown--open');\r\n dropdown.open = false;\r\n Plugin.eventTrigger('afterHide');\r\n } else {\r\n if (Plugin.eventTrigger('beforeHide') === false) {\r\n // cancel hide\r\n return;\r\n }\r\n var timeout = setTimeout(function() {\r\n if (element.data('hover')) {\r\n Plugin.clearHovered(); \r\n element.removeClass('m-dropdown--open');\r\n dropdown.open = false;\r\n Plugin.eventTrigger('afterHide');\r\n }\r\n }, dropdown.options.hoverTimeout);\r\n\r\n element.data('hover', true);\r\n element.data('timeout', timeout); \r\n } \r\n },\r\n\r\n /**\r\n * Hide clicked dropdown\r\n */\r\n hideClicked: function() { \r\n if (Plugin.eventTrigger('beforeHide') === false) {\r\n // cancel hide\r\n return;\r\n } \r\n element.removeClass('m-dropdown--open');\r\n if (element.data('dropoff')) {\r\n element.data('dropoff').remove();\r\n }\r\n dropdown.open = false;\r\n Plugin.eventTrigger('afterHide');\r\n },\r\n\r\n /**\r\n * Hide dropdown\r\n */\r\n hide: function(force) {\r\n if (dropdown.open === false) {\r\n return dropdown;\r\n }\r\n\r\n if (dropdown.options.toggle == 'hover') {\r\n Plugin.hideHovered(force);\r\n } else {\r\n Plugin.hideClicked();\r\n }\r\n\r\n if (dropdown.defaultDropPos == 'down' && dropdown.currentDropPos == 'up') {\r\n element.removeClass('m-dropdown--up');\r\n dropdown.arrow.prependTo(dropdown.wrapper);\r\n dropdown.currentDropPos = 'down';\r\n }\r\n\r\n return dropdown; \r\n },\r\n\r\n /**\r\n * Hide opened dropdowns\r\n */\r\n hideOpened: function() {\r\n $('.m-dropdown.m-dropdown--open').each(function() {\r\n $(this).mDropdown().hide(true);\r\n });\r\n },\r\n\r\n /**\r\n * Adjust dropdown arrow positions\r\n */\r\n adjustArrowPos: function() {\r\n var width = element.outerWidth();\r\n var alignment = dropdown.arrow.hasClass('m-dropdown__arrow--right') ? 'right' : 'left';\r\n var pos = 0;\r\n\r\n if (dropdown.arrow.length > 0) {\r\n if (mUtil.isInResponsiveRange('mobile') && element.hasClass('m-dropdown--mobile-full-width')) {\r\n pos = element.offset().left + (width / 2) - Math.abs(dropdown.arrow.width() / 2) - parseInt(dropdown.wrapper.css('left'));\r\n dropdown.arrow.css('right', 'auto'); \r\n dropdown.arrow.css('left', pos); \r\n dropdown.arrow.css('margin-left', 'auto');\r\n dropdown.arrow.css('margin-right', 'auto');\r\n } else if (dropdown.arrow.hasClass('m-dropdown__arrow--adjust')) {\r\n pos = width / 2 - Math.abs(dropdown.arrow.width() / 2);\r\n if (element.hasClass('m-dropdown--align-push')) {\r\n pos = pos + 20;\r\n }\r\n if (alignment == 'right') { \r\n dropdown.arrow.css('left', 'auto'); \r\n dropdown.arrow.css('right', pos);\r\n } else { \r\n dropdown.arrow.css('right', 'auto'); \r\n dropdown.arrow.css('left', pos);\r\n } \r\n } \r\n }\r\n },\r\n\r\n /**\r\n * Change dropdown drop position\r\n */\r\n handleDropPosition: function() {\r\n return;\r\n \r\n if (dropdown.options.dropAuto == true) {\r\n if (Plugin.isInVerticalViewport() === false) {\r\n if (dropdown.currentDropPos == 'up') {\r\n element.removeClass('m-dropdown--up');\r\n dropdown.arrow.prependTo(dropdown.wrapper);\r\n dropdown.currentDropPos = 'down';\r\n } else if (dropdown.currentDropPos == 'down') {\r\n element.addClass('m-dropdown--up');\r\n dropdown.arrow.appendTo(dropdown.wrapper);\r\n dropdown.currentDropPos = 'up'; \r\n }\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Get zindex\r\n */\r\n setZindex: function() {\r\n var oldZindex = dropdown.wrapper.css('z-index');\r\n var newZindex = mUtil.getHighestZindex(element);\r\n if (newZindex > oldZindex) {\r\n dropdown.wrapper.css('z-index', zindex);\r\n }\r\n },\r\n\r\n /**\r\n * Check persistent\r\n */\r\n isPersistent: function () {\r\n return dropdown.options.persistent;\r\n },\r\n\r\n /**\r\n * Check persistent\r\n */\r\n isShown: function () {\r\n return dropdown.open;\r\n },\r\n\r\n /**\r\n * Check if dropdown is in viewport\r\n */\r\n isInVerticalViewport: function() {\r\n var el = dropdown.wrapper;\r\n var offset = el.offset();\r\n var height = el.outerHeight();\r\n var width = el.width();\r\n var scrollable = el.find('[data-scrollable]');\r\n\r\n if (scrollable.length) {\r\n if (scrollable.data('max-height')) {\r\n height += parseInt(scrollable.data('max-height'));\r\n } else if(scrollable.data('height')) {\r\n height += parseInt(scrollable.data('height'));\r\n }\r\n }\r\n\r\n return (offset.top + height < $(window).scrollTop() + $(window).height());\r\n },\r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name) {\r\n for (i = 0; i < dropdown.events.length; i++) {\r\n var event = dropdown.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n dropdown.events[i].fired = true;\r\n return event.handler.call(this, dropdown);\r\n }\r\n } else {\r\n return event.handler.call(this, dropdown);\r\n }\r\n }\r\n }\r\n },\r\n\r\n addEvent: function(name, handler, one) {\r\n dropdown.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n\r\n return dropdown;\r\n }\r\n };\r\n\r\n // Run plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n //////////////////////\r\n // ** Public API ** //\r\n //////////////////////\r\n \r\n /**\r\n * Show dropdown\r\n * @returns {mDropdown}\r\n */\r\n dropdown.show = function () {\r\n return Plugin.show();\r\n };\r\n\r\n /**\r\n * Hide dropdown\r\n * @returns {mDropdown}\r\n */\r\n dropdown.hide = function () {\r\n return Plugin.hide();\r\n };\r\n\r\n /**\r\n * Toggle dropdown\r\n * @returns {mDropdown}\r\n */\r\n dropdown.toggle = function () {\r\n return Plugin.toggle();\r\n };\r\n\r\n /**\r\n * Toggle dropdown\r\n * @returns {mDropdown}\r\n */\r\n dropdown.isPersistent = function () {\r\n return Plugin.isPersistent();\r\n };\r\n\r\n /**\r\n * Check shown state\r\n * @returns {mDropdown}\r\n */\r\n dropdown.isShown = function () {\r\n return Plugin.isShown();\r\n };\r\n\r\n /**\r\n * Check shown state\r\n * @returns {mDropdown}\r\n */\r\n dropdown.fixDropPosition = function () {\r\n return Plugin.handleDropPosition();\r\n };\r\n\r\n /**\r\n * Set dropdown content\r\n * @returns {mDropdown}\r\n */\r\n dropdown.setContent = function (content) {\r\n return Plugin.setContent(content);\r\n };\r\n\r\n /**\r\n * Set dropdown content\r\n * @returns {mDropdown}\r\n */\r\n dropdown.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Set dropdown content\r\n * @returns {mDropdown}\r\n */\r\n dropdown.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return dropdown;\r\n };\r\n\r\n // default options\r\n $.fn.mDropdown.defaults = {\r\n toggle: 'click',\r\n hoverTimeout: 300,\r\n skin: 'default',\r\n height: 'auto',\r\n dropAuto: true,\r\n maxHeight: false,\r\n minHeight: false,\r\n persistent: false,\r\n mobileOverlay: true\r\n };\r\n\r\n // global init\r\n if (mUtil.isMobileDevice()) {\r\n $(document).on('click', '[data-dropdown-toggle=\"click\"] .m-dropdown__toggle, [data-dropdown-toggle=\"hover\"] .m-dropdown__toggle', function(e) { \r\n e.preventDefault(); \r\n $(this).parent('.m-dropdown').mDropdown().toggle(); \r\n });\r\n } else {\r\n $(document).on('click', '[data-dropdown-toggle=\"click\"] .m-dropdown__toggle', function(e) { \r\n e.preventDefault();\r\n $(this).parent('.m-dropdown').mDropdown().toggle(); \r\n });\r\n $(document).on('mouseenter', '[data-dropdown-toggle=\"hover\"]', function(e) { \r\n $(this).mDropdown().toggle();\r\n });\r\n }\r\n\r\n // handle global document click\r\n $(document).on('click', function(e) {\r\n $('.m-dropdown.m-dropdown--open').each(function() {\r\n if (!$(this).data('dropdown')) {\r\n return;\r\n } \r\n \r\n var target = $(e.target);\r\n var dropdown = $(this).mDropdown();\r\n var toggle = $(this).find('.m-dropdown__toggle');\r\n\r\n if (toggle.length > 0 && target.is(toggle) !== true && toggle.find(target).length === 0 && target.find(toggle).length === 0 && dropdown.isPersistent() == false) {\r\n dropdown.hide(); \r\n } else if ($(this).find(target).length === 0) {\r\n dropdown.hide(); \r\n }\r\n });\r\n });\r\n}(jQuery));\n(function ($) {\r\n // Plugin function\r\n $.fn.mExample = function (options) {\r\n // Plugin scope variable\r\n var example = {};\r\n var element = $(this);\r\n\r\n // Plugin class\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (!element.data('example')) { \r\n // create instance\r\n Plugin.init(options);\r\n Plugin.build();\r\n Plugin.setup();\r\n \r\n // assign instance to the element \r\n element.data('example', example);\r\n } else {\r\n // get instance from the element\r\n example = element.data('example');\r\n } \r\n\r\n return example;\r\n },\r\n\r\n /**\r\n * Initialize\r\n */\r\n init: function(options) {\r\n example.events = [];\r\n example.scrollable = element.find('.m-example__scrollable');\r\n example.options = $.extend(true, {}, $.fn.mExample.defaults, options);\r\n if (example.scrollable.length > 0) {\r\n if (example.scrollable.data('data-min-height')) {\r\n example.options.minHeight = example.scrollable.data('data-min-height');\r\n }\r\n\r\n if (example.scrollable.data('data-max-height')) {\r\n example.options.maxHeight = example.scrollable.data('data-max-height');\r\n }\r\n } \r\n },\r\n\r\n /**\r\n * Build DOM and init event handlers\r\n */\r\n build: function () {\r\n if (mUtil.isMobileDevice()) {\r\n \r\n } else {\r\n \r\n } \r\n }, \r\n\r\n /**\r\n * Setup example\r\n */\r\n setup: function () {\r\n \r\n },\r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name) {\r\n for (i = 0; i < example.events.length; i++) {\r\n var event = example.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n example.events[i].fired = true;\r\n return event.handler.call(this, example);\r\n }\r\n } else {\r\n return event.handler.call(this, example);\r\n }\r\n }\r\n }\r\n },\r\n\r\n addEvent: function(name, handler, one) {\r\n example.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n }\r\n };\r\n\r\n // Run plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n //////////////////////\r\n // ** Public API ** //\r\n //////////////////////\r\n \r\n\r\n /**\r\n * Set example content\r\n * @returns {mExample}\r\n */\r\n example.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Set example content\r\n * @returns {mExample}\r\n */\r\n example.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return example;\r\n };\r\n\r\n // default options\r\n $.fn.mExample.defaults = {\r\n \r\n };\r\n}(jQuery));\n(function($) {\r\n\r\n // Plugin function\r\n $.fn.mHeader = function(options) {\r\n // Plugin scope variable\r\n var header = this;\r\n var element = $(this);\r\n\r\n // Plugin class\r\n var Plugin = {\r\n /**\r\n * Run plugin\r\n * @returns {mHeader}\r\n */\r\n run: function(options) { \r\n if (element.data('header')) {\r\n header = element.data('header'); \r\n } else {\r\n // reset header\r\n Plugin.init(options);\r\n\r\n // reset header\r\n Plugin.reset();\r\n\r\n // build header\r\n Plugin.build();\r\n\r\n element.data('header', header);\r\n } \r\n\r\n return header;\r\n },\r\n\r\n /**\r\n * Handles subheader click toggle\r\n * @returns {mHeader}\r\n */\r\n init: function(options) { \r\n header.options = $.extend(true, {}, $.fn.mHeader.defaults, options);\r\n },\r\n\r\n /**\r\n * Reset header\r\n * @returns {mHeader}\r\n */\r\n build: function() {\r\n Plugin.toggle(); \r\n },\r\n\r\n toggle: function() {\r\n var lastScrollTop = 0;\r\n\r\n if (header.options.minimize.mobile === false && header.options.minimize.desktop === false) {\r\n return;\r\n } \r\n\r\n $(window).scroll(function() {\r\n var offset = 0;\r\n\r\n if (mUtil.isInResponsiveRange('desktop')) {\r\n offset = header.options.offset.desktop;\r\n on = header.options.minimize.desktop.on;\r\n off = header.options.minimize.desktop.off;\r\n } else if (mUtil.isInResponsiveRange('tablet-and-mobile')) {\r\n offset = header.options.offset.mobile;\r\n on = header.options.minimize.mobile.on;\r\n off = header.options.minimize.mobile.off;\r\n }\r\n\r\n var st = $(this).scrollTop();\r\n\r\n if (header.options.classic) {\r\n if (st > offset){ // down scroll mode\r\n $(\"body\").addClass(on);\r\n $(\"body\").removeClass(off);\r\n } else { // back scroll mode\r\n $(\"body\").addClass(off);\r\n $(\"body\").removeClass(on);\r\n }\r\n } else {\r\n if (st > offset && lastScrollTop < st){ // down scroll mode\r\n $(\"body\").addClass(on);\r\n $(\"body\").removeClass(off);\r\n } else { // back scroll mode\r\n $(\"body\").addClass(off);\r\n $(\"body\").removeClass(on);\r\n }\r\n \r\n lastScrollTop = st;\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * Reset menu\r\n * @returns {mMenu}\r\n */\r\n reset: function() {\r\n }\r\n };\r\n\r\n // Run plugin\r\n Plugin.run.apply(header, [options]);\r\n\r\n //////////////////////\r\n // ** Public API ** //\r\n //////////////////////\r\n\r\n /**\r\n * Disable header for given time\r\n * @returns {jQuery}\r\n */\r\n header.publicMethod = function() {\r\n \t//return Plugin.publicMethod();\r\n };\r\n\r\n // Return plugin instance\r\n return header;\r\n };\r\n\r\n // Plugin default options\r\n $.fn.mHeader.defaults = {\r\n classic: false,\r\n offset: {\r\n mobile: 150,\r\n desktop: 200 \r\n },\r\n minimize: {\r\n mobile: false,\r\n desktop: false\r\n }\r\n }; \r\n}(jQuery));\n(function($) {\r\n\r\n // Plugin function\r\n $.fn.mMenu = function(options) {\r\n // Plugin scope variable\r\n var menu = this;\r\n var element = $(this);\r\n\r\n // Plugin class\r\n var Plugin = {\r\n /**\r\n * Run plugin\r\n * @returns {mMenu}\r\n */\r\n run: function(options, reinit) { \r\n if (element.data('menu') && reinit !== true) {\r\n menu = element.data('menu'); \r\n } else {\r\n // reset menu\r\n Plugin.init(options);\r\n\r\n // reset menu\r\n Plugin.reset();\r\n\r\n // build menu\r\n Plugin.build();\r\n\r\n element.data('menu', menu);\r\n } \r\n\r\n return menu;\r\n },\r\n\r\n /**\r\n * Handles submenu click toggle\r\n * @returns {mMenu}\r\n */\r\n init: function(options) { \r\n menu.events = [];\r\n\r\n // merge default and user defined options\r\n menu.options = $.extend(true, {}, $.fn.mMenu.defaults, options);\r\n\r\n // pause menu\r\n menu.pauseDropdownHoverTime = 0;\r\n },\r\n\r\n /**\r\n * Reset menu\r\n * @returns {mMenu}\r\n */\r\n build: function() {\r\n element.on('click', '.m-menu__toggle', Plugin.handleSubmenuAccordion);\r\n \r\n\r\n // dropdown mode(hoverable)\r\n if (Plugin.getSubmenuMode() === 'dropdown' || Plugin.isConditionalSubmenuDropdown()) { \r\n \t// dropdown submenu - hover toggle\r\n\t element.on({mouseenter: Plugin.handleSubmenuDrodownHoverEnter, mouseleave: Plugin.handleSubmenuDrodownHoverExit}, '[data-menu-submenu-toggle=\"hover\"]');\r\n\r\n\t // dropdown submenu - click toggle\r\n\t element.on('click', '[data-menu-submenu-toggle=\"click\"] .m-menu__toggle', Plugin.handleSubmenuDropdownClick);\r\n }\r\n\r\n element.find('.m-menu__item:not(.m-menu__item--submenu) > .m-menu__link:not(.m-menu__toggle)').click(Plugin.handleLinkClick); \r\n },\r\n\r\n /**\r\n * Reset menu\r\n * @returns {mMenu}\r\n */\r\n reset: function() {\r\n \t// remove accordion handler\r\n \telement.off('click', '.m-menu__toggle', Plugin.handleSubmenuAccordion);\r\n\r\n \t// remove dropdown handlers\r\n \telement.off({mouseenter: Plugin.handleSubmenuDrodownHoverEnter, mouseleave: Plugin.handleSubmenuDrodownHoverExit}, '[data-menu-submenu-toggle=\"hover\"]');\r\n \telement.off('click', '[data-menu-submenu-toggle=\"click\"] .m-menu__toggle', Plugin.handleSubmenuDropdownClick);\r\n\r\n // reset mobile menu attributes\r\n menu.find('.m-menu__submenu, .m-menu__inner').css('display', '');\r\n menu.find('.m-menu__item--hover').removeClass('m-menu__item--hover');\r\n menu.find('.m-menu__item--open:not(.m-menu__item--expanded)').removeClass('m-menu__item--open');\r\n },\r\n\r\n /**\r\n * Get submenu mode for current breakpoint and menu state\r\n * @returns {mMenu}\r\n */\r\n getSubmenuMode: function() { \r\n if (mUtil.isInResponsiveRange('desktop')) {\r\n if (mUtil.isset(menu.options.submenu, 'desktop.state.body')) {\r\n if ($('body').hasClass(menu.options.submenu.desktop.state.body)) {\r\n return menu.options.submenu.desktop.state.mode;\r\n } else {\r\n return menu.options.submenu.desktop.default;\r\n }\r\n } else if (mUtil.isset(menu.options.submenu, 'desktop') ){\r\n return menu.options.submenu.desktop;\r\n }\r\n } else if (mUtil.isInResponsiveRange('tablet') && mUtil.isset(menu.options.submenu, 'tablet')) {\r\n return menu.options.submenu.tablet;\r\n } else if (mUtil.isInResponsiveRange('mobile') && mUtil.isset(menu.options.submenu, 'mobile')) {\r\n return menu.options.submenu.mobile;\r\n } else {\r\n return false;\r\n }\r\n },\r\n\r\n /**\r\n * Get submenu mode for current breakpoint and menu state\r\n * @returns {mMenu}\r\n */\r\n isConditionalSubmenuDropdown: function() {\r\n if (mUtil.isInResponsiveRange('desktop') && mUtil.isset(menu.options.submenu, 'desktop.state.body')) {\r\n return true;\r\n } else {\r\n return false; \r\n } \r\n },\r\n\r\n /**\r\n * Handles menu link click\r\n * @returns {mMenu}\r\n */\r\n handleLinkClick: function(e) { \r\n\r\n if (Plugin.eventTrigger('linkClick', $(this)) === false) {\r\n e.preventDefault();\r\n };\r\n\r\n if (Plugin.getSubmenuMode() === 'dropdown' || Plugin.isConditionalSubmenuDropdown()) { \r\n Plugin.handleSubmenuDropdownClose(e, $(this));\r\n }\r\n },\r\n\r\n /**\r\n * Handles submenu hover toggle\r\n * @returns {mMenu}\r\n */\r\n handleSubmenuDrodownHoverEnter: function(e) {\r\n if (Plugin.getSubmenuMode() === 'accordion') {\r\n return;\r\n }\r\n\r\n if (menu.resumeDropdownHover() === false) {\r\n return;\r\n } \r\n\r\n var item = $(this);\r\n\r\n Plugin.showSubmenuDropdown(item);\r\n\r\n if (item.data('hover') == true) {\r\n Plugin.hideSubmenuDropdown(item, false);\r\n }\r\n },\r\n\r\n /**\r\n * Handles submenu hover toggle\r\n * @returns {mMenu}\r\n */\r\n handleSubmenuDrodownHoverExit: function(e) {\r\n if (menu.resumeDropdownHover() === false) {\r\n return;\r\n }\r\n\r\n if (Plugin.getSubmenuMode() === 'accordion') {\r\n return;\r\n }\r\n\r\n var item = $(this);\r\n var time = menu.options.dropdown.timeout;\r\n\r\n var timeout = setTimeout(function() {\r\n if (item.data('hover') == true) {\r\n Plugin.hideSubmenuDropdown(item, true);\r\n }\r\n }, time);\r\n\r\n item.data('hover', true);\r\n item.data('timeout', timeout);\r\n },\r\n\r\n /**\r\n * Handles submenu click toggle\r\n * @returns {mMenu}\r\n */\r\n handleSubmenuDropdownClick: function(e) {\r\n if (Plugin.getSubmenuMode() === 'accordion') {\r\n return;\r\n }\r\n\r\n var item = $(this).closest('.m-menu__item');\r\n\r\n if (item.data('menu-submenu-mode') == 'accordion') {\r\n return; \r\n }\r\n\r\n if (item.hasClass('m-menu__item--hover') == false) {\r\n item.addClass('m-menu__item--open-dropdown');\r\n Plugin.showSubmenuDropdown(item);\r\n } else {\r\n item.removeClass('m-menu__item--open-dropdown');\r\n Plugin.hideSubmenuDropdown(item, true);\r\n }\r\n\r\n e.preventDefault();\r\n },\r\n\r\n /**\r\n * Handles submenu dropdown close on link click\r\n * @returns {mMenu}\r\n */\r\n handleSubmenuDropdownClose: function(e, el) {\r\n // exit if its not submenu dropdown mode\r\n if (Plugin.getSubmenuMode() === 'accordion') {\r\n return;\r\n }\r\n\r\n var shown = element.find('.m-menu__item.m-menu__item--submenu.m-menu__item--hover');\r\n\r\n // check if currently clicked link's parent item ha\r\n if (shown.length > 0 && el.hasClass('m-menu__toggle') === false && el.find('.m-menu__toggle').length === 0) {\r\n // close opened dropdown menus\r\n shown.each(function() {\r\n Plugin.hideSubmenuDropdown($(this), true); \r\n }); \r\n }\r\n },\r\n\r\n /**\r\n * helper functions\r\n * @returns {mMenu}\r\n */\r\n handleSubmenuAccordion: function(e, el) {\r\n var item = el ? $(el) : $(this);\r\n\r\n if (Plugin.getSubmenuMode() === 'dropdown' && item.closest('.m-menu__item').data('menu-submenu-mode') != 'accordion') {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n var li = item.closest('li');\r\n var submenu = li.children('.m-menu__submenu, .m-menu__inner');\r\n\r\n if (submenu.parent('.m-menu__item--expanded').length != 0) {\r\n //return;\r\n }\r\n\r\n if (submenu.length > 0) {\r\n e.preventDefault();\r\n var speed = menu.options.accordion.slideSpeed;\r\n var hasClosables = false;\r\n \r\n if (li.hasClass('m-menu__item--open') === false) {\r\n // hide other accordions\r\n if (menu.options.accordion.expandAll === false) {\r\n var closables = item.closest('.m-menu__nav, .m-menu__subnav').find('> .m-menu__item.m-menu__item--open.m-menu__item--submenu:not(.m-menu__item--expanded)');\r\n closables.each(function() {\r\n $(this).children('.m-menu__submenu').slideUp(speed, function() {\r\n Plugin.scrollToItem(item);\r\n }); \r\n $(this).removeClass('m-menu__item--open');\r\n });\r\n\r\n if (closables.length > 0) {\r\n hasClosables = true;\r\n }\r\n } \r\n\r\n if (hasClosables) {\r\n submenu.slideDown(speed, function() {\r\n Plugin.scrollToItem(item);\r\n }); \r\n li.addClass('m-menu__item--open');\r\n } else {\r\n submenu.slideDown(speed, function() {\r\n Plugin.scrollToItem(item);\r\n });\r\n li.addClass('m-menu__item--open');\r\n } \r\n } else { \r\n submenu.slideUp(speed, function() {\r\n Plugin.scrollToItem(item);\r\n }); \r\n li.removeClass('m-menu__item--open'); \r\n }\r\n }\r\n }, \r\n\r\n /**\r\n * scroll to item function\r\n * @returns {mMenu}\r\n */\r\n scrollToItem: function(item) {\r\n // handle auto scroll for accordion submenus\r\n if (mUtil.isInResponsiveRange('desktop') && menu.options.accordion.autoScroll && !element.data('menu-scrollable')) { \r\n mApp.scrollToViewport(item);\r\n }\r\n },\r\n\r\n /**\r\n * helper functions\r\n * @returns {mMenu}\r\n */\r\n hideSubmenuDropdown: function(item, classAlso) {\r\n // remove submenu activation class\r\n if (classAlso) {\r\n item.removeClass('m-menu__item--hover');\r\n }\r\n // clear timeout\r\n item.removeData('hover');\r\n if (item.data('menu-dropdown-toggle-class')) {\r\n $('body').removeClass(item.data('menu-dropdown-toggle-class'));\r\n }\r\n var timeout = item.data('timeout');\r\n item.removeData('timeout');\r\n clearTimeout(timeout);\r\n },\r\n\r\n /**\r\n * helper functions\r\n * @returns {mMenu}\r\n */\r\n showSubmenuDropdown: function(item) {\r\n // close active submenus\r\n element.find('.m-menu__item--submenu.m-menu__item--hover').each(function() {\r\n var el = $(this);\r\n if (item.is(el) || el.find(item).length > 0 || item.find(el).length > 0) {\r\n return;\r\n } else {\r\n Plugin.hideSubmenuDropdown(el, true); \r\n }\r\n });\r\n\r\n // adjust submenu position\r\n Plugin.adjustSubmenuDropdownArrowPos(item);\r\n \r\n // add submenu activation class\r\n item.addClass('m-menu__item--hover');\r\n\r\n if (item.data('menu-dropdown-toggle-class')) {\r\n $('body').addClass(item.data('menu-dropdown-toggle-class'));\r\n } \r\n\r\n // handle auto scroll for accordion submenus\r\n if (Plugin.getSubmenuMode() === 'accordion' && menu.options.accordion.autoScroll) {\r\n mApp.scrollTo(item.children('.m-menu__item--submenu'));\r\n } \r\n }, \r\n\r\n /**\r\n * Handles submenu click toggle\r\n * @returns {mMenu}\r\n */\r\n resize: function(e) {\r\n if (Plugin.getSubmenuMode() !== 'dropdown') {\r\n return;\r\n }\r\n\r\n var resize = element.find('> .m-menu__nav > .m-menu__item--resize');\r\n var submenu = resize.find('> .m-menu__submenu');\r\n var breakpoint;\r\n var currentWidth = mUtil.getViewPort().width;\r\n var itemsNumber = element.find('> .m-menu__nav > .m-menu__item').length - 1;\r\n var check;\r\n\r\n if (\r\n Plugin.getSubmenuMode() == 'dropdown' && \r\n (\r\n (mUtil.isInResponsiveRange('desktop') && mUtil.isset(menu.options, 'resize.desktop') && (check = menu.options.resize.desktop) && currentWidth <= (breakpoint = resize.data('menu-resize-desktop-breakpoint'))) ||\r\n (mUtil.isInResponsiveRange('tablet') && mUtil.isset(menu.options, 'resize.tablet') && (check = menu.options.resize.tablet) && currentWidth <= (breakpoint = resize.data('menu-resize-tablet-breakpoint'))) ||\r\n (mUtil.isInResponsiveRange('mobile') && mUtil.isset(menu.options, 'resize.mobile') && (check = menu.options.resize.mobile) && currentWidth <= (breakpoint = resize.data('menu-resize-mobile-breakpoint')))\r\n )\r\n ) {\r\n \r\n var moved = submenu.find('> .m-menu__subnav > .m-menu__item').length; // currently move\r\n var left = element.find('> .m-menu__nav > .m-menu__item:not(.m-menu__item--resize)').length; // currently left\r\n var total = moved + left;\r\n\r\n if (check.apply() === true) {\r\n // return\r\n if (moved > 0) {\r\n submenu.find('> .m-menu__subnav > .m-menu__item').each(function() {\r\n var item = $(this);\r\n\r\n var elementsNumber = submenu.find('> .m-menu__nav > .m-menu__item:not(.m-menu__item--resize)').length;\r\n element.find('> .m-menu__nav > .m-menu__item:not(.m-menu__item--resize)').eq(elementsNumber - 1).after(item);\r\n\r\n if (check.apply() === false) {\r\n item.appendTo(submenu.find('> .m-menu__subnav'));\r\n return false;\r\n } \r\n\r\n moved--;\r\n left++; \r\n });\r\n }\r\n } else {\r\n // move\r\n if (left > 0) {\r\n var items = element.find('> .m-menu__nav > .m-menu__item:not(.m-menu__item--resize)');\r\n var index = items.length - 1;\r\n \r\n for(var i = 0; i < items.length; i++) {\r\n var item = $(items.get(index)); \r\n index--;\r\n\r\n if (check.apply() === true) {\r\n break;\r\n }\r\n\r\n item.appendTo(submenu.find('> .m-menu__subnav'));\r\n\r\n moved++;\r\n left--; \r\n } \r\n }\r\n }\r\n\r\n if (moved > 0) {\r\n resize.show(); \r\n } else {\r\n resize.hide();\r\n } \r\n } else { \r\n submenu.find('> .m-menu__subnav > .m-menu__item').each(function() {\r\n var elementsNumber = submenu.find('> .m-menu__subnav > .m-menu__item').length;\r\n element.find('> .m-menu__nav > .m-menu__item').get(elementsNumber).after($(this));\r\n });\r\n\r\n resize.hide();\r\n }\r\n },\r\n\r\n /**\r\n * Handles submenu slide toggle\r\n * @returns {mMenu}\r\n */\r\n createSubmenuDropdownClickDropoff: function(el) {\r\n var zIndex = el.find('> .m-menu__submenu').css('zIndex') - 1;\r\n var dropoff = $('
');\r\n $('body').after(dropoff);\r\n dropoff.on('click', function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n $(this).remove();\r\n\r\n alert(1);\r\n Plugin.hideSubmenuDropdown(el, true); \r\n });\r\n },\r\n\r\n /**\r\n * Handles submenu click toggle\r\n * @returns {mMenu}\r\n */\r\n adjustSubmenuDropdownArrowPos: function(item) { \r\n var arrow = item.find('> .m-menu__submenu > .m-menu__arrow.m-menu__arrow--adjust');\r\n var submenu = item.find('> .m-menu__submenu');\r\n var subnav = item.find('> .m-menu__submenu > .m-menu__subnav');\r\n \r\n if (arrow.length > 0) {\r\n var pos;\r\n var link = item.children('.m-menu__link');\r\n\r\n if (submenu.hasClass('m-menu__submenu--classic') || submenu.hasClass('m-menu__submenu--fixed')) { \r\n if (submenu.hasClass('m-menu__submenu--right')) {\r\n pos = item.outerWidth() / 2;\r\n if (submenu.hasClass('m-menu__submenu--pull')) {\r\n pos = pos + Math.abs(parseInt(submenu.css('margin-right'))); \r\n } \r\n pos = submenu.width() - pos;\r\n } else if (submenu.hasClass('m-menu__submenu--left')) {\r\n pos = item.outerWidth() / 2;\r\n if (submenu.hasClass('m-menu__submenu--pull')) {\r\n pos = pos + Math.abs(parseInt(submenu.css('margin-left'))); \r\n } \r\n }\r\n } else {\r\n if (submenu.hasClass('m-menu__submenu--center') || submenu.hasClass('m-menu__submenu--full')) {\r\n pos = item.offset().left - ((mUtil.getViewPort().width - submenu.outerWidth()) / 2);\r\n pos = pos + (item.outerWidth() / 2);\r\n } else if (submenu.hasClass('m-menu__submenu--left')) {\r\n // to do\r\n } else if (submenu.hasClass('m-menu__submenu--right')) {\r\n // to do\r\n }\r\n } \r\n\r\n arrow.css('left', pos);\r\n }\r\n },\r\n\r\n /**\r\n * Handles submenu hover toggle\r\n * @returns {mMenu}\r\n */\r\n pauseDropdownHover: function(time) {\r\n \tvar date = new Date();\r\n\r\n \tmenu.pauseDropdownHoverTime = date.getTime() + time;\r\n },\r\n\r\n /**\r\n * Handles submenu hover toggle\r\n * @returns {mMenu}\r\n */\r\n resumeDropdownHover: function() {\r\n \tvar date = new Date();\r\n\r\n \treturn (date.getTime() > menu.pauseDropdownHoverTime ? true : false);\r\n },\r\n\r\n /**\r\n * Reset menu's current active item\r\n * @returns {mMenu}\r\n */\r\n resetActiveItem: function(item) {\r\n element.find('.m-menu__item--active').each(function() {\r\n $(this).removeClass('m-menu__item--active');\r\n $(this).children('.m-menu__submenu').css('display', '');\r\n\r\n $(this).parents('.m-menu__item--submenu').each(function() {\r\n $(this).removeClass('m-menu__item--open');\r\n $(this).children('.m-menu__submenu').css('display', '');\r\n });\r\n }); \r\n\r\n // close open submenus\r\n if (menu.options.accordion.expandAll === false) {\r\n element.find('.m-menu__item--open').each(function() {\r\n $(this).removeClass('m-menu__item--open');\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * Sets menu's active item\r\n * @returns {mMenu}\r\n */\r\n setActiveItem: function(item) {\r\n // reset current active item\r\n Plugin.resetActiveItem();\r\n\r\n var item = $(item);\r\n item.addClass('m-menu__item--active');\r\n item.parents('.m-menu__item--submenu').each(function() {\r\n $(this).addClass('m-menu__item--open');\r\n });\r\n },\r\n\r\n /**\r\n * Returns page breadcrumbs for the menu's active item\r\n * @returns {mMenu}\r\n */\r\n getBreadcrumbs: function(item) {\r\n var breadcrumbs = [];\r\n var item = $(item);\r\n var link = item.children('.m-menu__link');\r\n\r\n breadcrumbs.push({\r\n text: link.find('.m-menu__link-text').html(), \r\n title: link.attr('title'),\r\n href: link.attr('href')\r\n });\r\n\r\n item.parents('.m-menu__item--submenu').each(function() {\r\n var submenuLink = $(this).children('.m-menu__link');\r\n breadcrumbs.push({\r\n text: submenuLink.find('.m-menu__link-text').html(), \r\n title: submenuLink.attr('title'),\r\n href: submenuLink.attr('href')\r\n });\r\n });\r\n\r\n breadcrumbs.reverse();\r\n\r\n return breadcrumbs;\r\n },\r\n\r\n /**\r\n * Returns page title for the menu's active item\r\n * @returns {mMenu}\r\n */\r\n getPageTitle: function(item) {\r\n item = $(item); \r\n\r\n return item.children('.m-menu__link').find('.m-menu__link-text').html();\r\n },\r\n\r\n /**\r\n * Sync \r\n */\r\n sync: function () {\r\n $(element).data('menu', menu);\r\n }, \r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name, args) {\r\n for (i = 0; i < menu.events.length; i++) {\r\n var event = menu.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n menu.events[i].fired = true;\r\n return event.handler.call(this, menu, args);\r\n }\r\n } else {\r\n return event.handler.call(this, menu, args);\r\n }\r\n }\r\n }\r\n },\r\n\r\n addEvent: function(name, handler, one) {\r\n menu.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n }\r\n };\r\n\r\n // Run plugin\r\n Plugin.run.apply(menu, [options]);\r\n\r\n // Handle plugin on window resize\r\n if (typeof(options) !== \"undefined\") {\r\n $(window).resize(function() {\r\n Plugin.run.apply(menu, [options, true]);\r\n }); \r\n } \r\n\r\n //////////////////////\r\n // ** Public API ** //\r\n //////////////////////\r\n\r\n /**\r\n * Set active menu item\r\n */\r\n menu.setActiveItem = function(item) {\r\n return Plugin.setActiveItem(item);\r\n };\r\n\r\n /**\r\n * Set breadcrumb for menu item\r\n */\r\n menu.getBreadcrumbs = function(item) {\r\n return Plugin.getBreadcrumbs(item);\r\n };\r\n\r\n /**\r\n * Set page title for menu item\r\n */\r\n menu.getPageTitle = function(item) {\r\n return Plugin.getPageTitle(item);\r\n };\r\n\r\n /**\r\n * Get submenu mode\r\n */\r\n menu.getSubmenuMode = function() {\r\n return Plugin.getSubmenuMode();\r\n };\r\n\r\n /**\r\n * Hide dropdown submenu\r\n * @returns {jQuery}\r\n */\r\n menu.hideDropdown = function(item) {\r\n Plugin.hideSubmenuDropdown(item, true);\r\n };\r\n\r\n /**\r\n * Disable menu for given time\r\n * @returns {jQuery}\r\n */\r\n menu.pauseDropdownHover = function(time) {\r\n \tPlugin.pauseDropdownHover(time);\r\n };\r\n\r\n /**\r\n * Disable menu for given time\r\n * @returns {jQuery}\r\n */\r\n menu.resumeDropdownHover = function() {\r\n \treturn Plugin.resumeDropdownHover();\r\n };\r\n\r\n /**\r\n * Register event\r\n */\r\n menu.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n // Return plugin instance\r\n return menu;\r\n };\r\n\r\n // Plugin default options\r\n $.fn.mMenu.defaults = {\r\n // accordion submenu mode\r\n accordion: { \r\n slideSpeed: 200, // accordion toggle slide speed in milliseconds\r\n autoScroll: true, // enable auto scrolling(focus) to the clicked menu item\r\n expandAll: true // allow having multiple expanded accordions in the menu\r\n },\r\n \r\n // dropdown submenu mode\r\n dropdown: {\r\n timeout: 500 // timeout in milliseconds to show and hide the hoverable submenu dropdown\r\n }\r\n }; \r\n\r\n // Plugin global lazy initialization\r\n $(document).on('click', function(e) {\r\n $('.m-menu__nav .m-menu__item.m-menu__item--submenu.m-menu__item--hover[data-menu-submenu-toggle=\"click\"]').each(function() {\r\n var element = $(this).parent('.m-menu__nav').parent();\r\n menu = element.mMenu(); \r\n \r\n if (menu.getSubmenuMode() !== 'dropdown') { \r\n return;\r\n }\r\n\r\n if ($(e.target).is(element) == false && element.find($(e.target)).length == 0) {\r\n var items = element.find('.m-menu__item--submenu.m-menu__item--hover[data-menu-submenu-toggle=\"click\"]');\r\n items.each(function() {\r\n menu.hideDropdown($(this));\r\n });\r\n } \r\n });\r\n });\r\n}(jQuery));\n(function ($) {\r\n // Plugin function\r\n $.fn.mMessenger = function (options) {\r\n // Plugin scope variable\r\n var messenger = {};\r\n var element = $(this);\r\n\r\n // Plugin class\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (!element.data('messenger')) { \r\n // create instance\r\n Plugin.init(options);\r\n Plugin.build();\r\n Plugin.setup();\r\n \r\n // assign instance to the element \r\n element.data('messenger', messenger);\r\n } else {\r\n // get instance from the element\r\n messenger = element.data('messenger');\r\n } \r\n\r\n return messenger;\r\n },\r\n\r\n /**\r\n * Initialize\r\n */\r\n init: function(options) {\r\n messenger.events = [];\r\n messenger.scrollable = element.find('.m-messenger__scrollable');\r\n messenger.options = $.extend(true, {}, $.fn.mMessenger.defaults, options);\r\n if (messenger.scrollable.length > 0) {\r\n if (messenger.scrollable.data('data-min-height')) {\r\n messenger.options.minHeight = messenger.scrollable.data('data-min-height');\r\n }\r\n\r\n if (messenger.scrollable.data('data-max-height')) {\r\n messenger.options.maxHeight = messenger.scrollable.data('data-max-height');\r\n }\r\n } \r\n },\r\n\r\n /**\r\n * Build DOM and init event handlers\r\n */\r\n build: function () {\r\n if (mUtil.isMobileDevice()) {\r\n \r\n } else {\r\n \r\n } \r\n }, \r\n\r\n /**\r\n * Setup messenger\r\n */\r\n setup: function () {\r\n \r\n },\r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name) {\r\n for (i = 0; i < messenger.events.length; i++) {\r\n var event = messenger.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n messenger.events[i].fired = true;\r\n return event.handler.call(this, messenger);\r\n }\r\n } else {\r\n return event.handler.call(this, messenger);\r\n }\r\n }\r\n }\r\n },\r\n\r\n addEvent: function(name, handler, one) {\r\n messenger.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n }\r\n };\r\n\r\n // Run plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n //////////////////////\r\n // ** Public API ** //\r\n //////////////////////\r\n \r\n\r\n /**\r\n * Set messenger content\r\n * @returns {mMessenger}\r\n */\r\n messenger.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Set messenger content\r\n * @returns {mMessenger}\r\n */\r\n messenger.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return messenger;\r\n };\r\n\r\n // default options\r\n $.fn.mMessenger.defaults = {\r\n \r\n };\r\n}(jQuery));\n(function($) {\r\n // plugin setup\r\n $.fn.mOffcanvas = function(options) {\r\n // main object\r\n var offcanvas = this;\r\n var element = $(this);\r\n\r\n /********************\r\n ** PRIVATE METHODS\r\n ********************/\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (!element.data('offcanvas')) { \r\n // create instance\r\n Plugin.init(options);\r\n Plugin.build();\r\n \r\n // assign instance to the element \r\n element.data('offcanvas', offcanvas);\r\n } else {\r\n // get instance from the element\r\n offcanvas = element.data('offcanvas');\r\n } \r\n\r\n return offcanvas;\r\n },\r\n\r\n /**\r\n * Handles suboffcanvas click toggle\r\n */\r\n init: function(options) {\r\n offcanvas.events = [];\r\n\r\n // merge default and user defined options\r\n offcanvas.options = $.extend(true, {}, $.fn.mOffcanvas.defaults, options);\r\n\r\n offcanvas.overlay;\r\n \r\n offcanvas.classBase = offcanvas.options.class;\r\n offcanvas.classShown = offcanvas.classBase + '--on';\r\n offcanvas.classOverlay = offcanvas.classBase + '-overlay';\r\n \r\n offcanvas.state = element.hasClass(offcanvas.classShown) ? 'shown' : 'hidden';\r\n offcanvas.close = offcanvas.options.close;\r\n\r\n if (offcanvas.options.toggle && offcanvas.options.toggle.target) {\r\n offcanvas.toggleTarget = offcanvas.options.toggle.target;\r\n offcanvas.toggleState = offcanvas.options.toggle.state;\r\n } else {\r\n offcanvas.toggleTarget = offcanvas.options.toggle; \r\n offcanvas.toggleState = '';\r\n }\r\n },\r\n\r\n /**\r\n * Setup offcanvas\r\n */\r\n build: function() {\r\n // offcanvas toggle\r\n $(offcanvas.toggleTarget).on('click', Plugin.toggle);\r\n\r\n if (offcanvas.close) {\r\n $(offcanvas.close).on('click', Plugin.hide);\r\n }\r\n },\r\n\r\n /**\r\n * sync \r\n */\r\n sync: function () {\r\n $(element).data('offcanvas', offcanvas);\r\n }, \r\n\r\n /**\r\n * Handles offcanvas click toggle\r\n */\r\n toggle: function() {\r\n if (offcanvas.state == 'shown') {\r\n Plugin.hide();\r\n } else {\r\n Plugin.show();\r\n }\r\n },\r\n\r\n /**\r\n * Handles offcanvas click toggle\r\n */\r\n show: function() {\r\n if (offcanvas.state == 'shown') {\r\n return;\r\n }\r\n\r\n Plugin.eventTrigger('beforeShow');\r\n\r\n if (offcanvas.toggleState != '') {\r\n $(offcanvas.toggleTarget).addClass(offcanvas.toggleState);\r\n }\r\n \r\n $('body').addClass(offcanvas.classShown);\r\n element.addClass(offcanvas.classShown);\r\n\r\n offcanvas.state = 'shown';\r\n\r\n if (offcanvas.options.overlay) {\r\n var overlay = $('
'); \r\n element.after(overlay);\r\n offcanvas.overlay = overlay;\r\n offcanvas.overlay.on('click', function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n Plugin.hide();\r\n });\r\n } \r\n\r\n Plugin.eventTrigger('afterShow');\r\n\r\n return offcanvas;\r\n },\r\n\r\n /**\r\n * Handles offcanvas click toggle\r\n */\r\n hide: function() {\r\n if (offcanvas.state == 'hidden') {\r\n return;\r\n }\r\n\r\n Plugin.eventTrigger('beforeHide');\r\n\r\n if (offcanvas.toggleState != '') {\r\n $(offcanvas.toggleTarget).removeClass(offcanvas.toggleState);\r\n }\r\n\r\n $('body').removeClass(offcanvas.classShown)\r\n element.removeClass(offcanvas.classShown);\r\n\r\n offcanvas.state = 'hidden';\r\n\r\n if (offcanvas.options.overlay) {\r\n offcanvas.overlay.remove();\r\n } \r\n\r\n Plugin.eventTrigger('afterHide');\r\n\r\n return offcanvas;\r\n },\r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name) {\r\n for (i = 0; i < offcanvas.events.length; i++) {\r\n var event = offcanvas.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n offcanvas.events[i].fired = true;\r\n return event.handler.call(this, offcanvas);\r\n }\r\n } else {\r\n return event.handler.call(this, offcanvas);\r\n }\r\n }\r\n }\r\n },\r\n\r\n addEvent: function(name, handler, one) {\r\n offcanvas.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n }\r\n };\r\n\r\n // main variables\r\n var the = this;\r\n \r\n // init plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n /********************\r\n ** PUBLIC API METHODS\r\n ********************/\r\n\r\n /**\r\n * Hide \r\n */\r\n offcanvas.hide = function () {\r\n return Plugin.hide();\r\n };\r\n\r\n /**\r\n * Show \r\n */\r\n offcanvas.show = function () {\r\n return Plugin.show();\r\n };\r\n\r\n /**\r\n * Get suboffcanvas mode\r\n */\r\n offcanvas.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Set offcanvas content\r\n * @returns {mOffcanvas}\r\n */\r\n offcanvas.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return offcanvas;\r\n };\r\n\r\n // default options\r\n $.fn.mOffcanvas.defaults = {\r\n \r\n }; \r\n}(jQuery));\n(function ($) {\r\n // Plugin function\r\n $.fn.mPortlet = function (options) {\r\n // Plugin scope variable\r\n var portlet = {};\r\n var element = $(this);\r\n\r\n // Plugin class\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (element.data('portlet-object')) { \r\n // get instance from the element\r\n portlet = element.data('portlet-object');\r\n } else { \r\n // create instance \r\n Plugin.init(options);\r\n Plugin.build();\r\n \r\n // assign instance to the element \r\n element.data('portlet-object', portlet);\r\n } \r\n\r\n return portlet;\r\n },\r\n\r\n /**\r\n * Initialize\r\n */\r\n init: function(options) {\r\n portlet.options = $.extend(true, {}, $.fn.mPortlet.defaults, options);\r\n portlet.events = [];\r\n portlet.eventOne = false; \r\n\r\n if ( element.find('> .m-portlet__body').length !== 0 ) {\r\n portlet.body = element.find('> .m-portlet__body');\r\n } else if ( element.find('> .m-form').length !== 0 ) {\r\n portlet.body = element.find('> .m-form');\r\n }\r\n },\r\n\r\n /**\r\n * Build DOM and init event handlers\r\n */\r\n build: function () {\r\n // remove\r\n var remove = element.find('> .m-portlet__head [data-portlet-tool=remove]');\r\n if (remove.length === 1) {\r\n remove.click(function(e) {\r\n e.preventDefault();\r\n Plugin.remove();\r\n });\r\n } \r\n\r\n // reload\r\n var reload = element.find('> .m-portlet__head [data-portlet-tool=reload]')\r\n if (reload.length === 1) {\r\n reload.click(function(e) {\r\n e.preventDefault();\r\n Plugin.reload();\r\n });\r\n }\r\n\r\n // toggle\r\n var toggle = element.find('> .m-portlet__head [data-portlet-tool=toggle]');\r\n if (toggle.length === 1) {\r\n toggle.click(function(e) {\r\n e.preventDefault();\r\n Plugin.toggle();\r\n });\r\n }\r\n\r\n // fullscreen\r\n var fullscreen = element.find('> .m-portlet__head [data-portlet-tool=fullscreen]');\r\n if (fullscreen.length === 1) {\r\n fullscreen.click(function(e) {\r\n e.preventDefault();\r\n Plugin.fullscreen();\r\n });\r\n } \r\n\r\n Plugin.setupTooltips();\r\n }, \r\n\r\n /**\r\n * Remove portlet\r\n */\r\n remove: function () {\r\n if (Plugin.eventTrigger('beforeRemove') === false) {\r\n return;\r\n }\r\n\r\n if ( $('body').hasClass('m-portlet--fullscreen') && element.hasClass('m-portlet--fullscreen') ) {\r\n Plugin.fullscreen('off');\r\n }\r\n\r\n Plugin.removeTooltips();\r\n\r\n element.remove();\r\n \r\n Plugin.eventTrigger('afterRemove');\r\n }, \r\n\r\n /**\r\n * Set content\r\n */\r\n setContent: function (html) {\r\n if (html) {\r\n portlet.body.html(html);\r\n } \r\n },\r\n\r\n /**\r\n * Get body\r\n */\r\n getBody: function () {\r\n return portlet.body;\r\n },\r\n\r\n /**\r\n * Get self\r\n */\r\n getSelf: function () {\r\n return element;\r\n },\r\n\r\n /**\r\n * Setup tooltips\r\n */\r\n setupTooltips: function () {\r\n if (portlet.options.tooltips) {\r\n var collapsed = element.hasClass('m-portlet--collapse') || element.hasClass('m-portlet--collapsed');\r\n var fullscreenOn = $('body').hasClass('m-portlet--fullscreen') && element.hasClass('m-portlet--fullscreen');\r\n\r\n var remove = element.find('> .m-portlet__head [data-portlet-tool=remove]');\r\n if (remove.length === 1) {\r\n remove.attr('title', portlet.options.tools.remove);\r\n remove.data('placement', fullscreenOn ? 'bottom' : 'top');\r\n remove.data('offset', fullscreenOn ? '0,10px,0,0' : '0,5px');\r\n remove.tooltip('dispose');\r\n mApp.initTooltip(remove);\r\n }\r\n\r\n var reload = element.find('> .m-portlet__head [data-portlet-tool=reload]');\r\n if (reload.length === 1) {\r\n reload.attr('title', portlet.options.tools.reload);\r\n reload.data('placement', fullscreenOn ? 'bottom' : 'top');\r\n reload.data('offset', fullscreenOn ? '0,10px,0,0' : '0,5px');\r\n reload.tooltip('dispose');\r\n mApp.initTooltip(reload);\r\n }\r\n\r\n var toggle = element.find('> .m-portlet__head [data-portlet-tool=toggle]');\r\n if (toggle.length === 1) {\r\n if (collapsed) {\r\n toggle.attr('title', portlet.options.tools.toggle.expand);\r\n } else {\r\n toggle.attr('title', portlet.options.tools.toggle.collapse);\r\n }\r\n toggle.data('placement', fullscreenOn ? 'bottom' : 'top');\r\n toggle.data('offset', fullscreenOn ? '0,10px,0,0' : '0,5px');\r\n toggle.tooltip('dispose');\r\n mApp.initTooltip(toggle);\r\n }\r\n\r\n var fullscreen = element.find('> .m-portlet__head [data-portlet-tool=fullscreen]');\r\n if (fullscreen.length === 1) {\r\n if (fullscreenOn) {\r\n fullscreen.attr('title', portlet.options.tools.fullscreen.off);\r\n } else {\r\n fullscreen.attr('title', portlet.options.tools.fullscreen.on);\r\n }\r\n fullscreen.data('placement', fullscreenOn ? 'bottom' : 'top');\r\n fullscreen.data('offset', fullscreenOn ? '0,10px,0,0' : '0,5px');\r\n fullscreen.tooltip('dispose');\r\n mApp.initTooltip(fullscreen);\r\n } \r\n } \r\n },\r\n\r\n /**\r\n * Setup tooltips\r\n */\r\n removeTooltips: function () {\r\n if (portlet.options.tooltips) {\r\n var remove = element.find('> .m-portlet__head [data-portlet-tool=remove]');\r\n if (remove.length === 1) {\r\n remove.tooltip('dispose');\r\n }\r\n\r\n var reload = element.find('> .m-portlet__head [data-portlet-tool=reload]');\r\n if (reload.length === 1) {\r\n reload.tooltip('dispose');\r\n }\r\n\r\n var toggle = element.find('> .m-portlet__head [data-portlet-tool=toggle]');\r\n if (toggle.length === 1) {\r\n toggle.tooltip('dispose');\r\n }\r\n\r\n var fullscreen = element.find('> .m-portlet__head [data-portlet-tool=fullscreen]');\r\n if (fullscreen.length === 1) {\r\n fullscreen.tooltip('dispose');\r\n } \r\n } \r\n },\r\n\r\n /**\r\n * Reload\r\n */\r\n reload: function () {\r\n Plugin.eventTrigger('reload'); \r\n },\r\n\r\n /**\r\n * Toggle\r\n */\r\n toggle: function (mode) {\r\n if (mode === 'collapse' || element.hasClass('m-portlet--collapse') || element.hasClass('m-portlet--collapsed')) {\r\n if (Plugin.eventTrigger('beforeExpand') === false) {\r\n return;\r\n } \r\n\r\n portlet.body.slideDown(portlet.options.bodyToggleSpeed, function(){ \r\n Plugin.eventTrigger('afterExpand'); \r\n });\r\n\r\n element.removeClass('m-portlet--collapse');\r\n element.removeClass('m-portlet--collapsed');\r\n Plugin.setupTooltips();\r\n \r\n } else {\r\n if (Plugin.eventTrigger('beforeCollapse') === false) {\r\n return;\r\n } \r\n\r\n portlet.body.slideUp(portlet.options.bodyToggleSpeed, function() { \r\n Plugin.eventTrigger('afterCollapse'); \r\n });\r\n\r\n element.addClass('m-portlet--collapse');\r\n Plugin.setupTooltips(); \r\n } \r\n },\r\n\r\n /**\r\n * Toggle\r\n */\r\n fullscreen: function (mode) {\r\n var d = {};\r\n var speed = 300;\r\n\r\n if (mode === 'off' || ($('body').hasClass('m-portlet--fullscreen') && element.hasClass('m-portlet--fullscreen'))) {\r\n Plugin.eventTrigger('beforeFullscreenOff');\r\n\r\n $('body').removeClass('m-portlet--fullscreen');\r\n element.removeClass('m-portlet--fullscreen');\r\n\r\n Plugin.setupTooltips();\r\n \r\n Plugin.eventTrigger('afterFullscreenOff');\r\n } else {\r\n Plugin.eventTrigger('beforeFullscreenOn');\r\n\r\n element.addClass('m-portlet--fullscreen');\r\n $('body').addClass('m-portlet--fullscreen');\r\n\r\n Plugin.setupTooltips();\r\n \r\n Plugin.eventTrigger('afterFullscreenOn');\r\n } \r\n }, \r\n\r\n /**\r\n * sync \r\n */\r\n sync: function () {\r\n $(element).data('portlet', portlet);\r\n },\r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name) {\r\n for (i = 0; i < portlet.events.length; i++) {\r\n var event = portlet.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n portlet.events[i].fired = true;\r\n return event.handler.call(this, portlet);\r\n }\r\n } else {\r\n return event.handler.call(this, portlet);\r\n }\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Add event\r\n */\r\n addEvent: function(name, handler, one) {\r\n portlet.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n\r\n return portlet;\r\n }\r\n };\r\n\r\n // Run plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n //////////////////////\r\n // ** Public API ** //\r\n //////////////////////\r\n \r\n /**\r\n * Remove portlet\r\n * @returns {mPortlet}\r\n */\r\n portlet.remove = function () {\r\n return Plugin.remove(html);\r\n };\r\n\r\n /**\r\n * Reload portlet\r\n * @returns {mPortlet}\r\n */\r\n portlet.reload = function () {\r\n return Plugin.reload();\r\n };\r\n\r\n /**\r\n * Set portlet content\r\n * @returns {mPortlet}\r\n */\r\n portlet.setContent = function (html) {\r\n return Plugin.setContent(html);\r\n };\r\n\r\n /**\r\n * Collapse portlet\r\n * @returns {mPortlet}\r\n */\r\n portlet.collapse = function () {\r\n return Plugin.toggle('collapse');\r\n };\r\n\r\n /**\r\n * Expand portlet\r\n * @returns {mPortlet}\r\n */\r\n portlet.expand = function () {\r\n return Plugin.toggle('expand');\r\n };\r\n\r\n /**\r\n * Fullscreen portlet\r\n * @returns {mPortlet}\r\n */\r\n portlet.fullscreen = function () {\r\n return Plugin.fullscreen('on');\r\n };\r\n\r\n /**\r\n * Fullscreen portlet\r\n * @returns {mPortlet}\r\n */\r\n portlet.unFullscreen = function () {\r\n return Plugin.fullscreen('off');\r\n };\r\n\r\n /**\r\n * Get portletbody \r\n * @returns {jQuery}\r\n */\r\n portlet.getBody = function () {\r\n return Plugin.getBody();\r\n };\r\n\r\n /**\r\n * Get portletbody \r\n * @returns {jQuery}\r\n */\r\n portlet.getSelf = function () {\r\n return Plugin.getSelf();\r\n };\r\n\r\n /**\r\n * Set portlet content\r\n * @returns {mPortlet}\r\n */\r\n portlet.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Set portlet content\r\n * @returns {mPortlet}\r\n */\r\n portlet.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return portlet;\r\n };\r\n\r\n // default options\r\n $.fn.mPortlet.defaults = {\r\n bodyToggleSpeed: 400,\r\n tooltips: true,\r\n tools: {\r\n toggle: {\r\n collapse: 'Collapse', \r\n expand: 'Expand'\r\n },\r\n reload: 'Reload',\r\n remove: 'Remove',\r\n fullscreen: {\r\n on: 'Fullscreen',\r\n off: 'Exit Fullscreen'\r\n } \r\n }\r\n };\r\n}(jQuery));\n(function($) {\r\n // Plugin function\r\n $.fn.mQuicksearch = function(options) {\r\n\r\n // Plugin scope variables\r\n var qs = this;\r\n var element = $(this);\r\n \r\n // Plugin class \r\n var Plugin = {\r\n /**\r\n * Run plugin \r\n */\r\n run: function(options) {\r\n if (!element.data('qs')) {\r\n // init plugin\r\n Plugin.init(options);\r\n // build dom\r\n Plugin.build(); \r\n // store the instance in the element's data\r\n element.data('qs', qs);\r\n } else {\r\n // retrieve the instance fro the element's data\r\n qs = element.data('qs'); \r\n }\r\n\r\n return qs;\r\n },\r\n\r\n /**\r\n * Init plugin\r\n */\r\n init: function(options) {\r\n // merge default and user defined options\r\n qs.options = $.extend(true, {}, $.fn.mQuicksearch.defaults, options);\r\n\r\n // form\r\n qs.form = element.find('form');\r\n\r\n // input element\r\n qs.input = $(qs.options.input);\r\n\r\n // close icon\r\n qs.iconClose = $(qs.options.iconClose);\r\n\r\n if (qs.options.type == 'default') {\r\n // search icon\r\n qs.iconSearch = $(qs.options.iconSearch);\r\n \r\n // cancel icon\r\n qs.iconCancel = $(qs.options.iconCancel);\r\n } \r\n\r\n // dropdown\r\n qs.dropdown = element.mDropdown({mobileOverlay: false});\r\n\r\n // cancel search timeout\r\n qs.cancelTimeout;\r\n\r\n // ajax processing state\r\n qs.processing = false;\r\n }, \r\n\r\n /**\r\n * Build plugin\r\n */\r\n build: function() {\r\n // attach input keyup handler\r\n qs.input.keyup(Plugin.handleSearch);\r\n \r\n if (qs.options.type == 'default') {\r\n qs.input.focus(Plugin.showDropdown);\r\n \r\n qs.iconCancel.click(Plugin.handleCancel);\r\n\r\n qs.iconSearch.click(function() {\r\n if (mUtil.isInResponsiveRange('tablet-and-mobile')) {\r\n $('body').addClass('m-header-search--mobile-expanded');\r\n qs.input.focus();\r\n }\r\n });\r\n\r\n qs.iconClose.click(function() {\r\n if (mUtil.isInResponsiveRange('tablet-and-mobile')) {\r\n $('body').removeClass('m-header-search--mobile-expanded');\r\n Plugin.closeDropdown();\r\n }\r\n });\r\n\r\n } else if (qs.options.type == 'dropdown') {\r\n qs.dropdown.on('afterShow', function() {\r\n qs.input.focus();\r\n });\r\n qs.iconClose.click(Plugin.closeDropdown);\r\n } \r\n },\r\n\r\n /**\r\n * Search handler\r\n */ \r\n handleSearch: function(e) { \r\n var query = qs.input.val();\r\n\r\n if (query.length === 0) {\r\n qs.dropdown.hide();\r\n Plugin.handleCancelIconVisibility('on');\r\n Plugin.closeDropdown();\r\n element.removeClass(qs.options.hasResultClass);\r\n }\r\n\r\n if (query.length < qs.options.minLength || qs.processing == true) {\r\n return;\r\n }\r\n\r\n qs.processing = true;\r\n qs.form.addClass(qs.options.spinner);\r\n Plugin.handleCancelIconVisibility('off');\r\n \r\n $.ajax({\r\n url: qs.options.source,\r\n data: {query: query},\r\n dataType: 'html',\r\n success: function(res) {\r\n qs.processing = false;\r\n qs.form.removeClass(qs.options.spinner);\r\n Plugin.handleCancelIconVisibility('on');\r\n qs.dropdown.setContent(res).show();\r\n element.addClass(qs.options.hasResultClass); \r\n },\r\n error: function(res) {\r\n qs.processing = false;\r\n qs.form.removeClass(qs.options.spinner);\r\n Plugin.handleCancelIconVisibility('on');\r\n qs.dropdown.setContent(qs.options.templates.error.apply(qs, res)).show(); \r\n element.addClass(qs.options.hasResultClass); \r\n }\r\n });\r\n }, \r\n\r\n /**\r\n * Handle cancel icon visibility\r\n */ \r\n handleCancelIconVisibility: function(status) {\r\n if (qs.options.type == 'dropdown') {\r\n return;\r\n }\r\n\r\n if (status == 'on') {\r\n if (qs.input.val().length === 0) { \r\n qs.iconCancel.css('visibility', 'hidden');\r\n qs.iconClose.css('visibility', 'hidden');\r\n } else {\r\n clearTimeout(qs.cancelTimeout);\r\n qs.cancelTimeout = setTimeout(function() {\r\n qs.iconCancel.css('visibility', 'visible');\r\n qs.iconClose.css('visibility', 'visible');\r\n }, 500); \r\n }\r\n } else {\r\n qs.iconCancel.css('visibility', 'hidden');\r\n qs.iconClose.css('visibility', 'hidden');\r\n }\r\n },\r\n\r\n /**\r\n * Cancel handler\r\n */ \r\n handleCancel: function(e) {\r\n qs.input.val('');\r\n qs.iconCancel.css('visibility', 'hidden');\r\n element.removeClass(qs.options.hasResultClass); \r\n //qs.input.focus();\r\n\r\n Plugin.closeDropdown();\r\n },\r\n\r\n /**\r\n * Cancel handler\r\n */ \r\n closeDropdown: function() {\r\n qs.dropdown.hide();\r\n },\r\n\r\n /**\r\n * Show dropdown\r\n */ \r\n showDropdown: function(e) { \r\n if (qs.dropdown.isShown() == false && qs.input.val().length > qs.options.minLength && qs.processing == false) {\r\n qs.dropdown.show();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n };\r\n\r\n // Run plugin\r\n Plugin.run.apply(qs, [options]);\r\n\r\n //////////////////////\r\n // ** Public API ** //\r\n //////////////////////\r\n\r\n /**\r\n * Public method\r\n * @returns {mQuicksearch}\r\n */\r\n qs.test = function(time) {\r\n \t//Plugin.method(time);\r\n };\r\n\r\n // Return plugin object\r\n return qs;\r\n };\r\n\r\n // Plugin default options\r\n $.fn.mQuicksearch.defaults = {\r\n \tminLength: 1,\r\n maxHeight: 300,\r\n };\r\n\r\n}(jQuery));\n(function($) {\r\n // plugin setup\r\n $.fn.mScrollTop = function(options) {\r\n // main object\r\n var scrollTop = this;\r\n var element = $(this);\r\n\r\n /********************\r\n ** PRIVATE METHODS\r\n ********************/\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (!element.data('scrollTop')) { \r\n // create instance\r\n Plugin.init(options);\r\n Plugin.build();\r\n \r\n // assign instance to the element \r\n element.data('scrollTop', scrollTop);\r\n } else {\r\n // get instance from the element\r\n scrollTop = element.data('scrollTop');\r\n } \r\n\r\n return scrollTop;\r\n },\r\n\r\n /**\r\n * Handles subscrollTop click scrollTop\r\n */\r\n init: function(options) {\r\n scrollTop.element = element; \r\n scrollTop.events = [];\r\n\r\n // merge default and user defined options\r\n scrollTop.options = $.extend(true, {}, $.fn.mScrollTop.defaults, options);\r\n },\r\n\r\n /**\r\n * Setup scrollTop\r\n */\r\n build: function() {\r\n // handle window scroll\r\n if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {\r\n $(window).bind(\"touchend touchcancel touchleave\", function() {\r\n Plugin.handle();\r\n });\r\n } else {\r\n $(window).scroll(function() {\r\n Plugin.handle();\r\n });\r\n }\r\n\r\n // handle button click \r\n element.on('click', Plugin.scroll);\r\n },\r\n\r\n /**\r\n * sync \r\n */\r\n sync: function () {\r\n $(element).data('scrollTop', scrollTop);\r\n }, \r\n\r\n /**\r\n * Handles offcanvas click scrollTop\r\n */\r\n handle: function() {\r\n var pos = $(window).scrollTop(); // current vertical position\r\n if (pos > scrollTop.options.offset) {\r\n $(\"body\").addClass('m-scroll-top--shown');\r\n } else {\r\n $(\"body\").removeClass('m-scroll-top--shown');\r\n }\r\n },\r\n\r\n /**\r\n * Handles offcanvas click scrollTop\r\n */\r\n scroll: function(e) {\r\n e.preventDefault();\r\n\r\n $(\"html, body\").animate({\r\n scrollTop: 0\r\n }, scrollTop.options.speed);\r\n },\r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name) {\r\n for (i = 0; i < scrollTop.events.length; i++) {\r\n var event = scrollTop.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n scrollTop.events[i].fired = true;\r\n return event.handler.call(this, scrollTop);\r\n }\r\n } else {\r\n return event.handler.call(this, scrollTop);\r\n }\r\n }\r\n }\r\n },\r\n\r\n addEvent: function(name, handler, one) {\r\n scrollTop.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n }\r\n };\r\n\r\n // main variables\r\n var the = this;\r\n \r\n // init plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n /********************\r\n ** PUBLIC API METHODS\r\n ********************/\r\n\r\n /**\r\n * Get subscrollTop mode\r\n */\r\n scrollTop.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Set scrollTop content\r\n * @returns {mScrollTop}\r\n */\r\n scrollTop.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return scrollTop;\r\n };\r\n\r\n // default options\r\n $.fn.mScrollTop.defaults = {\r\n offset: 300,\r\n speed: 600\r\n }; \r\n}(jQuery));\n(function($) {\r\n // plugin setup\r\n $.fn.mToggle = function(options) {\r\n // main object\r\n var toggle = this;\r\n var element = $(this);\r\n\r\n /********************\r\n ** PRIVATE METHODS\r\n ********************/\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (!element.data('toggle')) { \r\n // create instance\r\n Plugin.init(options);\r\n Plugin.build();\r\n \r\n // assign instance to the element \r\n element.data('toggle', toggle);\r\n } else {\r\n // get instance from the element\r\n toggle = element.data('toggle');\r\n } \r\n\r\n return toggle;\r\n },\r\n\r\n /**\r\n * Handles subtoggle click toggle\r\n */\r\n init: function(options) {\r\n toggle.element = element; \r\n toggle.events = [];\r\n\r\n // merge default and user defined options\r\n toggle.options = $.extend(true, {}, $.fn.mToggle.defaults, options);\r\n\r\n toggle.target = $(toggle.options.target);\r\n toggle.targetState = toggle.options.targetState;\r\n toggle.togglerState = toggle.options.togglerState;\r\n\r\n toggle.state = mUtil.hasClasses(toggle.target, toggle.targetState) ? 'on' : 'off';\r\n },\r\n\r\n /**\r\n * Setup toggle\r\n */\r\n build: function() {\r\n element.on('click', Plugin.toggle);\r\n },\r\n\r\n /**\r\n * sync \r\n */\r\n sync: function () {\r\n $(element).data('toggle', toggle);\r\n }, \r\n\r\n /**\r\n * Handles offcanvas click toggle\r\n */\r\n toggle: function() {\r\n if (toggle.state == 'off') {\r\n Plugin.toggleOn();\r\n } else {\r\n Plugin.toggleOff();\r\n }\r\n Plugin.eventTrigger('toggle');\r\n\r\n return toggle;\r\n },\r\n\r\n /**\r\n * Handles toggle click toggle\r\n */\r\n toggleOn: function() {\r\n Plugin.eventTrigger('beforeOn');\r\n \r\n toggle.target.addClass(toggle.targetState);\r\n\r\n if (toggle.togglerState) {\r\n element.addClass(toggle.togglerState);\r\n }\r\n\r\n toggle.state = 'on';\r\n\r\n Plugin.eventTrigger('afterOn');\r\n\r\n return toggle;\r\n },\r\n\r\n /**\r\n * Handles toggle click toggle\r\n */\r\n toggleOff: function() {\r\n Plugin.eventTrigger('beforeOff');\r\n\r\n toggle.target.removeClass(toggle.targetState);\r\n\r\n if (toggle.togglerState) {\r\n element.removeClass(toggle.togglerState);\r\n }\r\n\r\n toggle.state = 'off';\r\n\r\n Plugin.eventTrigger('afterOff');\r\n\r\n return toggle;\r\n },\r\n\r\n /**\r\n * Trigger events\r\n */\r\n eventTrigger: function(name) {\r\n toggle.trigger(name);\r\n for (i = 0; i < toggle.events.length; i++) {\r\n var event = toggle.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n toggle.events[i].fired = true;\r\n return event.handler.call(this, toggle);\r\n }\r\n } else {\r\n return event.handler.call(this, toggle);\r\n }\r\n }\r\n }\r\n },\r\n\r\n addEvent: function(name, handler, one) {\r\n toggle.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n\r\n return toggle;\r\n }\r\n };\r\n\r\n // main variables\r\n var the = this;\r\n \r\n // init plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n /********************\r\n ** PUBLIC API METHODS\r\n ********************/\r\n\r\n /**\r\n * Toggle \r\n */\r\n toggle.toggle = function () {\r\n return Plugin.toggle();\r\n };\r\n\r\n /**\r\n * Toggle on \r\n */\r\n toggle.toggleOn = function () {\r\n return Plugin.toggleOn();\r\n };\r\n\r\n /**\r\n * Toggle off \r\n */\r\n toggle.toggleOff = function () {\r\n return Plugin.toggleOff();\r\n };\r\n\r\n /**\r\n * Attach event\r\n * @returns {mToggle}\r\n */\r\n toggle.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Attach event that will be fired once\r\n * @returns {mToggle}\r\n */\r\n toggle.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return toggle;\r\n };\r\n\r\n // default options\r\n $.fn.mToggle.defaults = {\r\n togglerState: '',\r\n targetState: ''\r\n }; \r\n}(jQuery));\n(function($) {\r\n // plugin setup\r\n $.fn.mWizard = function(options) {\r\n //== Main object\r\n var wizard = this;\r\n var element = $(this);\r\n\r\n /********************\r\n ** PRIVATE METHODS\r\n ********************/\r\n var Plugin = {\r\n /**\r\n * Run\r\n */\r\n run: function (options) {\r\n if (!element.data('wizard')) { \r\n //== Create instance\r\n Plugin.init(options);\r\n Plugin.build();\r\n \r\n //== Assign instance to the element \r\n element.data('wizard', wizard);\r\n } else {\r\n // get instance from the element\r\n wizard = element.data('wizard');\r\n } \r\n\r\n return wizard;\r\n },\r\n\r\n /**\r\n * Initialize Form Wizard\r\n */\r\n init: function(options) {\r\n //== Elements\r\n wizard.steps = wizard.find('.m-wizard__step');\r\n wizard.progress = wizard.find('.m-wizard__progress .progress-bar'); \r\n wizard.btnSubmit = wizard.find('[data-wizard-action=\"submit\"]'); \r\n wizard.btnNext = wizard.find('[data-wizard-action=\"next\"]'); \r\n wizard.btnPrev = wizard.find('[data-wizard-action=\"prev\"]'); \r\n wizard.btnLast = wizard.find('[data-wizard-action=\"last\"]'); \r\n wizard.btnFirst = wizard.find('[data-wizard-action=\"first\"]'); \r\n\r\n //== Merge default and user defined options\r\n wizard.options = $.extend(true, {}, $.fn.mWizard.defaults, options);\r\n\r\n //== Variables\r\n wizard.events = [];\r\n wizard.currentStep = 1;\r\n wizard.totalSteps = wizard.steps.length; \r\n\r\n //== Init current step\r\n if (wizard.options.startStep > 1) {\r\n Plugin.goTo(wizard.options.startStep);\r\n } \r\n\r\n //== Init UI\r\n Plugin.updateUI();\r\n },\r\n\r\n /**\r\n * Build Form Wizard\r\n */\r\n build: function() {\r\n //== Next button event handler\r\n wizard.btnNext.on('click', function (e) {\r\n e.preventDefault();\r\n Plugin.goNext();\r\n });\r\n\r\n //== Prev button event handler\r\n wizard.btnPrev.on('click', function (e) {\r\n e.preventDefault();\r\n Plugin.goPrev();\r\n });\r\n\r\n //== First button event handler\r\n wizard.btnFirst.on('click', function (e) {\r\n e.preventDefault();\r\n Plugin.goFirst();\r\n });\r\n\r\n //== Last button event handler\r\n wizard.btnLast.on('click', function (e) {\r\n e.preventDefault();\r\n Plugin.goLast();\r\n });\r\n\r\n wizard.find('.m-wizard__step a.m-wizard__step-number').on('click', function() {\r\n var step = $(this).parents('.m-wizard__step');\r\n var num;\r\n $(this).parents('.m-wizard__steps').find('.m-wizard__step').each(function(index) {\r\n if (step.is( $(this) )) {\r\n num = (index + 1);\r\n return;\r\n }\r\n });\r\n\r\n if (num) {\r\n Plugin.goTo(num);\r\n } \r\n });\r\n },\r\n\r\n /**\r\n * Sync object instance\r\n */\r\n sync: function () {\r\n $(element).data('wizard', wizard);\r\n }, \r\n\r\n /**\r\n * Handles wizard click toggle\r\n */\r\n goTo: function(number) {\r\n //== Skip if this step is already shown\r\n if (number === wizard.currentStep) {\r\n return;\r\n }\r\n\r\n //== Validate step number\r\n if (number) {\r\n number = parseInt(number); \r\n } else {\r\n number = Plugin.getNextStep();\r\n }\r\n\r\n //== Before next and prev events\r\n var callback;\r\n\r\n if (number > wizard.currentStep) {\r\n callback = Plugin.eventTrigger('beforeNext');\r\n } else {\r\n callback = Plugin.eventTrigger('beforePrev');\r\n }\r\n\r\n //== Continue if no exit\r\n if (callback !== false) {\r\n //== Set current step\r\n wizard.currentStep = number;\r\n\r\n //== Update UI\r\n Plugin.updateUI(); \r\n\r\n //== Trigger change event\r\n Plugin.eventTrigger('change') \r\n }\r\n \r\n //== After next and prev events\r\n if (number > wizard.startStep) {\r\n Plugin.eventTrigger('afterNext');\r\n } else {\r\n Plugin.eventTrigger('afterPrev');\r\n }\r\n\r\n return wizard;\r\n },\r\n\r\n updateUI: function(argument) {\r\n //== Update progress bar\r\n Plugin.updateProgress();\r\n\r\n //== Show current target content\r\n Plugin.handleTarget();\r\n\r\n //== Set classes\r\n Plugin.setStepClass();\r\n\r\n //== Apply nav step classes\r\n wizard.find('.m-wizard__step').removeClass('m-wizard__step--current').removeClass('m-wizard__step--done');\r\n for (var i = 1; i < wizard.currentStep; i++) {\r\n wizard.find('.m-wizard__step').eq(i - 1).addClass('m-wizard__step--done');\r\n }\r\n wizard.find('.m-wizard__step').eq(wizard.currentStep - 1).addClass('m-wizard__step--current');\r\n },\r\n\r\n /**\r\n * Check last step\r\n */\r\n isLastStep: function() {\r\n return wizard.currentStep === wizard.totalSteps;\r\n },\r\n\r\n /**\r\n * Check first step\r\n */\r\n isFirstStep: function() {\r\n return wizard.currentStep === 1;\r\n },\r\n\r\n /**\r\n * Check between step\r\n */\r\n isBetweenStep: function() {\r\n return Plugin.isLastStep() === false && Plugin.isFirstStep() === false;\r\n },\r\n\r\n /**\r\n * Set step class\r\n */\r\n setStepClass: function() {\r\n if (Plugin.isLastStep()) {\r\n element.addClass('m-wizard--step-last');\r\n } else {\r\n element.removeClass('m-wizard--step-last');\r\n }\r\n\r\n if (Plugin.isFirstStep()) {\r\n element.addClass('m-wizard--step-first');\r\n } else {\r\n element.removeClass('m-wizard--step-first');\r\n }\r\n\r\n if (Plugin.isBetweenStep()) {\r\n element.addClass('m-wizard--step-between');\r\n } else {\r\n element.removeClass('m-wizard--step-between');\r\n }\r\n },\r\n\r\n /**\r\n * Go to the next step\r\n */\r\n goNext: function() {\r\n return Plugin.goTo( Plugin.getNextStep() );\r\n },\r\n\r\n /**\r\n * Go to the prev step\r\n */\r\n goPrev: function() {\r\n return Plugin.goTo( Plugin.getPrevStep() );\r\n },\r\n\r\n /**\r\n * Go to the last step\r\n */\r\n goLast: function() {\r\n return Plugin.goTo( wizard.totalSteps );\r\n },\r\n\r\n /**\r\n * Go to the first step\r\n */\r\n goFirst: function() {\r\n return Plugin.goTo( 1 );\r\n },\r\n\r\n /**\r\n * Set progress\r\n */\r\n updateProgress: function() {\r\n //== Calculate progress position\r\n\r\n if (!wizard.progress) {\r\n return;\r\n } \r\n\r\n //== Update progress\r\n if (element.hasClass('m-wizard--1')) {\r\n var width = 100 * ((wizard.currentStep) / (wizard.totalSteps));\r\n var offset = element.find('.m-wizard__step-number').width();\r\n wizard.progress.css('width', 'calc(' + width + '% + ' + (offset / 2) + 'px)');\r\n } else if (element.hasClass('m-wizard--2')) {\r\n if (wizard.currentStep === 1) {\r\n return;\r\n }\r\n\r\n var step = element.find('.m-wizard__step').eq(0);\r\n var progress = (wizard.currentStep - 1) * (100 * (1 / (wizard.totalSteps - 1)));\r\n\r\n if (mUtil.isInResponsiveRange('minimal-desktop-and-below')) { \r\n wizard.progress.css('height', progress + '%');\r\n } else {\r\n wizard.progress.css('width', progress + '%');\r\n }\r\n } else {\r\n var width = 100 * ((wizard.currentStep) / (wizard.totalSteps));\r\n wizard.progress.css('width', width + '%'); \r\n } \r\n },\r\n\r\n /**\r\n * Show/hide target content\r\n */\r\n handleTarget: function() {\r\n var step = wizard.steps.eq(wizard.currentStep - 1);\r\n var target = element.find( step.data('wizard-target') );\r\n\r\n element.find('.m-wizard__form-step--current').removeClass('m-wizard__form-step--current');\r\n target.addClass('m-wizard__form-step--current');\r\n },\r\n\r\n /**\r\n * Get next step\r\n */\r\n getNextStep: function() {\r\n if (wizard.totalSteps >= (wizard.currentStep + 1)) {\r\n return wizard.currentStep + 1;\r\n } else {\r\n return wizard.totalSteps;\r\n } \r\n },\r\n\r\n /**\r\n * Get prev step\r\n */\r\n getPrevStep: function() {\r\n if ((wizard.currentStep - 1) >= 1) {\r\n return wizard.currentStep - 1;\r\n } else {\r\n return 1;\r\n } \r\n },\r\n\r\n /**\r\n * Trigger event\r\n */\r\n eventTrigger: function(name) {\r\n for (i = 0; i < wizard.events.length; i++) {\r\n var event = wizard.events[i];\r\n if (event.name == name) {\r\n if (event.one == true) {\r\n if (event.fired == false) {\r\n wizard.events[i].fired = true;\r\n return event.handler.call(this, wizard);\r\n }\r\n } else {\r\n return event.handler.call(this, wizard);\r\n }\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Register event\r\n */\r\n addEvent: function(name, handler, one) {\r\n wizard.events.push({\r\n name: name,\r\n handler: handler,\r\n one: one,\r\n fired: false\r\n });\r\n\r\n Plugin.sync();\r\n }\r\n };\r\n\r\n //== Main variables\r\n var the = this;\r\n \r\n //== Init plugin\r\n Plugin.run.apply(this, [options]);\r\n\r\n /********************\r\n ** PUBLIC API METHODS\r\n ********************/\r\n\r\n /**\r\n * Go to the next step \r\n */\r\n wizard.goNext = function () {\r\n return Plugin.goNext();\r\n };\r\n\r\n /**\r\n * Go to the prev step \r\n */\r\n wizard.goPrev = function () {\r\n return Plugin.goPrev();\r\n };\r\n\r\n /**\r\n * Go to the last step \r\n */\r\n wizard.goLast = function () {\r\n return Plugin.goLast();\r\n };\r\n\r\n /**\r\n * Go to the first step \r\n */\r\n wizard.goFirst = function () {\r\n return Plugin.goFirst();\r\n };\r\n\r\n /**\r\n * Go to a step\r\n */\r\n wizard.goTo = function ( number ) {\r\n return Plugin.goTo( number );\r\n };\r\n\r\n /**\r\n * Get current step number \r\n */\r\n wizard.getStep = function () {\r\n return wizard.currentStep;\r\n };\r\n\r\n /**\r\n * Check last step \r\n */\r\n wizard.isLastStep = function () {\r\n return Plugin.isLastStep();\r\n };\r\n\r\n /**\r\n * Check first step \r\n */\r\n wizard.isFirstStep = function () {\r\n return Plugin.isFirstStep();\r\n };\r\n\r\n /**\r\n * Attach event\r\n * @returns {mwizard}\r\n */\r\n wizard.on = function (name, handler) {\r\n return Plugin.addEvent(name, handler);\r\n };\r\n\r\n /**\r\n * Attach event that will be fired once\r\n * @returns {mwizard}\r\n */\r\n wizard.one = function (name, handler) {\r\n return Plugin.addEvent(name, handler, true);\r\n }; \r\n\r\n return wizard;\r\n };\r\n\r\n //== Default options\r\n $.fn.mWizard.defaults = {\r\n startStep: 1\r\n }; \r\n}(jQuery));"],"file":"scripts.bundle.js"}