diff --git a/.gitattributes b/.gitattributes index eba1110..dfe0770 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ # Auto detect text files and perform LF normalization -* text=auto \ No newline at end of file +* text=auto diff --git a/.gitignore b/.gitignore index 3f28667..8c61e65 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ dist -jSteps +build +jSteps/bin +jSteps/obj docs -downloads *~ *.diff *.patch diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5c64a64..0000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - 0.10 -install: - - npm install grunt-cli -g - - npm install \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 0fc2821..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,62 +0,0 @@ -# Changelog - -## 1.1.0 -- Added event `onInit` which is fired when the component is completely initialized. Closes issue [#80](https://github.com/rstaib/jquery-steps/issues/80) -- Added event `onContentLoaded` which is fired when the step content is loaded (only in async cases relevant) Closes issue [#88](https://github.com/rstaib/jquery-steps/issues/88) and [#97](https://github.com/rstaib/jquery-steps/issues/97) - -## 1.0.8 -- Fixed issue [#91](https://github.com/rstaib/jquery-steps/issues/91) (`stepChanged` event is fired before transitions are done) - -## 1.0.7 -- Small fix. Closes issue [#58](https://github.com/rstaib/jquery-steps/issues/58) -- Set the default value of `enableCancelButton` for backward compatibility reasons to `false` - -## 1.0.6 -- Small fix. Closes issue [#56](https://github.com/rstaib/jquery-steps/issues/56) - -## 1.0.5 - -- Added a cancel button -- Fixed a bug regarding adding steps dynamically. Closes issue [#56](https://github.com/rstaib/jquery-steps/issues/56) - -## 1.0.4 - -- Fixed an issue regarding currentIndex on finish and finished event. Closes issue [#24](https://github.com/rstaib/jquery-steps/issues/24) and [#33](https://github.com/rstaib/jquery-steps/issues/33) - -## 1.0.3 - -- Adding an id to the outer control wrapper tag will have as of now an impact on the internal uniqueid handling and therefore to the sub tag ids as well - -## 1.0.2 - -- Add destroy method to remove the control functionality completely - -## 1.0.1 - -- Fixed an iframe border and scrolling issue for older browsers (IE8 and lower) - -## 1.0.0 - -- Nested tags which have the same node name as the body tag cause an exception. Closes issue [#4](https://github.com/rstaib/jquery-steps/issues/4) -- Separated data and UI changes from each other and improved code for testability -- Optimized code for better minification -- Configurable clearfix css class -- Vertical step navigation (default: horizontal) -- Removed `"use strict";` because of an ASP.Net tracing issue related to FF (see jQuery ticket: #13335) - -## 0.9.7 - -- On finish failed the last step button does not become highlighted as error. Closes issue [#3](https://github.com/rstaib/jquery-steps/issues/3) -- Advanced accessibility support (WAI-ARIA) -- Replace Number() by parseInt() for parsing `string` to `int` values -- Add `"use strict";` and some other recommended things like the leading `;` -- Substitute `ol` by `ul` tag for step navigation -- Improve performance due to code refactoring - -## 0.9.6 - -- Make css class for the outer component wrapper editable -- Add saveState option flag to enable/disable state persistence (saves last active step position) -- Add current class to step title and body for convinient css targeting [#2](https://github.com/rstaib/jquery-steps/issues/2) -- Add a bugfix related to the `startIndex` property -- Add a bugfix related to focusing after step changes diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 4e6b3f5..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,156 +0,0 @@ -/*jshint node:true*/ -module.exports = function (grunt) -{ - "use strict"; - - /* Hint: Using grunt-strip-code to remove comments from the release file */ - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - concat: { - options: { - separator: '\r\n\r\n', - banner: '/*! <%= "\\r\\n * " + pkg.title %> v<%= pkg.version %> - <%= grunt.template.today("mm/dd/yyyy") + "\\r\\n" %>' + - ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %> <%= (pkg.homepage ? "(" + pkg.homepage + ")" : "") + "\\r\\n" %>' + - ' * Licensed under <%= pkg.licenses[0].type + " " + pkg.licenses[0].url + "\\r\\n */\\r\\n" %>' + - ';(function ($, undefined)\r\n{\r\n', - footer: '\r\n})(jQuery);' - }, - dist: { - files: { - '<%= pkg.folders.dist %>/jquery.steps.js': [ - '<%= pkg.folders.src %>/helper.js', - '<%= pkg.folders.src %>/privates.js', - '<%= pkg.folders.src %>/publics.js', - '<%= pkg.folders.src %>/enums.js', - '<%= pkg.folders.src %>/model.js', - '<%= pkg.folders.src %>/defaults.js' - ] - } - } - }, - //"regex-replace": { - // all: { - // src: ['<%= pkg.folders.nuget %>/jQuery.Steps.nuspec'], - // actions: [ - // { - // name: 'versionNumber', - // search: /.*?<\/version>/gi, - // replace: '<%= pkg.version %>' - // } - // ] - // } - //}, - exec: { - createPkg: { - cmd: "<%= pkg.folders.nuget %>\\Nuget pack <%= pkg.folders.nuget %>\\jQuery.Steps.nuspec -OutputDirectory <%= pkg.folders.dist %> -Version <%= pkg.version %>" - } - }, - compress: { - main: { - options: { - archive: '<%= pkg.folders.dist %>/jquery.steps-<%= pkg.version %>.zip' - }, - files: [ - { flatten: true, expand: true, src: ['<%= pkg.folders.dist %>/*.js'], dest: '/' } - ] - } - }, - uglify: { - options: { - preserveComments: 'some', - report: 'gzip' - }, - all: { - files: { - '<%= pkg.folders.dist %>/jquery.steps.min.js': ['<%= pkg.folders.dist %>/jquery.steps.js'] - } - } - }, - qunit: { - files: ['test/index.html'] - }, - jshint: { - options: { - curly: true, - eqeqeq: true, - immed: true, - latedef: true, - newcap: true, - noarg: true, - sub: true, - undef: true, - eqnull: true, - browser: true, - globals: { - jQuery: true, - $: true, - console: true - } - }, - files: ['<%= pkg.folders.dist %>/jquery.steps.js'], - test: { - options: { - globals: { - jQuery: true, - $: true, - QUnit: true, - module: true, - test: true, - start: true, - stop: true, - expect: true, - ok: true, - equal: true, - deepEqual: true, - strictEqual: true - } - }, - files: { - src: [ - 'test/tests.js' - ] - } - }, - grunt: { - files: { - src: [ - 'Gruntfile.js' - ] - } - } - }, - yuidoc: { - compile: { - name: '<%= pkg.name %>', - description: '<%= pkg.description %>', - version: '<%= pkg.version %>', - url: '<%= pkg.homepage %>', - options: { - exclude: 'qunit-1.11.0.js', - paths: '.', - outdir: '<%= pkg.folders.docs %>/' - } - } - }, - clean: { - api: ["<%= pkg.folders.docs %>"], - build: ["<%= pkg.folders.dist %>"] - } - }); - - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-qunit'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-yuidoc'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-compress'); - grunt.loadNpmTasks('grunt-regex-replace'); - grunt.loadNpmTasks('grunt-exec'); - - grunt.registerTask('default', ['build']); - grunt.registerTask('api', ['clean:api', 'yuidoc']); - grunt.registerTask('build', ['clean:build', 'concat', 'jshint', 'qunit']); - grunt.registerTask('release', ['build', 'api', 'uglify', 'compress', 'exec:createPkg']); -}; \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 8f7ede6..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Rafael J. Staib - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index e7273bd..0000000 --- a/README.md +++ /dev/null @@ -1,81 +0,0 @@ -jQuery Steps Plugin [![Build Status](https://travis-ci.org/rstaib/jquery-steps.svg?branch=master)](https://travis-ci.org/rstaib/jquery-steps) [![Bower version](https://badge.fury.io/bo/jquery.steps.svg)](http://badge.fury.io/bo/jquery.steps) [![NuGet version](https://badge.fury.io/nu/jquery.steps.svg)](http://badge.fury.io/nu/jquery.steps) -============ - -A powerful jQuery wizard plugin that supports accessibility and HTML5. - -## Getting Started - -**jQuery Steps** is a lightweight wizard UI component written for **jQuery**. - -Everything you need to start is: - -1. Include **jQuery** and **jQuery Steps** in your HTML code. -2. Then select an element represents the wizard and call the `steps` method. - -```html - - - - Demo - - - - - - - -
- - -``` - -> For more information [check the documentation](https://github.com/rstaib/jquery-steps/wiki). - -### How to add initial steps? - -There are two ways to add steps and their corresponding content. - -1. Add HTML code into the representing wizard element. - -```html -
-

