1(function ($) { 2 3 $.fn.orbit_slides = function(){ 4 5 return this.each(function() { 6 7 var $el = jQuery( this ); 8 9 // GET THE TOTAL NUMBER OF SLIDES 10 function totalSlides(){ return parseInt( $el.find('.orbit-slide').length ); } 11 12 // GET CURRENT SLIDE IN THE LIST OF SLIDES THAT IS ACTIVE 13 function getCurrentSlide(){ return $el.find('.orbit-slide.active'); } 14 15 // GET CURRENT SLIDE VALUE 16 function getCurrentSlideValue(){ var $currentSlide = getCurrentSlide(); return $currentSlide.data('slide') + 1; } 17 18 // FIND THE NEXT SLIDE TO THE ONE THAT IS CURRENTLY ACTIVE 19 function getNextSlide(){ 20 var $currentSlide = getCurrentSlide(), 21 currentSlideNumber = parseInt( $currentSlide.data('slide') ), 22 nextSlideNumber = currentSlideNumber + 1; 23 24 if( nextSlideNumber >= totalSlides() ){ nextSlideNumber = 0; } 25 return $el.find( '[data-slide~=' + nextSlideNumber + ']' ); 26 } 27 28 // FIND THE PREVIOUS SLIDE TO THE ONE THAT IS CURRENTLY ACTIVE 29 function getPreviousSlide(){ 30 var $currentSlide = getCurrentSlide(), 31 currentSlideNumber = parseInt( $currentSlide.data('slide') ), 32 prevSlideNumber = currentSlideNumber - 1; 33 34 if( prevSlideNumber < 0 ){ prevSlideNumber = totalSlides() - 1; } 35 return $el.find( '[data-slide~=' + prevSlideNumber + ']' ); 36 } 37 38 function createProgressBar(){ 39 var $progress = $el.find('.orbit-form-progress'); 40 41 // START CREATING ELEMENTS WITHIN THE PROGRESS ELEMENT 42 var $progressText = jQuery( document.createElement( 'h5' ) ); 43 $progressText.appendTo( $progress ); 44 45 var $progressBar = jQuery( document.createElement( 'div' ) ); 46 $progressBar.addClass( 'orbit-progress-bar' ); 47 $progressBar.appendTo( $progress ); 48 49 var $bar = jQuery( document.createElement( 'div' ) ); 50 $bar.addClass( 'bar' ); 51 $bar.appendTo( $progressBar ); 52 } 53 54 /* 55 * SHOW THE OVERALL PROGRESS 56 * UPDATES WHENEVER THE NAVIGATION BUTTONS OF THE FORM ARE CLICKED 57 */ 58 function updateProgress(){ 59 var $progress = $el.find('.orbit-form-progress'), 60 $progressText = $progress.find( "h5" ), 61 $bar = $progress.find( ".bar" ); 62 totalSlidesNum = totalSlides(), 63 currentSlideNum = getCurrentSlideValue(), 64 progress = currentSlideNum * 100 / totalSlidesNum; 65 66 // UPDATE PROGRESS TEXT 67 $progressText.html( "Step " + currentSlideNum + " of " + totalSlidesNum ); 68 69 // UPDATE PROGRESS BAR - ANIMATION 70 $bar.css({ width: progress + "%" }); 71 } 72 73 74 75 /* 76 * TRANSITION OF SLIDE FROM CURRENT TO NEXT 77 * SCROLL THE BODY TO THE TOP OF THE SLIDE 78 */ 79 function slideTransition( $currentSlide, $nextSlide ){ 80 81 $currentSlide.removeClass('active'); 82 $nextSlide.addClass('active'); 83 84 $([document.documentElement, document.body]).animate({ 85 scrollTop: $el.offset().top - 100 86 }, 1000); 87 88 $nextSlide.trigger('orbit:afterTransition'); 89 90 updateProgress(); 91 92 } 93 94 /* 95 * EVENT TRIGGERED WHEN THE NEXT NAVIGATION BUTTON IS CLICKED 96 */ 97 $el.find('[data-behaviour~=orbit-slide-next]').click( function( ev ){ 98 99 ev.preventDefault(); 100 101 var $slide = getCurrentSlide(), 102 $nextSlide = getNextSlide(); 103 104 $slide.trigger('orbit:beforeNextTransition'); 105 106 // BEFORE GOING TO THE NEXT SLIDE CHECK IF THE NEXT SLIDE CAN BE ACCESSIBLE 107 // EVENTS SUCH AS VALIDATION CAN BE HANDLED IN THIS PERIOD 108 if( $slide.data( 'slide-disable' ) != '1' ){ slideTransition( $slide, $nextSlide ); } 109 110 }); 111 112 /* 113 * EVENT TRIGGERED WHEN THE PREVIOUS NAVIGATION BUTTON IS CLICKED 114 */ 115 $el.find('[data-behaviour~=orbit-slide-prev]').click( function( ev ){ 116 117 ev.preventDefault(); 118 119 var $slide = getCurrentSlide(), 120 $prevSlide = getPreviousSlide(); 121 122 slideTransition( $slide, $prevSlide ); 123 124 }); 125 126 // SHOW ERROR MESSAGE 127 function errorMessage( message ){ 128 $el.find('.orbit-form-alert').html( message ); 129 $el.find('.orbit-form-alert').show(); 130 } 131 132 // VALIDATE PARTIAL FORM WITHIN THE ACTIVE SLIDE 133 function validatePartialForm( $slide ){ 134 135 var flag = true, 136 errorText = "Required fields should be filled.", 137 fields = $slide.find(".orbit-field-required:not(.hide) input, .orbit-field-required:not(.hide) select, .orbit-field-required:not(.hide) textarea").serializeArray(); 138 139 // SINGULAR FIELDS 140 $.each( fields, function( i, field ){ 141 if( !field.value || field.value == "0" ){ 142 errorMessage( errorText ); 143 flag = false;
144 } 145 }); 146 147 // SEPERATE CASE FOR CHECKBOXES 148 $slide.find( '.orbit-field-required input[type=checkbox]' ).each( function( i, el ){ 149 var $el = jQuery( el ), 150 $parent = $el.closest('.orbit-field-required'), 151 num_checked = $parent.find('input[type="checkbox"]:checked').length; 152 153 if( num_checked <= 0 ){ 154 errorMessage( errorText ); 155 flag = false; 156 } 157 158 }); 159 160 return flag; 161 } 162 163 // PARTIAL FORM VALIDATION EACH TIME THE NEXT BUTTON IS CLICKED 164 $el.on('orbit:beforeNextTransition', function( ev ){ 165 166 $el.find('.orbit-form-alert').hide(); 167 168 var $slide = getCurrentSlide(), 169 flag = validatePartialForm( $slide ); 170 171 $slide.data('slide-disable', '1'); 172 173 if( flag ){ $slide.data('slide-disable', '0'); } 174 175 }); 176 177 // FORM SUBMISSION 178 $el.closest( 'form' ).submit( function(event){ 179 180 $el.find('.orbit-form-alert').hide(); 181 182 var $slide = getCurrentSlide(), 183 flag = validatePartialForm( $slide ); 184 185 if( !flag ){ event.preventDefault(); } 186 187 } ); 188 189 // INITIALIZE 190 function init(){ 191 192 // ASSIGN SLIDE ID TO EACH SLIDE 193 $el.find('.orbit-slide').each( function( i, slide ){ 194 jQuery( slide ).attr( 'data-slide', i );
195 if( i == 0 ){ jQuery( slide ).addClass('active'); } 196 }); 197 198 // CREATE PROGRESS BAR FOR THE MULTIPART FORM 199 createProgressBar(); 200 updateProgress(); 201 202 // HIDE FORM ALERT ON LOAD 203 $el.find('.orbit-form-alert').hide(); 204 } 205 206 init(); 207 208 209 }); 210 211 }; 212 213}(jQuery)); 214 215jQuery('document').ready(function(){ 216 jQuery( '[data-behaviour~=orbit-slides]' ).orbit_slides(); 217});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.