{"version":3,"sources":["ixp-flow.js"],"names":["runtime","_","components","dependencies","Modernizr","$","jQuery","v1_11","canTouchThis","touch","hammerPaths","component","paths","join","flags","debug","cdn","getCdnPath","define","url","getInstanceExport","window","Hammer","getInstanceVersion","instance","VERSION","hammerTime","callback","require","then","constants","merge","flowSelector","data","componentRoot","initClass","modes","modeAttr","normalMode","editMode","steps","previousStep","activeStepOut","activeStepIn","activeStep","attrPlacement","attrTransitioning","progress","wrapperSelector","doneStep","clickable","progressInit","templates","badgeUi","progressBar","progressItem","nextButton","previousButton","regex","style","RegExp","id","iter","label","tooltip","behaviors","nextStep","firstStep","lastStep","convert","transitions","allSteps","classSlideVertical","classSlideHorizontal","classFade","allClasses","step","duration","easing","events","resized","extensibility","commands","navigate","scrollto","navigating","navigated","registerExtensibility","statics","updateProgress","stepCount","instanceId","$el","getProgressBar","children","length","remove","removeClass","addClass","progressTmpl","replace","append","$steps","progressItems","i","$step","eq","attr","itemTmpl","push","first","html","updateControls","controlTmpl","getFlowScaffolding","scaffoldingKey","builder","options","container","scaffoldContainer","scaffold","content","scaffolding","customClass","getDefaultThemes","flow","flow-progress","flow-progress-align-horizontal","flow-progress-align-vertical","flow-transition","getStepScaffolding","flowstep","flowstep-transition","register","initialize","this","transitionEndEventName","eventNamespace","progressSelector","previousSelector","nextSelector","stepDelegateSelector","seq","looping_enabled","_updateSteps","_updateControls","_updateProgress","debouncedCleanSteps","debounce","bind","_cleanSteps","maxWait","on","_onTransitionEnd","activeHeight","inStudio","stepsWrap","outerHeight","show","debouncedShow","leading","trailing","_onResize","onBehavior","_onBehaviorGotoNext","_onBehaviorGotoPrevious","_onBehaviorGotoFirst","_onBehaviorGotoLast","onDocumentReady","recalculateVisibility","delay","navigation_enabled","me","hammerInstance","$swipeTarget","find","off","e","preventDefault","isClicked","loop","interaction","source","direction","DIRECTION_RIGHT","DIRECTION_DOWN","previous","next","autoplay_enabled","startAuto","stopAuto","autoTimer","clearInterval","autoPlayDuration","dur","autoplay_delay","newDur","parseInt","isNaN","Math","abs","setInterval","extend","maxseq","autoplay_stop_on_navigation","autoplayPaused","currSeq","maxStep","targetSeq","isLooping","force","showInit","_getSteps","currStep","filter","targetStep","ee","index","element","cancel","triggerExtensibility","isForward","targetProgressItem","prevAll","csstransitions","_doTransitions","siblings","hide","css","left","top","setTimeout","is","liveballTag","$data","pushInteraction","assign","name","_getTransition","getStyle","$target","stepClasses","hasClass","stepStyle","$parent","currentStep","targetStyle","currentStyle","_doTransition","active","opacity","fadeTo","prop","amount","outerWidth","movement","animateOpts","animate","queue","complete","toggle","_getActiveHeight","_updateHeight","_isOwnStep","target","removeAttr","scrollTopAllowed","change_scroll_top","scrollToDeferred","preventScrollToStep","scrollTo","speed","inViewport","tolerance","edge","updateUrlHash","_resolveScrollTo","_onProgressClick","sourceTarget","_onFocusClick","event","keyCode","_onClickGotoNext","_onClickGotoPrevious","_onFocusClickGotoNext","_onFocusClickGotoPrevious","max","curr","originalEvent","inputs","handled","behaviourName","_shouldShowProgress","className","indexOf","classes","len","isClickable","inEditMode","clickEventName","keyUpEventName","$body","scrollTop","newHeight","studioApp","componentsManager","trigger","fixed_height","each","height","_createElementBadgeUi","$div","elementBadgeUi","_toggleElementBadgeUi","allowedDropTargets","allowedChildrenTypes","onGetCommandMap","fn","_onCommandNavigate","_onCommandScrollTo","$stepsContainer","closest","stepOwnerId","_getOwnStepFromElement","$nextStep","parent","log","targetIsStep","anchor","$descendantTarget","inArray","map","promise","Promise","resolve","reject","status","envelope","getExtensibilityEnvelope","done","undefined","getParamMapOverrides","val","onGetScaffolding","onGetCssClassesToPreserve","onStudioStateChanged","state","pagePlaceholders","onListenToStudioEvents","$badgeExtensibility","$flow","flowInstanceId","step_tag","step_navigation_tooltip","disallowedChildrenTypes","ixp"],"mappings":"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","file":"ixp-flow.min.js","sourcesContent":["(function(runtime) {\n    var _ = runtime.components.dependencies._;\n    var Modernizr = runtime.components.dependencies.Modernizr;\n    var $ = runtime.components.dependencies.jQuery.v1_11;\n\n    var canTouchThis = !!Modernizr.touch;\n\n    var hammerPaths = {\n        component: runtime.paths.join('/Global/UxPlugins/ixp-flow/js/', (runtime.flags.debug ? '/hammer-2.0.4.js' : '/hammer-2.0.4.min.js')),\n        cdn: runtime.paths.getCdnPath('/libs/hammer.js/2.0.4/hammer.min.js')\n    };\n\n    runtime.dependencies.define('hammer', {\n        url: hammerPaths.cdn,\n\n        getInstanceExport: function() {\n            return window.Hammer;\n        },\n        getInstanceVersion: function(instance) {\n            return Hammer.VERSION;\n        }\n    });\n\n    var hammerTime = function(callback) {\n        runtime.dependencies.require('hammer')\n            .then(function(Hammer) {\n                callback(Hammer);\n            });\n    };\n\n\n    var constants = runtime.components.constants.merge({\n        flowSelector: '.ixp-component-flow[' + runtime.components.constants.components.data.componentRoot + ']',\n        initClass: 'ixp-component-flow-init',\n\n        modes: {\n            modeAttr: 'data-ixp-flow-mode',\n            normalMode: 'normal',\n            editMode: 'edit'\n        },\n\n        steps: {\n            previousStep: 'ixp-component-flow-prev',\n            activeStepOut: 'ixp-component-flow-out ixp-flow-prev',\n            activeStepIn: 'ixp-component-flow-in ixp-flow-active',\n            activeStep: 'ixp-component-flow-active',\n            attrPlacement: 'data-ixp-flow-step-placement',\n            attrTransitioning: 'data-ixp-flow-step-transitioning'\n        },\n\n        progress: {\n            wrapperSelector: '.ixp-component-flow-progress',\n            doneStep: 'ixp-component-flow-progress-done',\n            activeStep: 'ixp-component-flow-progress-active',\n            clickable: 'ixp-component-flow-progress-clickable',\n            progressInit: 'ixp-component-flow-progress-init'\n        },\n\n        templates: {\n            badgeUi: '<div class=\"pe-element-badge-pager\"><span data-ixp-flow-action=\"prevStep\" class=\"pe-element-badge-pager-prev\"></span><span data-ixp-flow-action=\"nextStep\" class=\"pe-element-badge-pager-next\"></span></div>',\n            progressBar: '<div class=\"ixp-component-flow-progress ixp-component-flow-progress-%%style%%\" data-ixp-progress-bar=\"%%ID%%\"><ul class=\"ixp-component-flow-progress-inner\"></ul></div>',\n            progressItem: '<li class=\"ixp-component-flow-progress-toggle\" tabindex=\"0\" data-ixp-action-toggle=\"%%ID%%\" data-step=\"%%iter%%\" %%TOOLTIP%%>%%label%%</li>',\n            nextButton: '<div role=\"button\" tabindex=\"0\" aria-label=\"next step\" class=\"ixp-component-flow-control-next\" data-ixp-action-next=\"%%ID%%\"></div>',\n            previousButton: '<div role=\"button\" tabindex=\"0\" aria-label=\"previous step\" class=\"ixp-component-flow-control-back\" data-ixp-action-previous=\"%%ID%%\"></div>'\n        },\n\n        regex: {\n            style: new RegExp('%%style%%', 'g'),\n            id: new RegExp('%%ID%%', 'g'),\n            iter: new RegExp('%%iter%%', 'g'),\n            label: new RegExp('%%label%%', 'g'),\n            tooltip: new RegExp('%%TOOLTIP%%', 'g')\n        },\n\n        behaviors: {\n            nextStep: 'flow-next',\n            previousStep: 'flow-back',\n            firstStep: 'flow-first',\n            lastStep: 'flow-last',\n            convert: 'flow-convert',\n            transitions: {\n                allSteps: {\n                    classSlideVertical: 'ixp-component-flow-vertical-all',\n                    classSlideHorizontal: 'ixp-component-flow-horizontal-all',\n                    classFade: 'ixp-component-flow-fade-all',\n                    allClasses: 'ixp-component-flow-vertical-all ixp-component-flow-horizontal-all ixp-component-flow-fade-all'\n                },\n                step: {\n                    classSlideVertical: 'ixp-component-flow-vertical',\n                    classSlideHorizontal: 'ixp-component-flow-horizontal',\n                    classFade: 'ixp-component-flow-fade',\n                    allClasses: 'ixp-component-flow-vertical ixp-component-flow-horizontal ixp-component-flow-fade'\n                },\n                duration: 500,\n                easing: 'linear'\n            }\n        },\n\n        step: {\n            events: {\n                resized: ':flowstep:resize'\n            }\n        },\n\n        extensibility: {\n            commands: {\n                navigate: ':navigate',\n                scrollto: ':scrollto'\n            },\n\n            events: {\n                navigating: ':navigating',\n                navigated: ':navigated'\n            }\n        }\n    });\n\n    runtime.components.registerExtensibility('ixp-flow', {\n        commands: constants.extensibility.commands || {},\n        events: constants.extensibility.events || {}\n    });\n\n    var statics = {\n        updateProgress: function(style, stepCount, instanceId, $el) {\n            var getProgressBar = function() {\n                return $el.children('[data-ixp-progress-bar]');\n            };\n\n            var progressBar = getProgressBar();\n            if (stepCount < 1 || style === 'none') {\n                if (progressBar.length) {\n                    progressBar.remove();\n                }\n                return;\n            }\n\n            $el.removeClass('ixp-component-flow-progress-off');\n            $el.addClass('ixp-component-flow-progress-on');\n\n            if (progressBar.length) {\n                progressBar.children().children().remove();\n            } else {\n                var progressTmpl = constants.templates.progressBar;\n                progressTmpl = progressTmpl.replace(constants.regex.style, style);\n                progressTmpl = progressTmpl.replace(constants.regex.id, instanceId);\n                $el.append(progressTmpl);\n                progressBar = getProgressBar();\n            }\n\n            var $steps = $el.children('.ixp-component-flow-steps').children();\n\n            var progressItems = [];\n            for (var i = 0; i < stepCount; i++) {\n                var $step = $steps.eq(i);\n                var tooltip = $step && $step.attr('data-ixp-component-flow-step-tooltip') || '';\n                if (tooltip !== '') {\n                    tooltip = 'data-ixp-c-flow-tooltip=\"' + tooltip + '\"';\n                }\n\n                var itemTmpl = constants.templates.progressItem;\n                itemTmpl = itemTmpl.replace(constants.regex.iter, i);\n                itemTmpl = itemTmpl.replace(constants.regex.label, i + 1);\n                itemTmpl = itemTmpl.replace(constants.regex.id, instanceId);\n                itemTmpl = itemTmpl.replace(constants.regex.tooltip, tooltip);\n                progressItems.push(itemTmpl);\n            }\n            progressBar.children().first().html(progressItems.join(''));\n\n            if (style === 'clickable') {\n                progressBar.addClass(constants.progress.clickable);\n            } else {\n                progressBar.removeClass(constants.progress.clickable);\n            }\n\n            progressBar.addClass(constants.progress.progressInit);\n        },\n\n        updateControls: function(stepCount, instanceId, $el) {\n            if (!stepCount) {\n                $el.children('.ixp-component-flow-control-back, .ixp-component-flow-control-next').remove();\n                return;\n            }\n\n            if ($el.children('.ixp-component-flow-control-back, .ixp-component-flow-control-next').length) {\n                return;\n            }\n\n            var controlTmpl = '';\n\n            var itemTmpl = constants.templates.previousButton;\n            itemTmpl = itemTmpl.replace(constants.regex.id, instanceId);\n            controlTmpl += itemTmpl;\n\n            itemTmpl = constants.templates.nextButton;\n            itemTmpl = itemTmpl.replace(constants.regex.id, instanceId);\n            controlTmpl += itemTmpl;\n\n            $el.append(controlTmpl);\n        },\n\n        getFlowScaffolding: function(scaffoldingKey, builder, options) {\n            var container = builder.scaffoldContainer('Flow');\n\n            var steps = [];\n            for (var i = 1; i < 4; i++) {\n                var step = builder.scaffold('ixp-flow-step', 'Flow Step');\n                steps.push(step);\n            }\n\n            container.content.scaffolding = steps;\n\n            return {\n                scaffolding: [ container ],\n                style: {\n                    customClass: builder.getDefaultThemes({\n                                                              'flow': '',\n                                                              'flow-progress': 'ixp-component-flow-default',\n                                                              'flow-progress-align-horizontal': '',\n                                                              'flow-progress-align-vertical': '',\n                                                              'flow-transition': ''\n                                                          })\n                }\n            };\n        },\n\n        getStepScaffolding: function(scaffoldingKey, builder, options) {\n            var container = builder.scaffoldContainer('Flow Step');\n\n            return {\n                scaffolding: [ container ],\n                style: {\n                    customClass: builder.getDefaultThemes({ 'flowstep': '', 'flowstep-transition': '' })\n                }\n            };\n        }\n    };\n\n    runtime.components.register('ixp-flow', {\n        initialize: function(options) {\n            this.transitionEndEventName = 'webkitTransitionEnd' + this.eventNamespace + ' otransitionend' + this.eventNamespace + ' msTransitionEnd' + this.eventNamespace + ' transitionend' + this.eventNamespace;\n            this.progressSelector = '[data-ixp-action-toggle=\"' + this.instanceId + '\"]';\n            this.previousSelector = '[data-ixp-action-previous=\"' + this.instanceId + '\"]';\n            this.nextSelector = '[data-ixp-action-next=\"' + this.instanceId + '\"]';\n            this.stepDelegateSelector = '[data-ixp-flow-steps=\"' + this.instanceId + '\"] > .ixp-component-flow-step';\n            this.seq = 0;\n\n            if (this.looping_enabled) {\n                this.$el.removeClass('ixp-component-flow-no-looping');\n            }\n\n            this._updateSteps();\n            this._updateControls();\n            this._updateProgress();\n\n            this.debouncedCleanSteps = _.debounce(_.bind(this._cleanSteps, this), 50, { maxWait: 100 });\n            this.$el.on(this.transitionEndEventName, this.stepDelegateSelector, _.bind(this._onTransitionEnd, this));\n\n            this.activeHeight = this.inStudio ? this.stepsWrap.outerHeight() : 0;\n\n            this.show({\n                step: this.seq\n            });\n\n            this.debouncedShow = _.debounce(this.show, 250, { 'leading': true, 'trailing': false });\n\n            runtime.events.on(this, this.instanceId + constants.step.events.resized, _.debounce(_.bind(this._onResize, this), 10, { maxWait: 20 }));\n\n            if (!this.inStudio) {\n                this.onBehavior(this.$el, constants.behaviors.nextStep, this._onBehaviorGotoNext);\n                this.onBehavior(this.$el, constants.behaviors.previousStep, this._onBehaviorGotoPrevious);\n                this.onBehavior(this.$el, constants.behaviors.firstStep, this._onBehaviorGotoFirst);\n                this.onBehavior(this.$el, constants.behaviors.lastStep, this._onBehaviorGotoLast);\n            }\n        },\n\n        onDocumentReady: function() {\n            this._onResize();\n            this.recalculateVisibility({ delay: 1 });\n            if (!this.inStudio) {\n                if (canTouchThis && this.navigation_enabled) {\n                    var me = this;\n                    hammerTime(function(Hammer) {\n                        if (!me.hammerInstance) {\n                            var $swipeTarget = me.$el.find('[data-ixp-flow-steps=\"' + me.instanceId + '\"]');\n                            me.hammerInstance = new Hammer($swipeTarget[0]);\n                        }\n\n                        me.hammerInstance.off('swipe');\n                        me.hammerInstance.on('swipe', function(e) {\n                            e.preventDefault();\n\n                            var options = {\n                                isClicked: true,\n                                loop: me.looping_enabled,\n                                interaction: {\n                                    source: 'swipe',\n                                    direction: e.direction\n                                }\n                            };\n                            if (e.direction === Hammer.DIRECTION_RIGHT || e.direction === Hammer.DIRECTION_DOWN) {\n                                me.previous(options);\n                            } else {\n                                me.next(options);\n                            }\n                        });\n                    });\n                }\n                if (this.autoplay_enabled) {\n                    this.startAuto();\n                }\n            }\n            return true;\n        },\n        stopAuto: function() {\n            if (this.autoTimer) {\n                clearInterval(this.autoTimer);\n                delete this.autoTimer;\n            }\n        },\n        startAuto: function() {\n            this.stopAuto();\n\n            if (this.inStudio) {\n                return;\n            }\n\n            if (!this.autoPlayDuration) {\n                var dur = 4000;\n                if (this.autoplay_delay) {\n                    var newDur = parseInt(this.autoplay_delay, 10);\n                    if (!isNaN(newDur)) {\n                        dur = Math.abs(newDur * 1000);\n                    }\n                }\n                this.autoPlayDuration = dur;\n            }\n            var me = this;\n            this.autoTimer = setInterval(function() {\n                me.next({ loop: me.looping_enabled }); // Do not pass interaction object here, means auto_play is not user interaction\n            }, this.autoPlayDuration);\n        },\n\n        // public methods\n        show: function(options) {\n            options = _.extend({\n                                   step: 0,\n                                   stepCount: this.maxseq\n                               }, options || {});\n\n            if (options.isClicked && options.isClicked === true) {\n                if (this.autoplay_enabled && !this.autoplay_stop_on_navigation) {\n                    this.autoplayPaused = true;\n                }\n                this.stopAuto();\n            }\n\n            var currSeq = this.seq;\n            var maxStep = options.stepCount;\n            var targetSeq = options.step;\n\n            var isLooping = false;\n            if (targetSeq >= maxStep) {\n                if (options.loop === true) {\n                    targetSeq = 0;\n                    isLooping = true;\n                } else {\n                    targetSeq = maxStep - 1;\n                }\n            } else if (targetSeq < 0) {\n                if (options.loop === true) {\n                    targetSeq = maxStep - 1;\n                    isLooping = true;\n                } else {\n                    targetSeq = 0;\n                }\n            }\n\n            if (!options.force && this.showInit && currSeq === targetSeq) {\n                return;\n            }\n\n            var steps = this._getSteps();\n            var currStep = steps.filter(':eq(' + currSeq + ')');\n            var targetStep = steps.filter(':eq(' + targetSeq + ')');\n\n            var ee = {\n                steps: maxStep,\n                step: { index: currSeq, element: currStep[0] },\n                targetStep: { index: targetSeq, element: targetStep[0] },\n                cancel: false\n            };\n            this.triggerExtensibility(constants.extensibility.events.navigating, ee);\n\n            targetSeq = ee.targetStep && ee.targetStep.index;\n            if (ee.cancel || targetSeq >= maxStep || targetSeq < 0 ||\n                (!options.force && this.showInit && targetSeq === currSeq)) {\n                return;\n            }\n\n            var isForward = false;\n            if (!this.showInit || (isLooping & targetSeq === 0) || (!isLooping && targetSeq > currSeq)) {\n                isForward = true;\n            }\n\n            var direction = isForward ? 'forward' : 'backward';\n            var progress = targetSeq === 0 ? 'start' : targetSeq === (maxStep - 1) ? 'end' : 'middle';\n\n            //console.log('current: ' + currSeq);\n            //console.log('target:  ' + targetSeq);\n\n            // TOGGLE PROGRESS SEQ\n            var progressItems = this.$el.find(this.progressSelector);\n            var targetProgressItem = progressItems.filter(':eq(' + targetSeq + ')');\n\n            progressItems.removeClass(constants.progress.activeStep + ' ' + constants.progress.doneStep);\n            targetProgressItem.prevAll().addClass(constants.progress.doneStep);\n            targetProgressItem.addClass(constants.progress.activeStep);\n\n            /**\n             *\n             * data-ixp-flow-direction = forward || backward\n             * data-ixp-flow-step-transitioning = leave || enter\n             * [data-ixp-flow-step-transitioning]\n             * removeAttr('data-ixp-flow-step-transitioning')\n             * data-ixp-flow-step-placement = in || out\n             *\n             *\n             */\n            this.$el.attr('data-ixp-flow-direction', direction);\n            this.$el.attr('data-ixp-flow-progress', progress);\n\n            var me = this;\n\n            if (Modernizr && Modernizr.csstransitions !== true) {\n                if (this.showInit) {\n                    // Use JS animations - slide, fade, etc\n                    currStep.attr(constants.steps.attrTransitioning, 'leave');\n                    targetStep.attr(constants.steps.attrTransitioning, 'enter');\n                    this.activeStep = targetStep;\n                    this._doTransitions(isForward, targetStep, currStep);\n                } else {\n                    targetStep.siblings().attr(constants.steps.attrPlacement, 'out').hide();\n                    targetStep\n                        .attr(constants.steps.attrPlacement, 'in')\n                        .css({\n                            left: 0,\n                            top: 0\n                        })\n                        .show();\n                    this.activeStep = targetStep;\n                }\n            } else {\n                if (this.showInit) {\n                    setTimeout(function() {\n                        currStep.attr(constants.steps.attrTransitioning, 'leave');\n                        targetStep.attr(constants.steps.attrTransitioning, 'enter');\n                        me.activeStep = targetStep;\n\n                        if (me.$el.is(':hidden')) {\n                            setTimeout(function() {\n                                me._cleanSteps();\n                            }, 1);\n                        }\n                    }, 1);\n                } else {\n                    targetStep.siblings().attr(constants.steps.attrPlacement, 'out');\n                    targetStep.attr(constants.steps.attrPlacement, 'in');\n                    this.activeStep = targetStep;\n                }\n            }\n\n            this.seq = targetSeq;\n            this._onResize();\n\n            if (options.isClicked && options.isClicked === true) {\n                if (window.liveballTag) {\n                    var $data = targetStep.data('ixp-component-tag');\n                    if ($data !== '') {\n                        liveballTag($data);\n                    }\n                }\n            }\n\n            if (!this.showInit) {\n                this.$el.removeClass(constants.initClass);\n                this.showInit = true;\n            }\n\n            // Push step moved interaction here\n            if (options.interaction) {\n                this.pushInteraction(_.assign({\n                    name: 'step moved',\n                    step: this.seq\n                }, options.interaction));\n            }\n\n            // Mark user as converted when opened defined slide\n            if (!this.inStudio && targetStep.find('[data-ixp-behavior-'+ constants.behaviors.convert +']').length) {\n                runtime.convert();\n            }\n        },\n\n        _getTransition: function($step) {\n            var getStyle = function($target, stepClasses) {\n                if ($target.hasClass(stepClasses.classSlideVertical)) {\n                    return 'slideY';\n                } else if ($target.hasClass(stepClasses.classSlideHorizontal)) {\n                    return 'slideX';\n                } else if ($target.hasClass(stepClasses.classFade)) {\n                    return 'fade';\n                }\n                return null;\n            };\n\n            var stepStyle = getStyle($step, constants.behaviors.transitions.step);\n            if (!stepStyle) {\n                var $parent = this.$el;\n                stepStyle = getStyle($parent,constants.behaviors.transitions.allSteps);\n            }\n            return stepStyle;\n        },\n\n        _doTransitions: function(isForward, targetStep, currentStep) {\n            var targetStyle = this._getTransition(targetStep);\n            var currentStyle = this._getTransition(currentStep);\n            if (targetStyle === 'slideX' || targetStyle === 'slideY') {\n                var me = this;\n                targetStep.show(0, function() {\n                    me._doTransition(currentStep, currentStyle, isForward, false);\n                    me._doTransition(targetStep, targetStyle, isForward, true);\n                });\n            } else {\n                this._doTransition(currentStep, currentStyle, isForward, false);\n                this._doTransition(targetStep, targetStyle, isForward, true);\n            }\n        },\n\n        _doTransition: function($step, style, isForward, active) {\n            if (!active && active !== false) {\n                active = false;\n            }\n            var me = this;\n            if (style === 'fade') {\n                var opacity = active ? 1 : 0;\n                $step.fadeTo(\n                    constants.behaviors.transitions.duration,\n                    opacity,\n                    constants.behaviors.transitions.easing,\n                    function() {\n                        if (active) {\n                            me._cleanSteps();\n                        }\n                    }\n                );\n            } else if (style === 'slideX' || style === 'slideY') {\n                var prop, amount;\n                if (style === 'slideX') {\n                    prop = 'left';\n                    amount = this.stepsWrap.outerWidth() + \"px\";\n                } else {\n                    prop = 'top';\n                    amount = this.stepsWrap.outerHeight() + \"px\";\n                }\n                var movement = isForward ? '-=' : '+=';\n                var animateOpts = {};\n                animateOpts[prop] = movement + amount;\n\n                $step.animate(animateOpts, {\n                    duration: constants.behaviors.transitions.duration,\n                    queue: false,\n                    complete: function() {\n                        if (active) {\n                            me._cleanSteps();\n                        }\n                    }\n                });\n            } else {\n                $step.toggle(active);\n                if (active){\n                    this._cleanSteps();\n                }\n            }\n        },\n\n        previous: function(options) {\n            options = _.extend(options || {}, { step: this.seq - 1 });\n            this.debouncedShow(options);\n        },\n\n        next: function(options) {\n            options = _.extend(options || {}, { step: this.seq + 1 });\n            this.debouncedShow(options);\n        },\n\n        // events\n        _onResize: function (e) {\n            if (!this.inStudio || this.activeHeight !== this._getActiveHeight()) {\n                this._updateHeight();\n            }\n        },\n\n        _onTransitionEnd: function(e) {\n            if (this._isOwnStep($(e.target))) {\n                this.debouncedCleanSteps();\n            }\n        },\n\n        _cleanSteps: function() {\n            var steps = this._getSteps();\n            this.activeStep.attr(constants.steps.attrPlacement, 'in');\n            steps.removeAttr(constants.steps.attrTransitioning);\n            this.activeStep.siblings().attr(constants.steps.attrPlacement, 'out');\n\n            var scrollTopAllowed = !this.inStudio && this.change_scroll_top;\n            if (scrollTopAllowed && (this.scrollToDeferred && this.scrollToDeferred.preventScrollToStep)) {\n                scrollTopAllowed = false;\n            }\n            if (scrollTopAllowed) {\n                runtime.scrollTo(this.activeStep, {\n                    speed: (constants.behaviors.transitions.duration / 2),\n                    inViewport: {\n                        tolerance: 1,\n                        edge: 'top'\n                    },\n                    updateUrlHash: false\n                });\n            }\n\n            this.recalculateVisibility({ delay: 1 });\n\n            var ee = {\n                steps: this.maxseq,\n                step: { index: this.seq, element: steps.filter(':eq(' + this.seq + ')')[0] }\n            };\n            this.triggerExtensibility(constants.extensibility.events.navigated, ee);\n\n            this._resolveScrollTo('completed');\n\n            if (this.autoplayPaused) {\n                this.autoplayPaused = false;\n                this.startAuto();\n            }\n        },\n\n        _onProgressClick: function(e) {\n            e.preventDefault();\n\n            var target = e.target;\n\n            this.show({\n                step: this.$(target).data('step'),\n                isClicked: true,\n                interaction: {\n                    source: 'click',\n                    sourceTarget: 'progress'\n                }\n            });\n        },\n\n        _onFocusClick: function(event) {\n            if (event.keyCode == 13 || event.keyCode == 32) {\n                event.preventDefault();\n                var target = event.target;\n\n                this.show({\n                    step: this.$(target).data('step'),\n                    isClicked: true,\n                    interaction: {\n                        source: 'keyup',\n                        sourceTarget: 'progress'\n                    }\n                });\n            }\n        },\n\n        _onClickGotoNext: function(e) {\n            e.preventDefault();\n\n            this.next({\n                isClicked: true,\n                loop: this.looping_enabled,\n                interaction: {\n                    source: 'click',\n                    sourceTarget: 'next'\n                }\n            });\n        },\n\n        _onClickGotoPrevious: function (e) {\n            e.preventDefault();\n\n            this.previous({\n                isClicked: true,\n                loop: this.looping_enabled,\n                interaction: {\n                    source: 'click',\n                    sourceTarget: 'previous'\n                }\n            });\n        },\n\n        _onFocusClickGotoNext: function(event) {\n            if (event.keyCode == 13 || event.keyCode == 32) {\n                event.preventDefault();\n\n                this.next({\n                    isClicked: true,\n                    loop: this.looping_enabled,\n                    interaction: {\n                        source: 'keyboard',\n                        sourceTarget: 'next'\n                    }\n                });\n            }\n        },\n\n        _onFocusClickGotoPrevious: function (event) {\n            if (event.keyCode == 13 || event.keyCode == 32) {\n                event.preventDefault();\n\n                this.previous({\n                    isClicked: true,\n                    loop: this.looping_enabled,\n                    interaction: {\n                        source: 'keyboard',\n                        sourceTarget: 'previous'\n                    }\n                });\n            }\n        },\n\n        _onBehaviorGotoNext: function(e) {\n            e.preventDefault();\n\n            var max = this.maxseq;\n            var curr = this.seq;\n\n            if (curr < max) {\n                if (e.originalEvent && e.originalEvent[constants.inputs.events.handled + this.instanceId]) {\n                    return;\n                }\n                e.originalEvent[constants.inputs.events.handled + this.instanceId] = true;\n\n                this.next({\n                    isClicked: true,\n                    interaction: {\n                        source: 'behavior',\n                        behaviourName: constants.behaviors.nextStep\n                    }\n                });\n            }\n        },\n\n        _onBehaviorGotoPrevious: function(e) {\n            e.preventDefault();\n\n            var curr = this.seq;\n            if (curr > 0) {\n                if (e.originalEvent && e.originalEvent[constants.inputs.events.handled + this.instanceId]) {\n                    return;\n                }\n                e.originalEvent[constants.inputs.events.handled + this.instanceId] = true;\n\n                this.previous({\n                    isClicked: true,\n                    interaction: {\n                        source: 'behavior',\n                        behaviourName: constants.behaviors.previousStep\n                    }\n                });\n            }\n        },\n\n        _onBehaviorGotoFirst: function(e) {\n            e.preventDefault();\n\n            if (e.originalEvent && e.originalEvent[constants.inputs.events.handled + this.instanceId]) {\n                return;\n            }\n            e.originalEvent[constants.inputs.events.handled + this.instanceId] = true;\n\n            this.show({\n                step: 0,\n                isClicked: true,\n                interaction: {\n                    source: 'behavior',\n                    behaviourName: constants.behaviors.firstStep\n                }\n            });\n        },\n\n        _onBehaviorGotoLast: function(e) {\n            e.preventDefault();\n\n            if (e.originalEvent && e.originalEvent[constants.inputs.events.handled + this.instanceId]) {\n                return;\n            }\n            e.originalEvent[constants.inputs.events.handled + this.instanceId] = true;\n\n            this.show({\n                step: this.maxseq,\n                isClicked: true,\n                interaction: {\n                    source: 'behavior',\n                    behaviourName: constants.behaviors.lastStep\n                }\n            });\n        },\n\n        // setup functions\n        _getSteps: function() {\n            return this.stepsWrap.children('.ixp-component-flow-step');\n        },\n\n        _updateSteps: function() {\n            this.stepsWrap = this.$el.children('.ixp-component-flow-steps').first();\n            var steps = this._getSteps();\n            this.maxseq = steps.length;\n        },\n        _shouldShowProgress: function() {\n            var className = this.$el.attr('class') || '';\n            if (!className) {\n                return false;\n            } else if (className.indexOf('ixp-c-flow-style-brand-') > -1) {\n                return true;\n            } else {\n                var classes = [\n                    'ixp-component-flow-default',\n                    'ixp-component-flow-dots-light-solid',\n                    'ixp-component-flow-dots-light',\n                    'ixp-component-flow-dots-dark-solid',\n                    'ixp-component-flow-dots-dark',\n                    'ixp-component-flow-bar-light',\n                    'ixp-component-flow-bar-dark'\n                ];\n\n                for (var i= 0, len = classes.length; i < len; i++) {\n                    if (this.$el.hasClass(classes[i])) {\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        },\n\n        _updateProgress: function() {\n            var isClickable = this.inEditMode ? false : this.navigation_enabled;\n\n            var style = 'none';\n            if (this._shouldShowProgress()) {\n                style = isClickable ? 'clickable' : 'display';\n            }\n\n            var clickEventName = 'click' + this.eventNamespace;\n            var keyUpEventName = 'keyup' + this.eventNamespace;\n            this.$el.off(clickEventName, this.progressSelector);\n            this.$el.off(keyUpEventName, this.progressSelector);\n\n            statics.updateProgress(style, this.maxseq, this.instanceId, this.$el);\n\n            if (isClickable) {\n                this.$el.on(clickEventName, this.progressSelector, _.bind(this._onProgressClick, this));\n                this.$el.on(keyUpEventName, this.progressSelector, _.bind(this._onFocusClick, this));\n            }\n        },\n\n        _updateControls: function() {\n            var clickEventName = 'click' + this.eventNamespace;\n            var keyUpEventName = 'keyup' + this.eventNamespace;\n            var className = this.$el.attr('class') || '';\n            if (this.inEditMode || !className || (className.indexOf('ixp-c-flow-style-brand-') === -1 && className.indexOf('ixp-component-flow-controls-') === -1)) {\n                if (this.inStudio) {\n                    this.$el.off(clickEventName, this.previousSelector);\n                    this.$el.off(clickEventName, this.nextSelector);\n                    statics.updateControls(0, this.instanceId, this.$el);\n                }\n                return;\n            }\n\n            this.$el.off(clickEventName, this.previousSelector);\n            this.$el.off(clickEventName, this.nextSelector);\n            this.$el.off(keyUpEventName, this.previousSelector);\n            this.$el.off(keyUpEventName, this.nextSelector);\n\n            statics.updateControls(this.maxseq, this.instanceId, this.$el);\n\n            this.$el.on(clickEventName, this.previousSelector, _.bind(this._onClickGotoPrevious, this));\n            this.$el.on(clickEventName, this.nextSelector, _.bind(this._onClickGotoNext, this));\n            this.$el.on(keyUpEventName, this.previousSelector, _.bind(this._onFocusClickGotoPrevious, this));\n            this.$el.on(keyUpEventName, this.nextSelector, _.bind(this._onFocusClickGotoNext, this));\n        },\n\n        _updateHeight: function() {\n            var $body = this.$('body');\n            var scrollTop = $body.scrollTop();\n\n            var newHeight = this._getActiveHeight();\n\n            if (!this.inEditMode) {\n                this.stepsWrap.css('height', newHeight + 'px');\n                $body.scrollTop(scrollTop);\n            } else {\n                this.stepsWrap.css('height', 'auto');\n            }\n\n            if (this.activeHeight !== newHeight) {\n                // Keep track of the current flow step's height.\n                this.activeHeight = newHeight;\n\n                if (this.inStudio && this.studioApp) {\n                    this.studioApp.componentsManager.trigger('rmw:reflowed', {instanceId: this.instanceId});\n                }\n            }\n        },\n\n        _getActiveHeight: function () {\n            var newHeight = 0;\n\n            var steps = this._getSteps(),\n                maxStep = steps.length - 1;\n\n            // Adjust current step, if necessary.\n            if (this.seq > maxStep) {\n                this.seq = maxStep;\n            } else if (this.seq < 0) {\n                this.seq = 0;\n            }\n\n            if (this.fixed_height) {\n                var me = this;\n                steps.each(function () {\n                    var height = me.$(this).outerHeight();\n                    if (height > newHeight) {\n                        newHeight = height;\n                    }\n                });\n            } else {\n                if (this.seq >= 0 && this.seq < steps.length) {\n                    newHeight = this.$(steps[this.seq]).outerHeight();\n                }\n            }\n\n            if (newHeight === 0 && (this.activeHeight && this.activeHeight > 0)) {\n                newHeight = this.activeHeight;\n            }\n\n            return newHeight;\n        },\n\n        _createElementBadgeUi: function($div) {\n            this.elementBadgeUi = $div.append(constants.templates.badgeUi).toggle(!this.inEditMode);\n            var me = this;\n            $div.find('[data-ixp-flow-action=\"nextStep\"]').on('click', function(e) {\n                me._onBehaviorGotoNext(e);\n            });\n            $div.find('[data-ixp-flow-action=\"prevStep\"]').on('click', function(e) {\n                me._onBehaviorGotoPrevious(e);\n            });\n        },\n\n        _toggleElementBadgeUi: function(show) {\n            if (!this.elementBadgeUi) {\n                return;\n            }\n            this.elementBadgeUi.toggle(show);\n        },\n\n        // creative studio functions\n        allowedDropTargets: function () {\n            return ['Container', 'Column'];\n        },\n\n        allowedChildrenTypes: function() {\n            return ['ixp-flow-step'];\n        },\n\n        onGetCommandMap: function() {\n            var commands = {};\n            commands[constants.extensibility.commands.navigate] = {\n                fn: this._onCommandNavigate\n            };\n            commands[constants.extensibility.commands.scrollto] = {\n                fn: this._onCommandScrollTo\n            };\n            return commands;\n        },\n\n        _isOwnStep: function($el) {\n            if (!$el.is('.ixp-component-flow-step')) {\n                return false;\n            }\n            var $stepsContainer = $el.closest('.ixp-component-flow-steps');\n            var stepOwnerId = $stepsContainer.attr('data-ixp-flow-steps');\n            return stepOwnerId === this.instanceId;\n        },\n\n        _getOwnStepFromElement: function($el) {\n            if (this._isOwnStep($el)) {\n                return $el;\n            }\n\n            var $nextStep = $el.parent().closest('.ixp-component-flow-step');\n            if (!$nextStep.length) {\n                return;\n            }\n\n            return this._getOwnStepFromElement($nextStep);\n        },\n\n        _onCommandScrollTo: function(e) {\n            runtime.log('_onCommandScrollTo called on', this, e);\n\n            if (!e) {\n                return;\n            }\n\n            this._resolveScrollTo('aborted');\n\n            var step, $step;\n            var targetIsStep = true;\n            if (e.element || e.anchor) {\n                var $descendantTarget;\n                if (e.element) {\n                    $descendantTarget = this.$el.find(e.element);\n                } else {\n                    $descendantTarget = this.$el.find('[data-ixp-anchor=\"' + e.anchor + '\"]');\n                }\n                if ($descendantTarget.length) {\n                    $step = $descendantTarget;\n                    if (!this._isOwnStep($descendantTarget)) {\n                        targetIsStep = false;\n                        $step = this._getOwnStepFromElement($descendantTarget);\n                    }\n\n                    if (!$step || !$step.length) {\n                        return;\n                    }\n\n                    //step = $step.index();\n                    step = this.$.inArray($step.attr('id'), $step.parent().children('.ixp-component-flow-step').map(function() { return this.id }));\n                }\n            } else if (e.step) {\n                step = e.step;\n            } else {\n                return;\n            }\n\n            this.scrollToDeferred = {\n                preventScrollToStep: true\n            };\n\n            var me = this;\n            var promise = new Promise(function (resolve, reject) {\n                me.scrollToDeferred.resolve = resolve;\n                me.scrollToDeferred.reject = reject;\n            });\n\n            var ee = {\n                step: step,\n                status: 'pending',\n                promise: promise,\n                preventDefault: false\n            };\n\n            if (targetIsStep) {\n                ee.element = this.$el[0];\n                if (this.change_scroll_top) {\n                    ee.inViewport = {\n                        tolerance: 1,\n                        edge: 'top'\n                    };\n                } else {\n                    ee.inViewport = { tolerance: 0.5 };\n                }\n            }\n\n            this.scrollToDeferred.envelope = this.getExtensibilityEnvelope(ee);\n\n            if (this.seq === step) {\n                this._resolveScrollTo('completed');\n            }\n\n            this.show({ step: step });\n            this.triggerExtensibility(null, ee, { done: e.done });\n        },\n\n        _resolveScrollTo: function(status) {\n            if (this.scrollToDeferred) {\n                this.scrollToDeferred.envelope.status = status;\n                this.scrollToDeferred.resolve(this.scrollToDeferred.envelope);\n                this.scrollToDeferred = undefined;\n            }\n        },\n\n        _onCommandNavigate: function(e) {\n            this.show({ step: e.step });\n        },\n\n        getParamMapOverrides: function() {\n            return {\n                fixed_height: function(val) {\n                    this.fixed_height = val === \"true\";\n                    this._onResize();\n                },\n                looping_enabled: function(val) {\n                    this.looping_enabled = val;\n                    this.$el.removeClass('ixp-component-flow-no-looping', !this.looping_enabled);\n                }\n            }\n        },\n\n        onGetScaffolding: function(scaffoldingKey, builder, options) {\n            return statics.getFlowScaffolding(scaffoldingKey, builder, options);\n        },\n\n        onGetCssClassesToPreserve: function() {\n            return [ '!'+ constants.initClass ];\n        },\n\n        onStudioStateChanged: function() {\n            var state = this.studioApp.state;\n            if (state.pagePlaceholders === 'hidden') {\n                this.$el.attr(constants.modes.modeAttr, constants.modes.normalMode);\n                if (this.inEditMode) {\n                    this.inEditMode = false;\n                    this._updateHeight();\n                    this._updateControls();\n                    this._toggleElementBadgeUi(true);\n                }\n            } else {\n                this.$el.attr(constants.modes.modeAttr, constants.modes.editMode);\n                if (!this.inEditMode) {\n                    this.inEditMode = true;\n                    this._updateHeight();\n                    this._updateControls();\n                    this._toggleElementBadgeUi(false);\n                }\n            }\n        },\n\n        onListenToStudioEvents: function(events) {\n            this.onStudioStateChanged();\n            events.on('page:reflowed', function(e) {\n                if (e && e.source && e.source.id === this.instanceId && e.source.element) {\n                    if (e.source.element && this.$(e.source.element).hasClass(constants.initClass)) {\n                        this.showInit = false;\n                    }\n                }\n                if (!e || e.instanceId !== this.instanceId) {\n                    this._updateSteps();\n                    this._updateProgress();\n                    this._updateControls();\n                    this.show({\n                        step: this.seq,\n                        force: true\n                    });\n                }\n            }, this);\n            events.on('element:badge:activated', function(e) {\n               if (e.instanceId === this.instanceId) {\n                   this._createElementBadgeUi(e.$badgeExtensibility);\n               }\n            }, this);\n        }\n    });\n\n\n    runtime.components.register('ixp-flow-step', {\n        initialize: function(options) {\n            var $flow = this.$el.closest(constants.flowSelector);\n            this.flowInstanceId = $flow.attr(constants.components.data.componentRoot);\n        },\n\n        onDocumentReady: function() {\n            this.$el.on('resize' + this.eventNamespace, _.bind(this._onResize, this));\n            return true;\n        },\n\n        _onResize: function() {\n            runtime.events.trigger(this.flowInstanceId + constants.step.events.resized, { instanceId: this.instanceId });\n        },\n\n        getParamMapOverrides: function() {\n            return {\n                step_tag: function(val) {\n                    if (val) {\n                        this.$el.attr('data-ixp-component-tag', val);\n                    }\n                },\n                step_navigation_tooltip: function(val) {\n                    if (val) {\n                        this.$el.attr('data-ixp-component-flow-step-tooltip', val);\n                    }\n                }\n            }\n        },\n\n        disallowedChildrenTypes: function() {\n            return ['ixp-flow-step'];\n        },\n\n        allowedDropTargets: function () {\n            return ['ixp-flow'];\n        },\n\n        onGetScaffolding: function(scaffoldingKey, builder, options) {\n            return statics.getStepScaffolding(scaffoldingKey, builder, options);\n        }\n    });\n})(window.ixp.runtime);\n"]}