123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- /*
- * SmartWizard 3.3.1 plugin
- * jQuery Wizard control Plugin
- * by Dipu
- *
- * Refactored and extended:
- * https://github.com/mstratman/jQuery-Smart-Wizard
- *
- * Original URLs:
- * http://www.techlaboratory.net
- * http://tech-laboratory.blogspot.com
- */
- function SmartWizard(target, options) {
- this.target = target;
- this.options = options;
- this.curStepIdx = options.selected;
- this.steps = $(target).children("ul").children("li").children("a"); // Get all anchors
- this.contentWidth = 0;
- this.msgBox = $('<div class="msgBox"><div class="content"></div><a href="#" class="close">X</a></div>');
- this.elmStepContainer = $('<div></div>').addClass("stepContainer");
- this.loader = $('<div>Loading</div>').addClass("loader");
- this.buttons = {
- next : $('<a>'+options.labelNext+'</a>').attr("href","#").addClass("buttonNext"),
- previous : $('<a>'+options.labelPrevious+'</a>').attr("href","#").addClass("buttonPrevious"),
- finish : $('<a>'+options.labelFinish+'</a>').attr("href","#").addClass("buttonFinish")
- };
- /*
- * Private functions
- */
- var _init = function($this) {
- var elmActionBar = $('<div></div>').addClass("actionBar");
- elmActionBar.append($this.msgBox);
- $('.close',$this.msgBox).click(function() {
- $this.msgBox.fadeOut("normal");
- return false;
- });
- var allDivs = $this.target.children('div');
- $this.target.children('ul').addClass("anchor");
- allDivs.addClass("content");
- // highlight steps with errors
- if($this.options.errorSteps && $this.options.errorSteps.length>0){
- $.each($this.options.errorSteps, function(i, n){
- $this.setError({ stepnum: n, iserror:true });
- });
- }
- $this.elmStepContainer.append(allDivs);
- elmActionBar.append($this.loader);
- $this.target.append($this.elmStepContainer);
- elmActionBar.append($this.buttons.finish)
- .append($this.buttons.next)
- .append($this.buttons.previous);
- $this.target.append(elmActionBar);
- this.contentWidth = $this.elmStepContainer.width();
- $($this.buttons.next).click(function() {
- $this.goForward();
- return false;
- });
- $($this.buttons.previous).click(function() {
- $this.goBackward();
- return false;
- });
- $($this.buttons.finish).click(function() {
- if(!$(this).hasClass('buttonDisabled')){
- if($.isFunction($this.options.onFinish)) {
- var context = { fromStep: $this.curStepIdx + 1 };
- if(!$this.options.onFinish.call(this,$($this.steps), context)){
- return false;
- }
- }else{
- var frm = $this.target.parents('form');
- if(frm && frm.length){
- frm.submit();
- }
- }
- }
- return false;
- });
- $($this.steps).bind("click", function(e){
- if($this.steps.index(this) == $this.curStepIdx){
- return false;
- }
- var nextStepIdx = $this.steps.index(this);
- var isDone = $this.steps.eq(nextStepIdx).attr("isDone") - 0;
- if(isDone == 1){
- _loadContent($this, nextStepIdx);
- }
- return false;
- });
- // Enable keyboard navigation
- if($this.options.keyNavigation){
- $(document).keyup(function(e){
- if(e.which==39){ // Right Arrow
- $this.goForward();
- }else if(e.which==37){ // Left Arrow
- $this.goBackward();
- }
- });
- }
- // Prepare the steps
- _prepareSteps($this);
- // Show the first slected step
- _loadContent($this, $this.curStepIdx);
- };
- var _prepareSteps = function($this) {
- if(! $this.options.enableAllSteps){
- $($this.steps, $this.target).removeClass("selected").removeClass("done").addClass("disabled");
- $($this.steps, $this.target).attr("isDone",0);
- }else{
- $($this.steps, $this.target).removeClass("selected").removeClass("disabled").addClass("done");
- $($this.steps, $this.target).attr("isDone",1);
- }
- $($this.steps, $this.target).each(function(i){
- $($(this).attr("href").replace(/^.+#/, '#'), $this.target).hide();
- $(this).attr("rel",i+1);
- });
- };
- var _step = function ($this, selStep) {
- return $(
- $(selStep, $this.target).attr("href").replace(/^.+#/, '#'),
- $this.target
- );
- };
- var _loadContent = function($this, stepIdx) {
- var selStep = $this.steps.eq(stepIdx);
- var ajaxurl = $this.options.contentURL;
- var ajaxurl_data = $this.options.contentURLData;
- var hasContent = selStep.data('hasContent');
- var stepNum = stepIdx+1;
- if (ajaxurl && ajaxurl.length>0) {
- if ($this.options.contentCache && hasContent) {
- _showStep($this, stepIdx);
- } else {
- var ajax_args = {
- url: ajaxurl,
- type: "POST",
- data: ({step_number : stepNum}),
- dataType: "text",
- beforeSend: function(){
- $this.loader.show();
- },
- error: function(){
- $this.loader.hide();
- },
- success: function(res){
- $this.loader.hide();
- if(res && res.length>0){
- selStep.data('hasContent',true);
- _step($this, selStep).html(res);
- _showStep($this, stepIdx);
- }
- }
- };
- if (ajaxurl_data) {
- ajax_args = $.extend(ajax_args, ajaxurl_data(stepNum));
- }
- $.ajax(ajax_args);
- }
- }else{
- _showStep($this,stepIdx);
- }
- };
- var _showStep = function($this, stepIdx) {
- var selStep = $this.steps.eq(stepIdx);
- var curStep = $this.steps.eq($this.curStepIdx);
- if(stepIdx != $this.curStepIdx){
- if($.isFunction($this.options.onLeaveStep)) {
- var context = { fromStep: $this.curStepIdx+1, toStep: stepIdx+1 };
- if (! $this.options.onLeaveStep.call($this,$(curStep), context)){
- return false;
- }
- }
- }
- $this.elmStepContainer.height(_step($this, selStep).outerHeight());
- var prevCurStepIdx = $this.curStepIdx;
- $this.curStepIdx = stepIdx;
- if ($this.options.transitionEffect == 'slide'){
- _step($this, curStep).slideUp("fast",function(e){
- _step($this, selStep).slideDown("fast");
- _setupStep($this,curStep,selStep);
- });
- } else if ($this.options.transitionEffect == 'fade'){
- _step($this, curStep).fadeOut("fast",function(e){
- _step($this, selStep).fadeIn("fast");
- _setupStep($this,curStep,selStep);
- });
- } else if ($this.options.transitionEffect == 'slideleft'){
- var nextElmLeft = 0;
- var nextElmLeft1 = null;
- var nextElmLeft = null;
- var curElementLeft = 0;
- if(stepIdx > prevCurStepIdx){
- nextElmLeft1 = $this.contentWidth + 10;
- nextElmLeft2 = 0;
- curElementLeft = 0 - _step($this, curStep).outerWidth();
- } else {
- nextElmLeft1 = 0 - _step($this, selStep).outerWidth() + 20;
- nextElmLeft2 = 0;
- curElementLeft = 10 + _step($this, curStep).outerWidth();
- }
- if (stepIdx == prevCurStepIdx) {
- nextElmLeft1 = $($(selStep, $this.target).attr("href"), $this.target).outerWidth() + 20;
- nextElmLeft2 = 0;
- curElementLeft = 0 - $($(curStep, $this.target).attr("href"), $this.target).outerWidth();
- } else {
- $($(curStep, $this.target).attr("href"), $this.target).animate({left:curElementLeft},"fast",function(e){
- $($(curStep, $this.target).attr("href"), $this.target).hide();
- });
- }
- _step($this, selStep).css("left",nextElmLeft1).show().animate({left:nextElmLeft2},"fast",function(e){
- _setupStep($this,curStep,selStep);
- });
- } else {
- _step($this, curStep).hide();
- _step($this, selStep).show();
- _setupStep($this,curStep,selStep);
- }
- return true;
- };
- var _setupStep = function($this, curStep, selStep) {
- $(curStep, $this.target).removeClass("selected");
- $(curStep, $this.target).addClass("done");
- $(selStep, $this.target).removeClass("disabled");
- $(selStep, $this.target).removeClass("done");
- $(selStep, $this.target).addClass("selected");
- $(selStep, $this.target).attr("isDone",1);
- _adjustButton($this);
- if($.isFunction($this.options.onShowStep)) {
- var context = { fromStep: parseInt($(curStep).attr('rel')), toStep: parseInt($(selStep).attr('rel')) };
- if(! $this.options.onShowStep.call(this,$(selStep),context)){
- return false;
- }
- }
- if ($this.options.noForwardJumping) {
- // +2 == +1 (for index to step num) +1 (for next step)
- for (var i = $this.curStepIdx + 2; i <= $this.steps.length; i++) {
- $this.disableStep(i);
- }
- }
- };
- var _adjustButton = function($this) {
- if (! $this.options.cycleSteps){
- if (0 >= $this.curStepIdx) {
- $($this.buttons.previous).addClass("buttonDisabled");
- if ($this.options.hideButtonsOnDisabled) {
- $($this.buttons.previous).hide();
- }
- }else{
- $($this.buttons.previous).removeClass("buttonDisabled");
- if ($this.options.hideButtonsOnDisabled) {
- $($this.buttons.previous).show();
- }
- }
- if (($this.steps.length-1) <= $this.curStepIdx){
- $($this.buttons.next).addClass("buttonDisabled");
- if ($this.options.hideButtonsOnDisabled) {
- $($this.buttons.next).hide();
- }
- }else{
- $($this.buttons.next).removeClass("buttonDisabled");
- if ($this.options.hideButtonsOnDisabled) {
- $($this.buttons.next).show();
- }
- }
- }
- // Finish Button
- if (! $this.steps.hasClass('disabled') || $this.options.enableFinishButton){
- $($this.buttons.finish).removeClass("buttonDisabled");
- if ($this.options.hideButtonsOnDisabled) {
- $($this.buttons.finish).show();
- }
- }else{
- $($this.buttons.finish).addClass("buttonDisabled");
- if ($this.options.hideButtonsOnDisabled) {
- $($this.buttons.finish).hide();
- }
- }
- };
- /*
- * Public methods
- */
- SmartWizard.prototype.goForward = function(){
- var nextStepIdx = this.curStepIdx + 1;
- if (this.steps.length <= nextStepIdx){
- if (! this.options.cycleSteps){
- return false;
- }
- nextStepIdx = 0;
- }
- _loadContent(this, nextStepIdx);
- };
- SmartWizard.prototype.goBackward = function(){
- var nextStepIdx = this.curStepIdx-1;
- if (0 > nextStepIdx){
- if (! this.options.cycleSteps){
- return false;
- }
- nextStepIdx = this.steps.length - 1;
- }
- _loadContent(this, nextStepIdx);
- };
- SmartWizard.prototype.goToStep = function(stepNum){
- var stepIdx = stepNum - 1;
- if (stepIdx >= 0 && stepIdx < this.steps.length) {
- _loadContent(this, stepIdx);
- }
- };
- SmartWizard.prototype.enableStep = function(stepNum) {
- var stepIdx = stepNum - 1;
- if (stepIdx == this.curStepIdx || stepIdx < 0 || stepIdx >= this.steps.length) {
- return false;
- }
- var step = this.steps.eq(stepIdx);
- $(step, this.target).attr("isDone",1);
- $(step, this.target).removeClass("disabled").removeClass("selected").addClass("done");
- }
- SmartWizard.prototype.disableStep = function(stepNum) {
- var stepIdx = stepNum - 1;
- if (stepIdx == this.curStepIdx || stepIdx < 0 || stepIdx >= this.steps.length) {
- return false;
- }
- var step = this.steps.eq(stepIdx);
- $(step, this.target).attr("isDone",0);
- $(step, this.target).removeClass("done").removeClass("selected").addClass("disabled");
- }
- SmartWizard.prototype.currentStep = function() {
- return this.curStepIdx + 1;
- }
- SmartWizard.prototype.showMessage = function (msg) {
- $('.content', this.msgBox).html(msg);
- this.msgBox.show();
- }
- SmartWizard.prototype.hideMessage = function () {
- this.msgBox.fadeOut("normal");
- }
- SmartWizard.prototype.showError = function(stepnum) {
- this.setError(stepnum, true);
- }
- SmartWizard.prototype.hideError = function(stepnum) {
- this.setError(stepnum, false);
- }
- SmartWizard.prototype.setError = function(stepnum,iserror) {
- if (typeof stepnum == "object") {
- iserror = stepnum.iserror;
- stepnum = stepnum.stepnum;
- }
- if (iserror){
- $(this.steps.eq(stepnum-1), this.target).addClass('error')
- }else{
- $(this.steps.eq(stepnum-1), this.target).removeClass("error");
- }
- }
- SmartWizard.prototype.fixHeight = function(){
- var height = 0;
- var selStep = this.steps.eq(this.curStepIdx);
- var stepContainer = _step(this, selStep);
- stepContainer.children().each(function() {
- height += $(this).outerHeight();
- });
- // These values (5 and 20) are experimentally chosen.
- stepContainer.height(height + 5);
- this.elmStepContainer.height(height + 20);
- }
- _init(this);
- };
- (function($){
- $.fn.smartWizard = function(method) {
- var args = arguments;
- var rv = undefined;
- var allObjs = this.each(function() {
- var wiz = $(this).data('smartWizard');
- if (typeof method == 'object' || ! method || ! wiz) {
- var options = $.extend({}, $.fn.smartWizard.defaults, method || {});
- if (! wiz) {
- wiz = new SmartWizard($(this), options);
- $(this).data('smartWizard', wiz);
- }
- } else {
- if (typeof SmartWizard.prototype[method] == "function") {
- rv = SmartWizard.prototype[method].apply(wiz, Array.prototype.slice.call(args, 1));
- return rv;
- } else {
- $.error('Method ' + method + ' does not exist on jQuery.smartWizard');
- }
- }
- });
- if (rv === undefined) {
- return allObjs;
- } else {
- return rv;
- }
- };
- // Default Properties and Events
- $.fn.smartWizard.defaults = {
- selected: 0, // Selected Step, 0 = first step
- keyNavigation: true, // Enable/Disable key navigation(left and right keys are used if enabled)
- enableAllSteps: false,
- transitionEffect: 'fade', // Effect on navigation, none/fade/slide/slideleft
- contentURL:null, // content url, Enables Ajax content loading
- contentCache:true, // cache step contents, if false content is fetched always from ajax url
- cycleSteps: false, // cycle step navigation
- enableFinishButton: false, // make finish button enabled always
- hideButtonsOnDisabled: false, // when the previous/next/finish buttons are disabled, hide them instead?
- errorSteps:[], // Array Steps with errors
- labelNext:'Next',
- labelPrevious:'Previous',
- labelFinish:'Finish',
- noForwardJumping: false,
- onLeaveStep: null, // triggers when leaving a step
- onShowStep: null, // triggers when showing a step
- onFinish: null // triggers when Finish button is clicked
- };
- })(jQuery);
|