Open Sanjay214598 opened 4 years ago
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>jQeury.steps Demos</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="css/jquery.steps.css">
<script src="js/jquery-1.9.1.min.js"></script>
<script src="js/jquery.steps.js"></script>
</head>
<body>
<!--[if lt IE 7]>
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
<![endif]-->
<div class="content">
<div id="wizard123123"> <a href="#" id="create">Create</a></div>
<div id="wizard123123"> <a href="#" id="destroy">Destroy</a></div>
<h1>Basic Demo</h1>
<script>
$(function ()
{
$("#destroy").on("click", function(e){
console.log(e);
$("#wizard").steps('destroy');
});
$("#create").on("click", function(e){
$("#wizard").steps({
headerTag: "h2",
bodyTag: "section",
transitionEffect: "slideLeft",
titleTemplate: '#title#',
onStepChanging: function (event, currentIndex, newIndex) {
console.log("onStepChanging ",event);
return true;
},
onStepChanged: function (event, currentIndex, priorIndex) {
console.log("onStepChanged ",event);
},
onCanceled: function (event) {
console.log("onCanceled ",event);
},
onFinishing: function (event, currentIndex) {
console.log("onFinishing ",event);
return true;
},
onFinished: function (event, currentIndex) {
console.log("onFinished ",event);
},
});
});
$("#wizard").steps({
headerTag: "h2",
bodyTag: "section",
transitionEffect: "slideLeft",
titleTemplate: '#title#',
onStepChanging: function (event, currentIndex, newIndex) {
console.log("onStepChanging ",event);
return true;
},
onStepChanged: function (event, currentIndex, priorIndex) {
console.log("onStepChanged ",event);
},
onCanceled: function (event) {
console.log("onCanceled ",event);
},
onFinishing: function (event, currentIndex) {
console.log("onFinishing ",event);
return true;
},
onFinished: function (event, currentIndex) {
console.log("onFinished ",event);
},
onNext: function (wizard, state, oldIndex, currentIndex) {
console.log("OnNext ",oldIndex);
var step = state.currentIndex;
var total = state.stepCount;
var percent = (parseInt(step) / parseInt(total)) * 100;
$('.progress-bar').css({width: percent + '%'});
$('.progress-bar').text("Step " + step + " of "+state.stepCount);
},
});
});
</script>
<div id="wizard">
<h2>First Step</h2>
<section>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ut nulla nunc. Maecenas arcu sem, hendrerit a tempor quis,
sagittis accumsan tellus. In hac habitasse platea dictumst. Donec a semper dui. Nunc eget quam libero. Nam at felis metus.
Nam tellus dolor, tristique ac tempus nec, iaculis quis nisi.</p>
</section>
<h2>Second Step</h2>
<section>
<p>Donec mi sapien, hendrerit nec egestas a, rutrum vitae dolor. Nullam venenatis diam ac ligula elementum pellentesque.
In lobortis sollicitudin felis non eleifend. Morbi tristique tellus est, sed tempor elit. Morbi varius, nulla quis condimentum
dictum, nisi elit condimentum magna, nec venenatis urna quam in nisi. Integer hendrerit sapien a diam adipiscing consectetur.
In euismod augue ullamcorper leo dignissim quis elementum arcu porta. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vestibulum leo velit, blandit ac tempor nec, ultrices id diam. Donec metus lacus, rhoncus sagittis iaculis nec, malesuada a diam.
Donec non pulvinar urna. Aliquam id velit lacus.</p>
</section>
<h2>Third Step</h2>
<section>
<p>Morbi ornare tellus at elit ultrices id dignissim lorem elementum. Sed eget nisl at justo condimentum dapibus. Fusce eros justo,
pellentesque non euismod ac, rutrum sed quam. Ut non mi tortor. Vestibulum eleifend varius ullamcorper. Aliquam erat volutpat.
Donec diam massa, porta vel dictum sit amet, iaculis ac massa. Sed elementum dui commodo lectus sollicitudin in auctor mauris
venenatis.</p>
</section>
<h2>Third Step</h2>
<section>
<p>Morbi ornare tellus at elit ultrices id dignissim lorem elementum. Sed eget nisl at justo condimentum dapibus. Fusce eros justo,
pellentesque non euismod ac, rutrum sed quam. Ut non mi tortor. Vestibulum eleifend varius ullamcorper. Aliquam erat volutpat.
Donec diam massa, porta vel dictum sit amet, iaculis ac massa. Sed elementum dui commodo lectus sollicitudin in auctor mauris
venenatis.</p>
</section>
</div>
</div>
</body>
/*!
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; }; }
/**
/**
/**
/**
/**
/**
/**
/**
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);
});
}
/**
function decreaseCurrentIndexBy(state, decreaseBy) { return state.currentIndex - decreaseBy; }
/**
@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}\"></{0}>".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; }
/**
@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"); } }
/**
@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"); }
/**
@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]; }
/**
@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; }
/**
@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."); } }
/**
/**
/**
@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; }
/**
@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]);
}); }
/**
@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}</{0}>".format(options.headerTag, step.title)), body = $("<{0}></{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; }
/**
/**
@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); } }
/**
@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("<iframe src=\"" + currentStep.contentUrl + "\" frameborder=\"0\" scrolling=\"no\" />")
.data("loaded", "1");
break;
case contentMode.async:
var currentStepContent = getStepPanel(wizard, currentIndex)._aria("busy", "true")
.empty().append(renderTemplate(options.loadingTemplate, { text: options.labels.loading }));
$.ajax({ url: currentStep.contentUrl, cache: false }).done(function (data)
{
currentStepContent.empty().html(data)._aria("busy", "false").data("loaded", "1");
wizard.triggerHandler("contentLoaded", [currentIndex]);
});
break;
}
}
} }
/**
@return {Boolean} Indicates whether the event fired successfully or not **/ function paginationClick(wizard, options, state, index) { var oldIndex = state.currentIndex;
if (index >= 0 && index < state.stepCount && !(options.forceMoveForward && index < state.currentIndex)) { var anchor = getStepAnchor(wizard, index), parent = anchor.parent(), isDisabled = parent.hasClass("disabled");
// Enable the step to make the anchor clickable!
parent._enableAria();
anchor.click();
// An error occured
if (oldIndex === state.currentIndex && isDisabled)
{
// Disable the step again if current index has not changed; prevents click action.
parent._enableAria(false);
return false;
}
options.onNext(wizard, state, oldIndex, state.currentIndex);
return true;
}
return false; }
/**
@param event {Object} An event object */ function paginationClickHandler(event) { event.preventDefault();
var anchor = $(this), wizard = anchor.parent().parent().parent().parent(), options = getOptions(wizard), state = getState(wizard), href = anchor.attr("href");
switch (href.substring(href.lastIndexOf("#") + 1)) { case "cancel": cancel(wizard); break;
case "finish":
finishStep(wizard, state);
break;
case "next":
goToNextStep(wizard, options, state);
break;
case "previous":
goToPreviousStep(wizard, options, state);
break;
} }
/**
@param state {Object} The state container of the current wizard */ function refreshPagination(wizard, options, state) { if (options.enablePagination) { var finish = wizard.find(".actions a[href$='#finish']").parent(), next = wizard.find(".actions a[href$='#next']").parent();
if (!options.forceMoveForward)
{
var previous = wizard.find(".actions a[href$='#previous']").parent();
previous._enableAria(state.currentIndex > 0);
}
if (options.enableFinishButton && options.showFinishButtonAlways)
{
finish._enableAria(state.stepCount > 0);
next._enableAria(state.stepCount > 1 && state.stepCount > (state.currentIndex + 1));
}
else
{
finish._showAria(options.enableFinishButton && state.stepCount === (state.currentIndex + 1));
next._showAria(state.stepCount === 0 || state.stepCount > (state.currentIndex + 1)).
_enableAria(state.stepCount > (state.currentIndex + 1) || !options.enableFinishButton);
}
} }
/**
@param [oldIndex] {Integer} The index of the prior step */ function refreshStepNavigation(wizard, options, state, oldIndex) { var currentOrNewStepAnchor = getStepAnchor(wizard, state.currentIndex), currentInfo = $("<span class=\"current-info audible\">" + options.labels.current + " "), stepTitles = wizard.find(".content > .title");
if (oldIndex != null) { var oldStepAnchor = getStepAnchor(wizard, oldIndex); oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false); stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current"); currentInfo = oldStepAnchor.find(".current-info"); currentOrNewStepAnchor.focus(); }
currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria(); stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current"); }
/**
@param index {Integer} The start point for refreshing ids */ function refreshSteps(wizard, options, state, index) { var uniqueId = getUniqueId(wizard);
for (var i = index; i < state.stepCount; i++) { var uniqueStepId = uniqueId + _tabSuffix + i, uniqueBodyId = uniqueId + _tabpanelSuffix + i, uniqueHeaderId = uniqueId + _titleSuffix + i, title = wizard.find(".title").eq(i)._id(uniqueHeaderId);
wizard.find(".steps a").eq(i)._id(uniqueStepId)
._aria("controls", uniqueBodyId).attr("href", "#" + uniqueHeaderId)
.html(renderTemplate(options.titleTemplate, { index: i + 1, title: title.html() }));
wizard.find(".body").eq(i)._id(uniqueBodyId)
._aria("labelledby", uniqueHeaderId);
} }
function registerEvents(wizard, options) { var eventNamespace = getEventNamespace(wizard);
wizard.bind("canceled" + eventNamespace, options.onCanceled);
wizard.bind("contentLoaded" + eventNamespace, options.onContentLoaded);
wizard.bind("finishing" + eventNamespace, options.onFinishing);
wizard.bind("finished" + eventNamespace, options.onFinished);
wizard.bind("init" + eventNamespace, options.onInit);
wizard.bind("stepChanging" + eventNamespace, options.onStepChanging);
wizard.bind("stepChanged" + eventNamespace, options.onStepChanged);
if (options.enableKeyNavigation)
{
wizard.bind("keyup" + eventNamespace, keyUpHandler);
}
wizard.find(".actions a").bind("click" + eventNamespace, paginationClickHandler);
}
/**
@return Indecates whether the item is removed. **/ function removeStep(wizard, options, state, index) { // Index out of range and try deleting current item will return false. if (index < 0 || index >= state.stepCount || state.currentIndex === index) { return false; }
// Change data removeStepFromCache(wizard, index); if (state.currentIndex > index) { state.currentIndex--; saveCurrentStateToCookie(wizard, options, state); } state.stepCount--;
getStepTitle(wizard, index).remove(); getStepPanel(wizard, index).remove(); getStepAnchor(wizard, index).parent().remove();
// Set the "first" class to the new first step button if (index === 0) { wizard.find(".steps li").first().addClass("first"); }
// Set the "last" class to the new last step button if (index === state.stepCount) { wizard.find(".steps li").eq(index).addClass("last"); }
refreshSteps(wizard, options, state, index); refreshPagination(wizard, options, state);
return true; }
function removeStepFromCache(wizard, index) { getSteps(wizard).splice(index, 1); }
/**
@param state {Object} The state container of the current wizard **/ function render(wizard, options, state) { // Create a content wrapper and copy HTML from the intial wizard structure var wrapperTemplate = "<{0} class=\"{1}\">{2}</{0}>", orientation = getValidEnumValue(stepsOrientation, options.stepsOrientation), verticalCssClass = (orientation === stepsOrientation.vertical) ? " vertical" : "", contentWrapper = $(wrapperTemplate.format(options.contentContainerTag, "content " + options.clearFixCssClass, wizard.html())), stepsWrapper = $(wrapperTemplate.format(options.stepsContainerTag, "steps " + options.clearFixCssClass, "<ul role=\"tablist\">
// Transform the wizard wrapper and remove the inner HTML var progressWrapper = $("<div class=\"progress\"><div class=\"progress-bar progress-bar-success\" role=\"progressbar\" aria-valuenow=\"1\" aria-valuemin=\"1\" aria-valuemax=\"5\" style=\"width: 20%;\">Step 1 of 5
// Add WIA-ARIA support stepContents.each(function (index) { renderBody(wizard, state, $(this), index); });
stepTitles.each(function (index) { renderTitle(wizard, options, state, $(this), index); });
refreshStepNavigation(wizard, options, state); renderPagination(wizard, options, state); }
/**
@param index {Integer} The position of the body */ function renderBody(wizard, state, body, index) { var uniqueId = getUniqueId(wizard), uniqueBodyId = uniqueId + _tabpanelSuffix + index, uniqueHeaderId = uniqueId + _titleSuffix + index;
body._id(uniqueBodyId).attr("role", "tabpanel")._aria("labelledby", uniqueHeaderId) .addClass("body")._showAria(state.currentIndex === index); }
/**
@param state {Object} The state container of the current wizard */ function renderPagination(wizard, options, state) { if (options.enablePagination) { var pagination = "<{0} class=\"actions {1}\"><ul role=\"menu\" aria-label=\"{2}\">{3}
if (!options.forceMoveForward)
{
buttons += buttonTemplate.format("previous", options.labels.previous);
}
buttons += buttonTemplate.format("next", options.labels.next);
if (options.enableFinishButton)
{
buttons += buttonTemplate.format("finish", options.labels.finish);
}
if (options.enableCancelButton)
{
buttons += buttonTemplate.format("cancel", options.labels.cancel);
}
wizard.append(pagination.format(options.actionContainerTag, options.clearFixCssClass,
options.labels.pagination, buttons));
refreshPagination(wizard, options, state);
loadAsyncContent(wizard, options, state);
} }
/**
@return {String} The rendered template / function renderTemplate(template, substitutes) { var matches = template.match(/#([a-z])#/gi);
for (var i = 0; i < matches.length; i++) { var match = matches[i], key = match.substring(1, match.length - 1);
if (substitutes[key] === undefined)
{
throwError("The key '{0}' does not exist in the substitute collection!", key);
}
template = template.replace(match, substitutes[key]);
}
return template; }
/**
@param index {Integer} The position of the header */ function renderTitle(wizard, options, state, header, index) { var uniqueId = getUniqueId(wizard), uniqueStepId = uniqueId + _tabSuffix + index, uniqueBodyId = uniqueId + _tabpanelSuffix + index, uniqueHeaderId = uniqueId + _titleSuffix + index, stepCollection = wizard.find(".steps > ul"), title = renderTemplate(options.titleTemplate, { index: index + 1, title: header.html() }), stepItem = $("<li role=\"tab\"><a id=\"" + uniqueStepId + "\" href=\"#" + uniqueHeaderId + "\" aria-controls=\"" + uniqueBodyId + "\" style=\"padding:0.5em 0.5em\">" + title + "
stepItem._enableAria(options.enableAllSteps || state.currentIndex > index); var width = (100/state.stepCount)+'%'; stepItem.css("width",width); if (state.currentIndex > index) { stepItem.addClass("done"); }
header._id(uniqueHeaderId).attr("tabindex", "-1").addClass("title");
if (index === 0) { stepCollection.prepend(stepItem); } else { stepCollection.find("li").eq(index - 1).after(stepItem); }
// Set the "first" class to the new first step button if (index === 0) { stepCollection.find("li").removeClass("first").eq(index).addClass("first"); }
// Set the "last" class to the new last step button if (index === (state.stepCount - 1)) { stepCollection.find("li").removeClass("last").eq(index).addClass("last"); }
// Register click event stepItem.children("a").bind("click" + getEventNamespace(wizard), stepClickHandler); }
/**
function startTransitionEffect(wizard, options, state, index, oldIndex, doneCallback) { var stepContents = wizard.find(".content > .body"), effect = getValidEnumValue(transitionEffect, options.transitionEffect), effectSpeed = options.transitionEffectSpeed, newStep = stepContents.eq(index), currentStep = stepContents.eq(oldIndex);
switch (effect)
{
case transitionEffect.fade:
case transitionEffect.slide:
var hide = (effect === transitionEffect.fade) ? "fadeOut" : "slideUp",
show = (effect === transitionEffect.fade) ? "fadeIn" : "slideDown";
state.transitionElement = newStep;
currentStep[hide](effectSpeed, function ()
{
var wizard = $(this)._showAria(false).parent().parent(),
state = getState(wizard);
if (state.transitionElement)
{
state.transitionElement[show](effectSpeed, function ()
{
$(this)._showAria();
}).promise().done(doneCallback);
state.transitionElement = null;
}
});
break;
case transitionEffect.slideLeft:
var outerWidth = currentStep.outerWidth(true),
posFadeOut = (index > oldIndex) ? -(outerWidth) : outerWidth,
posFadeIn = (index > oldIndex) ? outerWidth : -(outerWidth);
$.when(currentStep.animate({ left: posFadeOut }, effectSpeed,
function () { $(this)._showAria(false); }),
newStep.css("left", posFadeIn + "px")._showAria()
.animate({ left: 0 }, effectSpeed)).done(doneCallback);
break;
default:
$.when(currentStep._showAria(false), newStep._showAria())
.done(doneCallback);
break;
}
}
/**
@param event {Object} An event object */ function stepClickHandler(event) { event.preventDefault();
var anchor = $(this), wizard = anchor.parent().parent().parent().parent(), options = getOptions(wizard), state = getState(wizard), oldIndex = state.currentIndex;
if (anchor.parent().is(":not(.disabled):not(.current)")) { var href = anchor.attr("href"), position = parseInt(href.substring(href.lastIndexOf("-") + 1), 0);
goToStep(wizard, options, state, position);
}
// If nothing has changed if (oldIndex === state.currentIndex) { getStepAnchor(wizard, oldIndex).focus(); return false; } }
function throwError(message) { if (arguments.length > 1) { message = message.format(Array.prototype.slice.call(arguments, 1)); }
throw new Error(message);
}
/**
/**
String
or an JSON object for initialization/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
@for steps / var contentMode = $.fn.steps.contentMode = { /
/**
/**
/**
@for steps / var stepsOrientation = $.fn.steps.stepsOrientation = { /
/**
/**
@for steps / var transitionEffect = $.fn.steps.transitionEffect = { /
/**
/**
/**
var stepModel = $.fn.steps.stepModel = { title: "", content: "", contentUrl: "", contentMode: contentMode.html, contentLoaded: false };
/**
$("#wizard").steps({ headerTag: "h3" }); / var defaults = $.fn.steps.defaults = { /
/**
/**
/**
/**
/**
/**
/**
/*
/**
/**
/*
/**
true
. /**
true
(all steps are clickable)./**
true
(arrow left and arrow right)./**
true
./**
/**
/**
/**
/**
/**
true
. /**
/**
/**
/*
/**
/**
/*
/**
false
. /**
/**
/**
false
. /**
/**
/**
/**
@for defaults / labels: { /
/**
/**
/**
/**
/**
/**
/ Common /
.wizard, .tabcontrol { display: block; width: 100%; overflow: hidden; }
.wizard a, .tabcontrol a { outline: 0; }
.wizard ul, .tabcontrol ul { list-style: none !important; padding: 0; margin: 0; }
.wizard ul > li, .tabcontrol ul > li { display: block; padding: 0; }
/ Accessibility / .wizard > .steps .current-info, .tabcontrol > .steps .current-info { position: absolute; left: -999em; }
.wizard > .content > .title, .tabcontrol > .content > .title { position: absolute; left: -999em; }
/ Wizard /
.wizard > .steps { position: relative; display: block; width: 100%; }
.wizard.vertical > .steps { display: inline; float: left; width: 30%; }
.wizard > .steps .number { font-size: 1.429em; }
.wizard > .steps > ul > li { width: 33.33%; }
.wizard > .steps > ul > li, .wizard > .actions > ul > li { float: left; }
.wizard.vertical > .steps > ul > li { float: none; width: 100%; }
.wizard > .steps a, .wizard > .steps a:hover, .wizard > .steps a:active { display: block; width: auto; margin: 0 0.5em 0.5em; padding: 1em 1em; text-decoration: none;
}
.wizard > .steps .disabled a, .wizard > .steps .disabled a:hover, .wizard > .steps .disabled a:active { background: #eee; color: #aaa; cursor: default; }
.wizard > .steps .current a, .wizard > .steps .current a:hover, .wizard > .steps .current a:active { background: #2184be; color: #fff; cursor: default; }
.wizard > .steps .done a, .wizard > .steps .done a:hover, .wizard > .steps .done a:active { background: #9dc8e2; color: #fff; }
.wizard > .steps .error a, .wizard > .steps .error a:hover, .wizard > .steps .error a:active { background: #ff3111; color: #fff; }
.wizard > .content { background: #eee; display: block; margin: 0.5em; min-height: 8em; overflow: hidden; position: relative; width: auto;
}
.wizard.vertical > .content { display: inline; float: left; margin: 0 2.5% 0.5em 2.5%; width: 65%; }
.wizard > .content > .body { float: left; position: absolute; width: 95%; height: 95%; padding: 2.5%; }
.wizard > .content > .body ul { list-style: disc !important; }
.wizard > .content > .body ul > li { display: list-item; }
.wizard > .content > .body > iframe { border: 0 none; width: 100%; height: 100%; }
.wizard > .content > .body input { display: block; border: 1px solid #ccc; }
.wizard > .content > .body input[type="checkbox"] { display: inline-block; }
.wizard > .content > .body input.error { background: rgb(251, 227, 228); border: 1px solid #fbc2c4; color: #8a1f11; }
.wizard > .content > .body label { display: inline-block; margin-bottom: 0.5em; }
.wizard > .content > .body label.error { color: #8a1f11; display: inline-block; margin-left: 1.5em; }
.wizard > .actions { position: relative; display: block; text-align: right; width: 100%; }
.wizard.vertical > .actions { display: inline; float: right; margin: 0 2.5%; width: 95%; }
.wizard > .actions > ul { display: inline-block; text-align: right; }
.wizard > .actions > ul > li { margin: 0 0.5em; }
.wizard.vertical > .actions > ul > li { margin: 0 0 0 1em; }
.wizard > .actions a, .wizard > .actions a:hover, .wizard > .actions a:active { background: #2184be; color: #fff; display: block; padding: 0.5em 1em; text-decoration: none;
}
.wizard > .actions .disabled a, .wizard > .actions .disabled a:hover, .wizard > .actions .disabled a:active { background: #eee; color: #aaa; }
.wizard > .loading { }
.wizard > .loading .spinner { }
/ Tabcontrol /
.tabcontrol > .steps { position: relative; display: block; width: 100%; }
.tabcontrol > .steps > ul { position: relative; margin: 6px 0 0 0; top: 1px; z-index: 1; }
.tabcontrol > .steps > ul > li { float: left; margin: 5px 2px 0 0; padding: 1px;
}
.tabcontrol > .steps > ul > li:hover { background: #edecec; border: 1px solid #bbb; padding: 0; }
.tabcontrol > .steps > ul > li.current { background: #fff; border: 1px solid #bbb; border-bottom: 0 none; padding: 0 0 1px 0; margin-top: 0; }
.tabcontrol > .steps > ul > li > a { color: #5f5f5f; display: inline-block; border: 0 none; margin: 0; padding: 10px 30px; text-decoration: none; }
.tabcontrol > .steps > ul > li > a:hover { text-decoration: none; }
.tabcontrol > .steps > ul > li.current > a { padding: 15px 30px 10px 30px; }
.tabcontrol > .content { position: relative; display: inline-block; width: 100%; height: 35em; overflow: hidden; border-top: 1px solid #bbb; padding-top: 20px; }
.tabcontrol > .content > .body { float: left; position: absolute; width: 95%; height: 95%; padding: 2.5%; }
.tabcontrol > .content > .body ul { list-style: disc !important; }
.tabcontrol > .content > .body ul > li { display: list-item; } .progress{ height: 20px; margin: 0.5em 0.5em; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); box-shadow: inset 0 1px 2px rgba(0,0,0,.1); } .progress-bar-success { background-color: #5cb85c; } .progress-bar { float: left; width: 0%; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15); box-shadow: inset 0 -1px 0 rgba(0,0,0,.15); -webkit-transition: width .6s ease; -o-transition: width .6s ease; transition: width .6s ease; }