-
Notifications
You must be signed in to change notification settings - Fork 4
/
CSS3Slider.SlideDirection.js
165 lines (133 loc) · 5.16 KB
/
CSS3Slider.SlideDirection.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/**
* handles direction slides
*
* @param {CSS3Slider} CSS3Slider
* @returns {CSS3Slider_SlideDirection}
*/
function CSS3Slider_SlideDirection(CSS3Slider) {
this.__CSS3Slider = null;
/**
* init tasks
*
* @param {CSS3Slider} CSS3Slider
* @returns {void}
*/
this.__construct = function(CSS3Slider) {
this.__CSS3Slider = CSS3Slider;
};
/**
* slide in a given direction
*
* @param {String} direction
* @param {Boolean} testCalculation
* @returns {object}
*/
this.directionSlide = function(direction, testCalculation) {
if(this.__CSS3Slider.isAnimationAllowed()) {
var baseConfig = this.__CSS3Slider._Config._getBaseConfig();
var runtimeConfig = this.__CSS3Slider._Config.getRuntimeConfig();
if(baseConfig.continiousSlide) {
if(baseConfig.cloneMode) {
// handle slide if cloneMode and continious slide are active
return this.__directionSlideContiniousClone(direction, baseConfig, runtimeConfig, testCalculation);
}else {
// handle slide if continious slide is active
return this.__directionSlideContinious(direction, baseConfig, runtimeConfig, testCalculation);
}
}else {
// handle simple slide
return this.__directionSlide(direction, baseConfig, runtimeConfig, testCalculation);
}
}else {
// simply return the runtime config without animation
return this.__CSS3Slider._Config.getRuntimeConfig();
}
};
/**
* handle the slide if cloneMode and continious slide are active
*
* @param {String} direction
* @param {object} baseConfig
* @param {object} runtimeConfig
* @param {Boolean} testCalculation
* @returns {object}
*/
this.__directionSlideContiniousClone = function(direction, baseConfig, runtimeConfig, testCalculation) {
var currentPosition = runtimeConfig.slidePosition;
var slidesAvailable = this.__CSS3Slider.slidesAvailable(direction);
if(slidesAvailable < baseConfig.maxSteps) {
// if the slider has not enough slider childs to perform a full slide
// deactivate the transition
this.__CSS3Slider._Dom.deactivateAnimation();
if(direction === 'right') {
// move the slider to the left side
this.__CSS3Slider._SlidePosition.positionSlide(0 - (runtimeConfig.slideChildrenCount - currentPosition));
}else if(direction === 'left') {
// move the slider to the right side
this.__CSS3Slider._SlidePosition.positionSlide(runtimeConfig.slideChildrenCount + currentPosition);
}
// after a short timeout - slide to the new position
setTimeout(function() {
this.__CSS3Slider._Dom.activateAnimation();
this.directionSlide(direction);
}.bind(this), 50);
this.__CSS3Slider._allowAnimation();
// return the future runtimeconfig using the testcalculation flag
return this.directionSlide(direction, true);
}
// simply slide in the desired direction
return this.__directionSlide(direction, baseConfig, runtimeConfig, testCalculation);
};
/**
* handle the slide if continious slide is active
*
* @param {String} direction
* @param {object} baseConfig
* @param {object} runtimeConfig
* @param {Boolean} testCalculation
* @returns {object}
*/
this.__directionSlideContinious = function(direction, baseConfig, runtimeConfig, testCalculation) {
var slidesAvailable = this.__CSS3Slider.slidesAvailable(direction);
// if there are no more slides available - then slide to the other side
if(slidesAvailable <= 0) {
if(direction === 'left') {
return this.__CSS3Slider._SlidePosition.positionSlide(runtimeConfig.slideChildrenCount);
}else if(direction === 'right') {
return this.__CSS3Slider._SlidePosition.positionSlide(0);
}
}
// simply slide in the desired direction
return this.__directionSlide(direction, baseConfig, runtimeConfig, testCalculation);
};
/**
* simple slide if no special behavior is active
*
* @param {String} direction
* @param {object} baseConfig
* @param {object} runtimeConfig
* @param {Boolean} testCalculation
* @returns {object}
*/
this.__directionSlide = function(direction, baseConfig, runtimeConfig, testCalculation) {
var currentPosition = runtimeConfig.slidePosition;
var slidesAvailable = this.__CSS3Slider.slidesAvailable(direction);
var stepsToSlide = null;
// check if there are enough slider child nodes available for a slide, to perform the configured single slide
if(slidesAvailable >= baseConfig.maxSteps) {
stepsToSlide = baseConfig.maxSteps;
}else {
stepsToSlide = slidesAvailable;
}
// set the new active slider child node
var newPosition = (direction === 'left') ? currentPosition - stepsToSlide : currentPosition + stepsToSlide;
// check if the current active slider child node is the target slide child node
if(newPosition !== currentPosition) {
return this.__CSS3Slider._SlidePosition.positionSlide(newPosition, testCalculation);
}else {
return this.__CSS3Slider._Config.getRuntimeConfig();
}
};
this.__construct(CSS3Slider);
}
module.exports = CSS3Slider_SlideDirection;