\").addClass(wizardClasses.wizardContent),\n formOptions = this.options.form;\n\n $(\"body\").append(formElement);\n this.element.prepend(contentElement);\n\n formOptions.buttonsTemplate = formOptions.buttonsTemplate || \"\";\n this.form = formElement.kendoForm(formOptions).getKendoForm();\n\n contentElement.append(formElement.show());\n },\n\n _iterateButton: function(button) {\n var messages = this.options.messages;\n\n if (typeof button === \"string\") {\n button = {\n name: button\n };\n }\n if (!button.text) {\n button.text = messages[button.name] || button.name.charAt(0).toUpperCase() + button.name.slice(1);\n }\n if (button.primary !== false && (button.name === DONE || button.name === NEXT)) {\n button.primary = true;\n }\n if (!button.position && button.name === RESET) {\n button.position = LEFT;\n } else if (!button.position) {\n button.position = RIGHT;\n }\n\n return button;\n },\n\n _pager: function() {\n var options = this.options,\n messages = options.messages,\n pagerData = {\n step: messages.step,\n currentStep: options.index + 1,\n of: messages.of,\n totalSteps: options.totalSteps\n },\n pager = kendo.template(this._pagerTemplate)(pagerData);\n\n this._leftButtonsContainer.append(pager);\n },\n\n _processButtons: function() {\n var options = this.options,\n buttonsOptions = options.buttons,\n defaultButtons = this._defaultButtonsConfiguration;\n\n if (!buttonsOptions || !buttonsOptions.length || buttonsOptions.length === 0) {\n this.options.defaultButtons = true;\n\n if (options.index === 0) {\n buttonsOptions = defaultButtons.first;\n } else if (options.index + 1 === options.totalSteps) {\n buttonsOptions = defaultButtons.last;\n } else {\n buttonsOptions = defaultButtons.middle;\n }\n }\n\n this.options.buttons = buttonsOptions.map(this._iterateButton.bind(this));\n },\n\n _render: function() {\n this.element = $(\"
\").addClass(wizardClasses.wizardStep);\n\n if (this.options.className) {\n this.element.addClass(this.options.className);\n }\n\n this._ariaAttributes();\n\n if (!this.options.selected) {\n this.element.addClass(HIDDEN);\n this.element.attr(ARIA_HIDDEN, true);\n }\n\n if (this.options.actionBar) {\n this._buttonsContainer();\n }\n\n if (this.options.form) {\n this._form();\n } else {\n this._content();\n }\n }\n });\n\n var Wizard = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n options = options || {};\n\n Widget.fn.init.call(that, element, options);\n\n that._wrapper();\n that._createSteps();\n that._stepper();\n that._attachEvents();\n },\n\n options: {\n name: \"Wizard\",\n contentPosition: BOTTOM,\n actionBar: true,\n pager: true,\n loadOnDemand: false,\n reloadOnSelect: false,\n validateForms: true,\n stepper: {},\n steps: [],\n messages: {\n reset: \"Reset\",\n previous: \"Previous\",\n next: \"Next\",\n done: \"Done\",\n step: \"Step\",\n of: \"of\"\n }\n },\n\n events: [\n ACTIVATE,\n SELECT,\n RESET,\n DONE,\n ERROR,\n CONTENTLOAD,\n FORM_VALIDATE_FAILED\n ],\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that.stepper);\n Widget.fn.destroy.call(that);\n\n that.wrapper.off(WIZARD);\n },\n\n activeStep: function() {\n return this.currentStep;\n },\n\n enableStep: function(stepIndex, value) {\n var that = this,\n targetStep;\n\n if (stepIndex === undefined$1 || stepIndex === null || isNaN(stepIndex) || stepIndex >= that._steps.length || stepIndex < 0) {\n return;\n }\n\n stepIndex = Number(stepIndex);\n targetStep = that._steps[stepIndex];\n\n if (targetStep.options.enabled === value) {\n return;\n } else {\n targetStep.options.enabled = value;\n that.stepper.steps()[stepIndex].enable(value);\n }\n },\n\n insertAt: function(index, stepOptions) {\n var steps = this._steps,\n numberOfSteps = steps.length,\n messages = this.options.messages,\n step, stepperStepOptions, alteredStepIndex, alteredStep,\n iterateStep = function(step, i) {\n var label;\n\n if (i >= index) {\n step.options.index += 1;\n }\n step.options.totalSteps += 1;\n step.element.find(DOT + wizardClasses.wizardPager).remove();\n step._pager();\n\n label = messages.step + \" \" + (step.options.index + 1) + \" \" + messages.of + \" \" + (numberOfSteps + 1);\n step.element.attr(ARIA_LABEL, label);\n };\n\n if (index === null || index === undefined$1 || isNaN(index) || index < 0 || index > numberOfSteps) {\n return;\n }\n if (!stepOptions) {\n return;\n }\n\n stepperStepOptions = this._mapStepForStepper(stepOptions);\n this.stepper.insertAt(index, stepperStepOptions);\n\n stepOptions.totalSteps = numberOfSteps + 1;\n stepOptions.messages = messages;\n stepOptions.index = index;\n stepOptions.formTag = this.wrapper.is(\"form\") ? \"div\" : \"form\";\n\n if (this.options.pager === false && stepOptions.pager !== true) {\n stepOptions.pager = false;\n }\n\n step = new Step(stepOptions);\n steps.forEach(iterateStep);\n steps.splice(index, 0, step);\n\n if (index === 0 || index === numberOfSteps) {\n alteredStepIndex = index === 0 ? 1 : numberOfSteps - 1;\n alteredStep = steps[alteredStepIndex];\n\n if (alteredStep.options.defaultButtons) {\n alteredStep.resetButtons();\n }\n }\n\n this._insertStepElementAtIndex(index, step.element);\n this._stepperAriaAttributes();\n this._steps.forEach(this._iterateAriaStep);\n },\n\n next: function() {\n var that = this,\n stepsLength = that._steps.length,\n currentStepIndex = that.currentStep.options.index;\n\n if (currentStepIndex + 1 === stepsLength) {\n return;\n } else if (!that.steps()[currentStepIndex + 1].options.enabled) {\n return;\n } else {\n that._select(currentStepIndex + 1);\n that._selectStepper(currentStepIndex + 1);\n }\n\n },\n\n previous: function() {\n var that = this,\n currentStepIndex = that.currentStep.options.index;\n\n if (currentStepIndex === 0) {\n return;\n } else if (!that.steps()[currentStepIndex - 1].options.enabled) {\n return;\n } else {\n that._select(currentStepIndex - 1);\n that._selectStepper(currentStepIndex - 1);\n }\n },\n\n removeAt: function(index) {\n var steps = this._steps,\n numberOfSteps = steps.length,\n stepContentElement = $(this.element.find(DOT + wizardClasses.wizardStep).get(index)),\n removedStep, newSelectedStepIndex, alteredStepIndex, alteredStep, i, step, label,\n messages = this.options.messages;\n\n if (index === null || index === undefined$1 || isNaN(index) || index < 0 || index > numberOfSteps || numberOfSteps === 1) {\n return;\n }\n\n this.stepper.removeAt(index);\n removedStep = steps.splice(index, 1)[0];\n\n if (!stepContentElement.hasClass(HIDDEN)) {\n newSelectedStepIndex = index === 0 ? 0 : index - 1;\n this.select(newSelectedStepIndex);\n }\n\n kendo.destroy(stepContentElement);\n stepContentElement.remove();\n\n for (i = 0; i < numberOfSteps - 1; i += 1) {\n step = steps[i];\n step.options.index = i;\n step.options.totalSteps = numberOfSteps - 1;\n step.element.find(DOT + wizardClasses.wizardPager).remove();\n step._pager();\n label = messages.step + \" \" + (i + 1) + \" \" + messages.of + \" \" + (numberOfSteps - 1);\n step.element.attr(ARIA_LABEL, label);\n }\n\n if (index === 0 || index === numberOfSteps - 1) {\n alteredStepIndex = index === 0 ? 0 : numberOfSteps - 2;\n alteredStep = steps[alteredStepIndex];\n\n if (alteredStep.options.defaultButtons) {\n alteredStep.resetButtons();\n }\n }\n\n this._stepperAriaAttributes();\n this._steps.forEach(this._iterateAriaStep);\n },\n\n select: function(stepIndex) {\n var that = this,\n targetStep;\n\n if (stepIndex === undefined$1 || stepIndex === null || isNaN(stepIndex) || stepIndex >= that._steps.length || stepIndex < 0) {\n return;\n }\n\n stepIndex = Number(stepIndex);\n targetStep = that._steps[stepIndex];\n\n if (!targetStep.options.enabled) {\n return;\n }\n\n that._select(stepIndex);\n that._selectStepper(stepIndex);\n },\n\n steps: function() {\n return this._steps;\n },\n\n _attachEvents: function() {\n var that = this,\n clickBeforeSubmit = function() {\n that._doneClicked = true;\n };\n\n that.stepper.bind(SELECT, that._stepperSelectHandler.bind(that));\n\n that.wrapper\n .on(CLICK + WIZARD, \"[\" + DATA_WIZARD_PREFIX + RESET + \"]\", that._resetClickHandler.bind(that))\n .on(CLICK + WIZARD, \"[\" + DATA_WIZARD_PREFIX + PREVIOUS + \"]\", that._previousClickHandler.bind(that))\n .on(CLICK + WIZARD, \"[\" + DATA_WIZARD_PREFIX + NEXT + \"]\", that._nextClickHandler.bind(that));\n\n if (that.wrapper.is(\"form\")) {\n that.wrapper.on(CLICK + WIZARD, \"[\" + DATA_WIZARD_PREFIX + DONE + \"]\", clickBeforeSubmit);\n that.wrapper.on(SUBMIT + WIZARD, that._doneHandler.bind(that));\n } else {\n that.wrapper.on(CLICK + WIZARD, \"[\" + DATA_WIZARD_PREFIX + DONE + \"]\", clickBeforeSubmit);\n that.wrapper.on(CLICK + WIZARD, \"[\" + DATA_WIZARD_PREFIX + DONE + \"]\", that._doneHandler.bind(that));\n }\n },\n\n _changeStep: function(step) {\n var steps = this.wrapper.find(DOT + wizardClasses.wizardStep);\n\n this.currentStep = step;\n\n steps.addClass(HIDDEN);\n steps.attr(ARIA_HIDDEN, true);\n\n step.element.removeClass(HIDDEN);\n step.element.removeAttr(ARIA_HIDDEN);\n },\n\n _createStep: function(options, index, stepsFromMarkup, total) {\n var wrapper = this.wrapper,\n stepsFromMarkupTitles = this.wrapper.children(\"ol, ul\").children(\"li\");\n\n if (typeof options === \"string\") {\n options = {\n title: options\n };\n }\n\n options.totalSteps = total;\n options.messages = this.options.messages;\n options.index = index;\n options.formTag = this.wrapper.is(\"form\") ? \"div\" : \"form\";\n\n if (index === 0) {\n options.selected = true;\n }\n if (this.options.actionBar === false) {\n options.actionBar = false;\n }\n if (stepsFromMarkup.length > 0 && stepsFromMarkup[index]) {\n options.markupContainer = $(stepsFromMarkup[index]);\n\n if (!options.title) {\n options.title = stepsFromMarkupTitles[index] ? stepsFromMarkupTitles[index].textContent : (index + 1).toString();\n\n if (!this.options.steps) {\n this.options.steps = [];\n }\n\n }\n }\n if (wrapper.attr(ID)) {\n options.wizardId = wrapper.attr(ID);\n }\n if (this.options.pager === false && options.pager !== true) {\n options.pager = false;\n }\n\n this.options.steps[index] = extend(true, {}, options);\n\n return new Step(options);\n },\n\n _createSteps: function() {\n var that = this,\n wrapper = that.wrapper,\n stepsOptions = that.options.steps,\n stepsFromMarkup = wrapper.children(\"div\"),\n stepsContainer, i, stepOptions, step;\n\n stepsContainer = $(\"
\").addClass(wizardClasses.wizardStepsContainer);\n\n that._steps = [];\n\n if (!stepsOptions || stepsOptions.length === 0) {\n stepsOptions = [];\n for (i = 0; i < stepsFromMarkup.length; i += 1) {\n stepsOptions.push({});\n }\n }\n\n for (i = 0; i < stepsOptions.length; i += 1) {\n stepOptions = stepsOptions[i];\n\n step = that._createStep(stepOptions, i, stepsFromMarkup, stepsOptions.length);\n\n if (stepOptions.contentUrl && (i === 0 || !that.options.loadOnDemand )) {\n kendo.ui.progress(that.wrapper, true);\n step._ajaxRequest(that);\n }\n\n stepsContainer.append(step.element);\n\n that._steps.push(step);\n }\n\n wrapper.children(\"ol, ul\").remove();\n\n wrapper.empty();\n wrapper.append(stepsContainer);\n that._refreshEditorWidgets();\n\n that.currentStep = that._steps[0];\n },\n\n _doneHandler: function(e) {\n var steps = this._steps,\n currentStep = this.currentStep,\n forms = [],\n form, i;\n\n if (!this._doneClicked) {\n return;\n }\n\n this._doneClicked = false;\n\n if (!!this.options.validateForms && !!currentStep.form && !currentStep.form.validator.validate()) {\n e.preventDefault();\n this.trigger(FORM_VALIDATE_FAILED, { sender: this, step: currentStep, form: currentStep.form });\n return;\n }\n\n for (i = 0; i < steps.length; i += 1) {\n form = steps[i].form;\n if (form) {\n forms.push(form);\n }\n }\n\n this.trigger(DONE, { sender: this, forms: forms, originalEvent: e, button: $(e.target).getKendoButton() });\n },\n\n _insertStepElementAtIndex: function(index, stepElement) {\n var stepsContainer = this.wrapper.find(DOT + wizardClasses.wizardStepsContainer);\n\n if (index === 0) {\n stepsContainer.prepend(stepElement);\n } else {\n stepsContainer.find(DOT + wizardClasses.wizardStep + \":nth-child(\" + index + \")\").after(stepElement);\n }\n },\n\n _isEmpty: function(element) {\n return !kendo.trim(element.html());\n },\n\n _iterateAriaStep: function(step) {\n step._ariaAttributes();\n },\n\n _mapStepForStepper: function(step) {\n var stepperStep = extend(true, {}, step );\n\n stepperStep.label = stepperStep.title;\n\n delete stepperStep.buttons;\n delete stepperStep.pager;\n delete stepperStep.content;\n delete stepperStep.contentUrl;\n delete stepperStep.contentId;\n delete stepperStep.formTag;\n delete stepperStep.wizardId;\n delete stepperStep.messages;\n\n return stepperStep;\n },\n\n _select: function(index) {\n var targetStep = this._steps[index],\n options = this.options;\n\n if (targetStep.options.contentUrl &&\n (options.reloadOnSelect ||\n (options.loadOnDemand && this._isEmpty(targetStep.element.find(DOT + wizardClasses.wizardContent))))) {\n this.ajaxLoad = true;\n kendo.ui.progress(this.wrapper, true);\n targetStep._ajaxRequest(this, true);\n } else {\n this._changeStep(targetStep);\n }\n },\n\n _nextClickHandler: function(e) {\n var that = this,\n steps = that._steps,\n numberOfSteps = that._steps.length,\n currentStep = that.currentStep,\n currentStepIndex = currentStep.options.index,\n button = $(e.target).getKendoButton(),\n targetStep = steps[currentStepIndex + 1];\n\n if (numberOfSteps === currentStepIndex + 1 || !targetStep.options.enabled) {\n return;\n }\n\n if (!!that.options.validateForms && !!currentStep.form && !currentStep.form.validator.validate()) {\n that.trigger(FORM_VALIDATE_FAILED, { sender: that, step: currentStep, form: currentStep.form });\n return;\n }\n\n if (!that.trigger(SELECT, {\n sender: that,\n originalEvent: e.originalEvent,\n step: targetStep,\n button: button\n })) {\n that._select(currentStepIndex + 1);\n that._selectStepper(currentStepIndex + 1);\n\n if (!that.ajaxLoad) {\n that.trigger(ACTIVATE, { sender: that, step: targetStep });\n }\n\n that.ajaxLoad = false;\n }\n },\n\n _previousClickHandler: function(e) {\n var that = this,\n validateForms = that.options.validateForms,\n steps = that._steps,\n currentStep = that.currentStep,\n currentStepIndex = currentStep.options.index,\n button = $(e.target).getKendoButton(),\n targetStep = steps[currentStepIndex - 1];\n\n if (currentStepIndex === 0 || !targetStep.options.enabled) {\n return;\n }\n\n if (!!validateForms && validateForms.validateOnPrevious !== false && !!currentStep.form && !currentStep.form.validator.validate()) {\n that.trigger(FORM_VALIDATE_FAILED, { sender: that, step: currentStep, form: currentStep.form });\n return;\n }\n\n if (!that.trigger(SELECT, {\n sender: that,\n originalEvent: e.originalEvent,\n step: targetStep,\n button: button\n })) {\n that._select(currentStepIndex - 1);\n that._selectStepper(currentStepIndex - 1);\n\n if (!that.ajaxLoad) {\n that.trigger(ACTIVATE, { sender: that, step: targetStep });\n }\n\n that.ajaxLoad = false;\n }\n },\n\n _refreshEditorWidgets: function() {\n var editorElements = this.wrapper.find(\"[data-role='editor']\"),\n i, element;\n\n for (i = 0; i < editorElements.length; i += 1) {\n element = $(editorElements[i]);\n element.getKendoEditor().refresh();\n }\n },\n\n _resetClickHandler: function(e) {\n this.trigger(RESET, { sender: this, originalEvent: e, button: $(e.target).getKendoButton() });\n },\n\n _selectStepper: function(index) {\n var stepper = this.stepper,\n targetStep = stepper.steps()[index],\n targetLink = targetStep.element.find(DOT + STEPPER_STEP_LINK);\n\n stepper.select(index);\n\n stepper.wrapper.find(DOT + STEPPER_STEP_LINK).attr(ARIA_SELECTED, false);\n targetLink.attr(ARIA_SELECTED, true).trigger(\"focus\");\n },\n\n _stepper: function() {\n var wrapper = this.wrapper,\n stepperElement = $(\"
\").prependTo(wrapper),\n options = this.options,\n stepperOptions = options.stepper,\n stepsOptions = options.steps.map(this._mapStepForStepper);\n\n stepperOptions.steps = stepsOptions;\n stepperOptions.orientation = options.contentPosition === BOTTOM ? HORIZONTAL : VERTICAL;\n stepperOptions.selectOnFocus = true;\n stepperOptions.kendoKeydown = function(e) {\n if (e.keyCode === kendo.keys.TAB) {\n e.preventKendoKeydown = true;\n }\n };\n\n this.stepper = stepperElement.kendoStepper(stepperOptions).getKendoStepper();\n\n this._stepperAriaAttributes();\n },\n\n _stepperAriaAttributes: function() {\n var stepper = this.stepper,\n wrapperId = this.wrapper.attr(ID) || \"wizard\",\n stepperSteps = stepper.steps(),\n selected, step, i;\n\n if (!stepperSteps) {\n return;\n }\n\n stepper.element.find(DOT + STEPPER_LIST).attr(ROLE, \"tablist\");\n\n for (i = 0; i < stepperSteps.length; i += 1) {\n selected = false;\n\n if (i === 0) {\n selected = true;\n }\n\n step = stepperSteps[i];\n step.element.attr(ROLE, \"none\")\n .find(\"a\").attr(ROLE, \"tab\")\n .attr(ARIA_CONTROLS, wrapperId + DASH + i)\n .attr(ARIA_SELECTED, selected);\n }\n },\n\n _stepperSelectHandler: function(e) {\n var that = this,\n validateForms = that.options.validateForms,\n stepper = e.sender,\n stepperStep = e.step,\n currentStepIndex = that.currentStep.options.index,\n stepIndex = stepperStep.getIndex(),\n wizardSteps = that._steps,\n step = wizardSteps[stepIndex],\n currentStep = that.currentStep;\n\n if (stepIndex > currentStepIndex && !!validateForms && !!currentStep.form && !currentStep.form.validator.validate()) {\n e.preventDefault();\n that.trigger(FORM_VALIDATE_FAILED, { sender: that, step: currentStep, form: currentStep.form });\n return;\n }\n\n if (stepIndex < currentStepIndex && !!validateForms && validateForms.validateOnPrevious !== false && !!currentStep.form && !currentStep.form.validator.validate()) {\n e.preventDefault();\n that.trigger(FORM_VALIDATE_FAILED, { sender: that, step: currentStep, form: currentStep.form });\n return;\n }\n\n if (!that.trigger(SELECT, { sender: that, originalEvent: e.originalEvent, step: step, stepper: stepper })) {\n that._select(stepIndex);\n\n stepper.wrapper.find(DOT + STEPPER_STEP_LINK).attr(ARIA_SELECTED, false);\n stepperStep.element.find(DOT + STEPPER_STEP_LINK).attr(ARIA_SELECTED, true);\n\n if (!that.ajaxLoad) {\n that.trigger(ACTIVATE, { sender: that, step: step });\n }\n\n that.ajaxLoad = false;\n } else {\n e.preventDefault();\n }\n },\n\n _triggerActivate: function(step) {\n this._changeStep(step);\n this.trigger(ACTIVATE, { sender: this, step: step });\n },\n\n _triggerError: function(xhr, status, step) {\n kendo.ui.progress(this.wrapper, false);\n this.trigger(ERROR, { sender: this, xhr: xhr, status: status, step: step });\n },\n\n _triggerContentLoad: function(step) {\n kendo.ui.progress(this.wrapper, false);\n this.trigger(CONTENTLOAD, { sender: this, step: step });\n },\n\n _wrapper: function() {\n var that = this,\n element = that.element,\n contentPosition = that.options.contentPosition;\n\n that.wrapper = element;\n that.wrapper.addClass(wizardClasses.wizard);\n\n if (contentPosition === RIGHT) {\n that.wrapper.addClass(wizardClasses.verticalWizard + SPACE + wizardClasses.rightWizard);\n } else if (contentPosition === LEFT) {\n that.wrapper.addClass(wizardClasses.verticalWizard + SPACE + wizardClasses.leftWizard);\n } else {\n that.wrapper.addClass(wizardClasses.horizontalWizard);\n }\n }\n });\n\n kendo.wizard = {\n Step: Step\n };\n\n kendo.ui.plugin(Wizard);\n\n })(window.kendo.jQuery);\n\n}));\n"]}