First Step

-
First Content
- -

Second Step

-
Second Content
-
-``` - -2. Or use the API to add steps dynamically. - -```javascript -// Initialize wizard -var wizard = $("#wizard").steps(); - -// Add step -wizard.steps("add", { - title: "HTML code", - content: "HTML code" -}); -``` - -> For more samples [check the demos](https://github.com/rstaib/jquery-steps/wiki#demo). - -## Reporting an Issue - -Instructions will follow soon! - -## Asking questions - -I'm always happy to help answer your questions. The best way to get quick answers is to go to [stackoverflow.com](http://stackoverflow.com) and tag your questions always with **jquery-steps**. - -## Contributing - -Instructions will follow soon! - -## License - -Copyright (c) 2013 Rafael J. Staib Licensed under the [MIT license](https://github.com/rstaib/jquery-steps/blob/master/LICENSE.txt). diff --git a/add-remove.html b/add-remove.html new file mode 100644 index 0000000..750489d --- /dev/null +++ b/add-remove.html @@ -0,0 +1,11 @@ + + + + jQuery Steps - Dynamic Manipulation Demo + + + + + + + \ No newline at end of file diff --git a/advanced-form.html b/advanced-form.html new file mode 100644 index 0000000..185a158 --- /dev/null +++ b/advanced-form.html @@ -0,0 +1,11 @@ + + + + jQuery Steps - Advanced Form Demo + + + + + + + \ No newline at end of file diff --git a/async.html b/async.html new file mode 100644 index 0000000..468f62a --- /dev/null +++ b/async.html @@ -0,0 +1,11 @@ + + + + jQuery Steps - Async Demo + + + + + + + \ No newline at end of file diff --git a/basic-form.html b/basic-form.html new file mode 100644 index 0000000..aeacb23 --- /dev/null +++ b/basic-form.html @@ -0,0 +1,11 @@ + + + + jQuery Steps - Basic Form Demo + + + + + + + \ No newline at end of file diff --git a/basic.html b/basic.html new file mode 100644 index 0000000..97e39d1 --- /dev/null +++ b/basic.html @@ -0,0 +1,11 @@ + + + + jQuery Steps - Basic Demo + + + + + + + \ No newline at end of file diff --git a/bower.json b/bower.json deleted file mode 100644 index 7b63e2b..0000000 --- a/bower.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "jquery.steps", - "description": "A powerful jQuery wizard plugin that supports accessibility and HTML5.", - "keywords": [ - "wizard", - "navigation", - "forms", - "UI", - "component", - "HTML5", - "accessibility", - "validation", - "tabs", - "steps" - ], - "version": "1.1.0", - "authors": [ - { "name": "Rafael Staib", "email": "me@rafaelstaib.com", "url": "http://www.rafaelstaib.com" } - ], - "homepage": "http://www.jquery-steps.com", - "repository": { - "type": "git", - "url": "git://github.com/rstaib/jquery-steps.git" - }, - "license": "MIT", - "main": [ - "build/jquery.steps.js", - "demo/css/jquery.steps.css" - ], - "ignore": [ - "**/.*", - "build/*.nupkg", - "build/*.zip", - "lib", - "nuget", - "src", - "test", - "*.md", - "*.txt", - "Gruntfile.js", - "package.json", - "steps.jquery.json" - ], - "dependencies": { - "jquery": ">=1.9.0" - } -} diff --git a/build/jQuery.Steps.1.1.0.nupkg b/build/jQuery.Steps.1.1.0.nupkg deleted file mode 100644 index 4f52e85..0000000 Binary files a/build/jQuery.Steps.1.1.0.nupkg and /dev/null differ diff --git a/build/jquery.steps-1.1.0.zip b/build/jquery.steps-1.1.0.zip deleted file mode 100644 index b762d08..0000000 Binary files a/build/jquery.steps-1.1.0.zip and /dev/null differ diff --git a/build/jquery.steps.js b/build/jquery.steps.js deleted file mode 100644 index 956b05a..0000000 --- a/build/jquery.steps.js +++ /dev/null @@ -1,2042 +0,0 @@ -/*! - * jQuery Steps v1.1.0 - 09/04/2014 - * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com) - * Licensed under MIT http://www.opensource.org/licenses/MIT - */ -;(function ($, undefined) -{ -$.fn.extend({ - _aria: function (name, value) - { - return this.attr("aria-" + name, value); - }, - - _removeAria: function (name) - { - return this.removeAttr("aria-" + name); - }, - - _enableAria: function (enable) - { - return (enable == null || enable) ? - this.removeClass("disabled")._aria("disabled", "false") : - this.addClass("disabled")._aria("disabled", "true"); - }, - - _showAria: function (show) - { - return (show == null || show) ? - this.show()._aria("hidden", "false") : - this.hide()._aria("hidden", "true"); - }, - - _selectAria: function (select) - { - return (select == null || select) ? - this.addClass("current")._aria("selected", "true") : - this.removeClass("current")._aria("selected", "false"); - }, - - _id: function (id) - { - return (id) ? this.attr("id", id) : this.attr("id"); - } -}); - -if (!String.prototype.format) -{ - String.prototype.format = function() - { - var args = (arguments.length === 1 && $.isArray(arguments[0])) ? arguments[0] : arguments; - var formattedString = this; - for (var i = 0; i < args.length; i++) - { - var pattern = new RegExp("\\{" + i + "\\}", "gm"); - formattedString = formattedString.replace(pattern, args[i]); - } - return formattedString; - }; -} - -/** - * A global unique id count. - * - * @static - * @private - * @property _uniqueId - * @type Integer - **/ -var _uniqueId = 0; - -/** - * The plugin prefix for cookies. - * - * @final - * @private - * @property _cookiePrefix - * @type String - **/ -var _cookiePrefix = "jQu3ry_5teps_St@te_"; - -/** - * Suffix for the unique tab id. - * - * @final - * @private - * @property _tabSuffix - * @type String - * @since 0.9.7 - **/ -var _tabSuffix = "-t-"; - -/** - * Suffix for the unique tabpanel id. - * - * @final - * @private - * @property _tabpanelSuffix - * @type String - * @since 0.9.7 - **/ -var _tabpanelSuffix = "-p-"; - -/** - * Suffix for the unique title id. - * - * @final - * @private - * @property _titleSuffix - * @type String - * @since 0.9.7 - **/ -var _titleSuffix = "-h-"; - -/** - * An error message for an "index out of range" error. - * - * @final - * @private - * @property _indexOutOfRangeErrorMessage - * @type String - **/ -var _indexOutOfRangeErrorMessage = "Index out of range."; - -/** - * An error message for an "missing corresponding element" error. - * - * @final - * @private - * @property _missingCorrespondingElementErrorMessage - * @type String - **/ -var _missingCorrespondingElementErrorMessage = "One or more corresponding step {0} are missing."; - -/** - * Adds a step to the cache. - * - * @static - * @private - * @method addStepToCache - * @param wizard {Object} A jQuery wizard object - * @param step {Object} The step object to add - **/ -function addStepToCache(wizard, step) -{ - getSteps(wizard).push(step); -} - -function analyzeData(wizard, options, state) -{ - var stepTitles = wizard.children(options.headerTag), - stepContents = wizard.children(options.bodyTag); - - // Validate content - if (stepTitles.length > stepContents.length) - { - throwError(_missingCorrespondingElementErrorMessage, "contents"); - } - else if (stepTitles.length < stepContents.length) - { - throwError(_missingCorrespondingElementErrorMessage, "titles"); - } - - var startIndex = options.startIndex; - - state.stepCount = stepTitles.length; - - // Tries to load the saved state (step position) - if (options.saveState && $.cookie) - { - var savedState = $.cookie(_cookiePrefix + getUniqueId(wizard)); - // Sets the saved position to the start index if not undefined or out of range - var savedIndex = parseInt(savedState, 0); - if (!isNaN(savedIndex) && savedIndex < state.stepCount) - { - startIndex = savedIndex; - } - } - - state.currentIndex = startIndex; - - stepTitles.each(function (index) - { - var item = $(this), // item == header - content = stepContents.eq(index), - modeData = content.data("mode"), - mode = (modeData == null) ? contentMode.html : getValidEnumValue(contentMode, - (/^\s*$/.test(modeData) || isNaN(modeData)) ? modeData : parseInt(modeData, 0)), - contentUrl = (mode === contentMode.html || content.data("url") === undefined) ? - "" : content.data("url"), - contentLoaded = (mode !== contentMode.html && content.data("loaded") === "1"), - step = $.extend({}, stepModel, { - title: item.html(), - content: (mode === contentMode.html) ? content.html() : "", - contentUrl: contentUrl, - contentMode: mode, - contentLoaded: contentLoaded - }); - - addStepToCache(wizard, step); - }); -} - -/** - * Triggers the onCanceled event. - * - * @static - * @private - * @method cancel - * @param wizard {Object} The jQuery wizard object - **/ -function cancel(wizard) -{ - wizard.triggerHandler("canceled"); -} - -function decreaseCurrentIndexBy(state, decreaseBy) -{ - return state.currentIndex - decreaseBy; -} - -/** - * Removes the control functionality completely and transforms the current state to the initial HTML structure. - * - * @static - * @private - * @method destroy - * @param wizard {Object} A jQuery wizard object - **/ -function destroy(wizard, options) -{ - var eventNamespace = getEventNamespace(wizard); - - // Remove virtual data objects from the wizard - wizard.unbind(eventNamespace).removeData("uid").removeData("options") - .removeData("state").removeData("steps").removeData("eventNamespace") - .find(".actions a").unbind(eventNamespace); - - // Remove attributes and CSS classes from the wizard - wizard.removeClass(options.clearFixCssClass + " vertical"); - - var contents = wizard.find(".content > *"); - - // Remove virtual data objects from panels and their titles - contents.removeData("loaded").removeData("mode").removeData("url"); - - // Remove attributes, CSS classes and reset inline styles on all panels and their titles - contents.removeAttr("id").removeAttr("role").removeAttr("tabindex") - .removeAttr("class").removeAttr("style")._removeAria("labelledby") - ._removeAria("hidden"); - - // Empty panels if the mode is set to 'async' or 'iframe' - wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty(); - - var wizardSubstitute = $("<{0} class=\"{1}\">".format(wizard.get(0).tagName, wizard.attr("class"))); - - var wizardId = wizard._id(); - if (wizardId != null && wizardId !== "") - { - wizardSubstitute._id(wizardId); - } - - wizardSubstitute.html(wizard.find(".content").html()); - wizard.after(wizardSubstitute); - wizard.remove(); - - return wizardSubstitute; -} - -/** - * Triggers the onFinishing and onFinished event. - * - * @static - * @private - * @method finishStep - * @param wizard {Object} The jQuery wizard object - * @param state {Object} The state container of the current wizard - **/ -function finishStep(wizard, state) -{ - var currentStep = wizard.find(".steps li").eq(state.currentIndex); - - if (wizard.triggerHandler("finishing", [state.currentIndex])) - { - currentStep.addClass("done").removeClass("error"); - wizard.triggerHandler("finished", [state.currentIndex]); - } - else - { - currentStep.addClass("error"); - } -} - -/** - * Gets or creates if not exist an unique event namespace for the given wizard instance. - * - * @static - * @private - * @method getEventNamespace - * @param wizard {Object} A jQuery wizard object - * @return {String} Returns the unique event namespace for the given wizard - */ -function getEventNamespace(wizard) -{ - var eventNamespace = wizard.data("eventNamespace"); - - if (eventNamespace == null) - { - eventNamespace = "." + getUniqueId(wizard); - wizard.data("eventNamespace", eventNamespace); - } - - return eventNamespace; -} - -function getStepAnchor(wizard, index) -{ - var uniqueId = getUniqueId(wizard); - - return wizard.find("#" + uniqueId + _tabSuffix + index); -} - -function getStepPanel(wizard, index) -{ - var uniqueId = getUniqueId(wizard); - - return wizard.find("#" + uniqueId + _tabpanelSuffix + index); -} - -function getStepTitle(wizard, index) -{ - var uniqueId = getUniqueId(wizard); - - return wizard.find("#" + uniqueId + _titleSuffix + index); -} - -function getOptions(wizard) -{ - return wizard.data("options"); -} - -function getState(wizard) -{ - return wizard.data("state"); -} - -function getSteps(wizard) -{ - return wizard.data("steps"); -} - -/** - * Gets a specific step object by index. - * - * @static - * @private - * @method getStep - * @param index {Integer} An integer that belongs to the position of a step - * @return {Object} A specific step object - **/ -function getStep(wizard, index) -{ - var steps = getSteps(wizard); - - if (index < 0 || index >= steps.length) - { - throwError(_indexOutOfRangeErrorMessage); - } - - return steps[index]; -} - -/** - * Gets or creates if not exist an unique id from the given wizard instance. - * - * @static - * @private - * @method getUniqueId - * @param wizard {Object} A jQuery wizard object - * @return {String} Returns the unique id for the given wizard - */ -function getUniqueId(wizard) -{ - var uniqueId = wizard.data("uid"); - - if (uniqueId == null) - { - uniqueId = wizard._id(); - if (uniqueId == null) - { - uniqueId = "steps-uid-".concat(_uniqueId); - wizard._id(uniqueId); - } - - _uniqueId++; - wizard.data("uid", uniqueId); - } - - return uniqueId; -} - -/** - * Gets a valid enum value by checking a specific enum key or value. - * - * @static - * @private - * @method getValidEnumValue - * @param enumType {Object} Type of enum - * @param keyOrValue {Object} Key as `String` or value as `Integer` to check for - */ -function getValidEnumValue(enumType, keyOrValue) -{ - validateArgument("enumType", enumType); - validateArgument("keyOrValue", keyOrValue); - - // Is key - if (typeof keyOrValue === "string") - { - var value = enumType[keyOrValue]; - if (value === undefined) - { - throwError("The enum key '{0}' does not exist.", keyOrValue); - } - - return value; - } - // Is value - else if (typeof keyOrValue === "number") - { - for (var key in enumType) - { - if (enumType[key] === keyOrValue) - { - return keyOrValue; - } - } - - throwError("Invalid enum value '{0}'.", keyOrValue); - } - // Type is not supported - else - { - throwError("Invalid key or value type."); - } -} - -/** - * Routes to the next step. - * - * @static - * @private - * @method goToNextStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @return {Boolean} Indicates whether the action executed - **/ -function goToNextStep(wizard, options, state) -{ - return paginationClick(wizard, options, state, increaseCurrentIndexBy(state, 1)); -} - -/** - * Routes to the previous step. - * - * @static - * @private - * @method goToPreviousStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @return {Boolean} Indicates whether the action executed - **/ -function goToPreviousStep(wizard, options, state) -{ - return paginationClick(wizard, options, state, decreaseCurrentIndexBy(state, 1)); -} - -/** - * Routes to a specific step by a given index. - * - * @static - * @private - * @method goToStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param index {Integer} The position (zero-based) to route to - * @return {Boolean} Indicates whether the action succeeded or failed - **/ -function goToStep(wizard, options, state, index) -{ - if (index < 0 || index >= state.stepCount) - { - throwError(_indexOutOfRangeErrorMessage); - } - - if (options.forceMoveForward && index < state.currentIndex) - { - return; - } - - var oldIndex = state.currentIndex; - if (wizard.triggerHandler("stepChanging", [state.currentIndex, index])) - { - // Save new state - state.currentIndex = index; - saveCurrentStateToCookie(wizard, options, state); - - // Change visualisation - refreshStepNavigation(wizard, options, state, oldIndex); - refreshPagination(wizard, options, state); - loadAsyncContent(wizard, options, state); - startTransitionEffect(wizard, options, state, index, oldIndex, function() - { - wizard.triggerHandler("stepChanged", [index, oldIndex]); - }); - } - else - { - wizard.find(".steps li").eq(oldIndex).addClass("error"); - } - - return true; -} - -function increaseCurrentIndexBy(state, increaseBy) -{ - return state.currentIndex + increaseBy; -} - -/** - * Initializes the component. - * - * @static - * @private - * @method initialize - * @param options {Object} The component settings - **/ -function initialize(options) -{ - /*jshint -W040 */ - var opts = $.extend(true, {}, defaults, options); - - return this.each(function () - { - var wizard = $(this); - var state = { - currentIndex: opts.startIndex, - currentStep: null, - stepCount: 0, - transitionElement: null - }; - - // Create data container - wizard.data("options", opts); - wizard.data("state", state); - wizard.data("steps", []); - - analyzeData(wizard, opts, state); - render(wizard, opts, state); - registerEvents(wizard, opts); - - // Trigger focus - if (opts.autoFocus && _uniqueId === 0) - { - getStepAnchor(wizard, opts.startIndex).focus(); - } - - wizard.triggerHandler("init", [opts.startIndex]); - }); -} - -/** - * Inserts a new step to a specific position. - * - * @static - * @private - * @method insertStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param index {Integer} The position (zero-based) to add - * @param step {Object} The step object to add - * @example - * $("#wizard").steps().insert(0, { - * title: "Title", - * content: "", // optional - * contentMode: "async", // optional - * contentUrl: "/Content/Step/1" // optional - * }); - * @chainable - **/ -function insertStep(wizard, options, state, index, step) -{ - if (index < 0 || index > state.stepCount) - { - throwError(_indexOutOfRangeErrorMessage); - } - - // TODO: Validate step object - - // Change data - step = $.extend({}, stepModel, step); - insertStepToCache(wizard, index, step); - if (state.currentIndex !== state.stepCount && state.currentIndex >= index) - { - state.currentIndex++; - saveCurrentStateToCookie(wizard, options, state); - } - state.stepCount++; - - var contentContainer = wizard.find(".content"), - header = $("<{0}>{1}".format(options.headerTag, step.title)), - body = $("<{0}>".format(options.bodyTag)); - - if (step.contentMode == null || step.contentMode === contentMode.html) - { - body.html(step.content); - } - - if (index === 0) - { - contentContainer.prepend(body).prepend(header); - } - else - { - getStepPanel(wizard, (index - 1)).after(body).after(header); - } - - renderBody(wizard, state, body, index); - renderTitle(wizard, options, state, header, index); - refreshSteps(wizard, options, state, index); - if (index === state.currentIndex) - { - refreshStepNavigation(wizard, options, state); - } - refreshPagination(wizard, options, state); - - return wizard; -} - -/** - * Inserts a step object to the cache at a specific position. - * - * @static - * @private - * @method insertStepToCache - * @param wizard {Object} A jQuery wizard object - * @param index {Integer} The position (zero-based) to add - * @param step {Object} The step object to add - **/ -function insertStepToCache(wizard, index, step) -{ - getSteps(wizard).splice(index, 0, step); -} - -/** - * Handles the keyup DOM event for pagination. - * - * @static - * @private - * @event keyup - * @param event {Object} An event object - */ -function keyUpHandler(event) -{ - var wizard = $(this), - options = getOptions(wizard), - state = getState(wizard); - - if (options.suppressPaginationOnFocus && wizard.find(":focus").is(":input")) - { - event.preventDefault(); - return false; - } - - var keyCodes = { left: 37, right: 39 }; - if (event.keyCode === keyCodes.left) - { - event.preventDefault(); - goToPreviousStep(wizard, options, state); - } - else if (event.keyCode === keyCodes.right) - { - event.preventDefault(); - goToNextStep(wizard, options, state); - } -} - -/** - * Loads and includes async content. - * - * @static - * @private - * @method loadAsyncContent - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - */ -function loadAsyncContent(wizard, options, state) -{ - if (state.stepCount > 0) - { - var currentIndex = state.currentIndex, - currentStep = getStep(wizard, currentIndex); - - if (!options.enableContentCache || !currentStep.contentLoaded) - { - switch (getValidEnumValue(contentMode, currentStep.contentMode)) - { - case contentMode.iframe: - wizard.find(".content > .body").eq(state.currentIndex).empty() - .html("