jqmobi-rails 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/Gemfile +8 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +68 -0
- data/jqmobi-rails.gemspec +17 -0
- data/lib/jqmobi/rails/engine.rb +6 -0
- data/lib/jqmobi/rails/version.rb +7 -0
- data/lib/jqmobi/rails.rb +7 -0
- data/lib/jqmobi-rails.rb +1 -0
- data/vendor/assets/javascripts/jq.mobi.js +1894 -0
- data/vendor/assets/javascripts/jq.mobi_ujs.js +393 -0
- data/vendor/assets/javascripts/jq.ui.js +3396 -0
- data/vendor/assets/javascripts/plugins/jq.actionsheet.js +99 -0
- data/vendor/assets/javascripts/plugins/jq.alphatable.js +136 -0
- data/vendor/assets/javascripts/plugins/jq.carousel.js +415 -0
- data/vendor/assets/javascripts/plugins/jq.css3animate.js +155 -0
- data/vendor/assets/javascripts/plugins/jq.drawer.js +224 -0
- data/vendor/assets/javascripts/plugins/jq.fx.js +110 -0
- data/vendor/assets/javascripts/plugins/jq.passwordBox.js +45 -0
- data/vendor/assets/javascripts/plugins/jq.popup.js +201 -0
- data/vendor/assets/javascripts/plugins/jq.scroller.js +540 -0
- data/vendor/assets/javascripts/plugins/jq.selectBox.js +315 -0
- data/vendor/assets/javascripts/plugins/jq.shake.js +39 -0
- data/vendor/assets/javascripts/plugins/jq.social.js +113 -0
- data/vendor/assets/javascripts/plugins/jq.swipe.js +121 -0
- data/vendor/assets/javascripts/plugins/jq.template.js +26 -0
- data/vendor/assets/javascripts/plugins/jq.web.min.js +66 -0
- data/vendor/assets/stylesheets/plugins/jq.actionsheet.css +57 -0
- data/vendor/assets/stylesheets/plugins/jq.popup.css +73 -0
- data/vendor/assets/stylesheets/plugins/jq.scroller.css +10 -0
- data/vendor/assets/stylesheets/plugins/jq.selectBox.css +35 -0
- metadata +77 -0
@@ -0,0 +1,99 @@
|
|
1
|
+
/**
|
2
|
+
* jq.web.actionsheet - a actionsheet for html5 mobile apps
|
3
|
+
* Copyright 2012 - AppMobi
|
4
|
+
*/
|
5
|
+
(function($) {
|
6
|
+
$.fn["actionsheet"] = function(opts) {
|
7
|
+
var tmp;
|
8
|
+
for (var i = 0; i < this.length; i++) {
|
9
|
+
tmp = new actionsheet(this[i], opts);
|
10
|
+
}
|
11
|
+
return this.length == 1 ? tmp : this;
|
12
|
+
};
|
13
|
+
var actionsheet = (function() {
|
14
|
+
if (!window.WebKitCSSMatrix)
|
15
|
+
return;
|
16
|
+
|
17
|
+
var actionsheet = function(elID, opts) {
|
18
|
+
if (typeof elID == "string" || elID instanceof String) {
|
19
|
+
this.el = document.getElementById(elID);
|
20
|
+
} else {
|
21
|
+
this.el = elID;
|
22
|
+
}
|
23
|
+
if (!this.el) {
|
24
|
+
alert("Could not find element for actionsheet " + elID);
|
25
|
+
return;
|
26
|
+
}
|
27
|
+
|
28
|
+
if (this instanceof actionsheet) {
|
29
|
+
if(typeof(opts)=="object"){
|
30
|
+
for (j in opts) {
|
31
|
+
this[j] = opts[j];
|
32
|
+
}
|
33
|
+
}
|
34
|
+
} else {
|
35
|
+
return new actionsheet(elID, opts);
|
36
|
+
}
|
37
|
+
|
38
|
+
try {
|
39
|
+
var that = this;
|
40
|
+
var markStart = '</div><div id="jq_actionsheet"><div style="width:100%">';
|
41
|
+
var markEnd = '</div></div>';
|
42
|
+
var markup;
|
43
|
+
if (typeof opts == "string") {
|
44
|
+
markup = $(markStart + opts +"<a href='javascript:;' class='cancel'>Cancel</a>"+markEnd);
|
45
|
+
} else if (typeof opts == "object") {
|
46
|
+
markup = $(markStart + markEnd);
|
47
|
+
var container = $(markup.children().get());
|
48
|
+
opts.push({text:"Cancel",cssClasses:"cancel"});
|
49
|
+
for (var i = 0; i < opts.length; i++) {
|
50
|
+
var item = $('<a href="javascript:;" >' + (opts[i].text || "TEXT NOT ENTERED") + '</a>');
|
51
|
+
item[0].onclick = (opts[i].handler || function() {});
|
52
|
+
if (opts[i].cssClasses && opts[i].cssClasses.length > 0)
|
53
|
+
item.addClass(opts[i].cssClasses);
|
54
|
+
container.append(item);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
$(elID).find("#jq_actionsheet").remove();
|
58
|
+
$(elID).find("#jq_action_mask").remove();
|
59
|
+
actionsheetEl = $(elID).append(markup);
|
60
|
+
|
61
|
+
markup.get().style.webkitTransition="all 0ms";
|
62
|
+
markup.css("-webkit-transform", "translate3d(0,"+(window.innerHeight*2) + "px,0)");
|
63
|
+
this.el.style.overflow = "hidden";
|
64
|
+
markup.on("click", "a",function(){that.hideSheet()});
|
65
|
+
this.activeSheet=markup;
|
66
|
+
$(elID).append('<div id="jq_action_mask" style="position:absolute;top:0px;left:0px;right:0px;bottom:0px;z-index:9998;background:rgba(0,0,0,.4)"/>');
|
67
|
+
setTimeout(function(){
|
68
|
+
markup.get().style.webkitTransition="all 200ms";
|
69
|
+
var height=window.innerHeight-parseInt(markup.css("height"));
|
70
|
+
markup.css("-webkit-transform", "translate3d(0,"+(height)+"px,0)");
|
71
|
+
},10);
|
72
|
+
} catch (e) {
|
73
|
+
alert("error adding actionsheet" + e);
|
74
|
+
}
|
75
|
+
};
|
76
|
+
actionsheet.prototype = {
|
77
|
+
activeSheet:null,
|
78
|
+
hideSheet: function() {
|
79
|
+
var that=this;
|
80
|
+
this.activeSheet.off("click","a",function(){that.hideSheet()});
|
81
|
+
$(this.el).find("#jq_action_mask").remove();
|
82
|
+
this.activeSheet.get().style.webkitTransition="all 0ms";
|
83
|
+
var markup = this.activeSheet;
|
84
|
+
var theEl = this.el;
|
85
|
+
setTimeout(function(){
|
86
|
+
|
87
|
+
markup.get().style.webkitTransition="all 500ms";
|
88
|
+
markup.css("-webkit-transform", "translate3d(0,"+(window.innerHeight*2) + "px,0)");
|
89
|
+
setTimeout(function(){
|
90
|
+
markup.remove();
|
91
|
+
markup=null;
|
92
|
+
theEl.style.overflow = "none";
|
93
|
+
},500);
|
94
|
+
},10);
|
95
|
+
}
|
96
|
+
};
|
97
|
+
return actionsheet;
|
98
|
+
})();
|
99
|
+
})(jq);
|
@@ -0,0 +1,136 @@
|
|
1
|
+
/**
|
2
|
+
* $.alphaTable - a list table for jqMobi apps
|
3
|
+
*
|
4
|
+
* @copyright AppMobi 2011 - AppMobi
|
5
|
+
*
|
6
|
+
*/ (function ($) {
|
7
|
+
$.fn["alphatable"] = function (scroller, opts) {
|
8
|
+
var tmp;
|
9
|
+
for (var i = 0; i < this.length; i++) {
|
10
|
+
tmp = new alphaTable(this[i], scroller, opts);
|
11
|
+
|
12
|
+
}
|
13
|
+
return this.length == 1 ? tmp : this;
|
14
|
+
};
|
15
|
+
|
16
|
+
var alphaTable = (function () {
|
17
|
+
if (!window.WebKitCSSMatrix) return;
|
18
|
+
var translateOpen = 'm11' in new WebKitCSSMatrix() ? "3d(" : "(";
|
19
|
+
var translateClose = 'm11' in new WebKitCSSMatrix() ? ",0)" : ")";
|
20
|
+
var alphaTable = function (el, scroller, opts) {
|
21
|
+
|
22
|
+
if (typeof el == "string") el = document.getElementById(el);
|
23
|
+
this.container = el.parentNode;
|
24
|
+
if (!this.container) {
|
25
|
+
alert("Error finding container for alphaTable " + el);
|
26
|
+
return;
|
27
|
+
}
|
28
|
+
if (this instanceof alphaTable) {
|
29
|
+
for (j in opts) {
|
30
|
+
this[j] = opts[j];
|
31
|
+
}
|
32
|
+
} else {
|
33
|
+
return new alphaTable(el, scroller, opts);
|
34
|
+
}
|
35
|
+
if (!scroller || typeof (scroller) != "object") {
|
36
|
+
return alert("Error: Please include an jq.web.scroll object to use this");
|
37
|
+
}
|
38
|
+
this.scroller = scroller;
|
39
|
+
|
40
|
+
this.el = el;
|
41
|
+
this.setupIndex();
|
42
|
+
this.setupLetterBox();
|
43
|
+
};
|
44
|
+
|
45
|
+
alphaTable.prototype = {
|
46
|
+
listCssClass: "",
|
47
|
+
letterBox: null,
|
48
|
+
isMoving: false,
|
49
|
+
prefix: "",
|
50
|
+
scrollToLetter: function (letter) {
|
51
|
+
var el = document.getElementById(this.prefix + letter);
|
52
|
+
if (el) {
|
53
|
+
var yPos = -el.offsetTop;
|
54
|
+
this.scroller.scrollTo({
|
55
|
+
x: 0,
|
56
|
+
y: yPos
|
57
|
+
});
|
58
|
+
}
|
59
|
+
},
|
60
|
+
setupIndex: function () {
|
61
|
+
var arrAlphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
|
62
|
+
var that = this;
|
63
|
+
var containerDiv = document.createElement("div");
|
64
|
+
containerDiv.id = "indexDIV_" + this.el.id;
|
65
|
+
containerDiv.style.cssText = "position:absolute;top:0px;right:20px;width:20px;font-size:6pt;font-weight:bold;color:#000;opacity:.5;border-radius:5px;text-align:center;z-index:9999;border:1px solid black;background:#666;padding-top:5px;padding-bottom:5px;";
|
66
|
+
containerDiv.className = this.listCssClass;
|
67
|
+
containerDiv.addEventListener("touchend", function (event) {
|
68
|
+
that.isMoving = false;
|
69
|
+
that.clearLetterBox()
|
70
|
+
}, false);
|
71
|
+
//To allow updating as we "scroll" with our finger, we need to capture the position on the containerDiv element and calculate the Y coordinates.
|
72
|
+
//On mobile devices, you can not do an "onmouseover" over multiple items and trigger events.
|
73
|
+
containerDiv.addEventListener("touchstart", function (event) {
|
74
|
+
if(event.touches[0].target==this) return;
|
75
|
+
that.isMoving = true;
|
76
|
+
|
77
|
+
var letter = document.elementFromPoint(event.changedTouches[0].clientX, event.changedTouches[0].clientY);
|
78
|
+
if(!letter||!letter.getAttribute("alphatable-item")||letter.getAttribute("alphatable-item").length==0)
|
79
|
+
return;
|
80
|
+
that.showLetter(letter.innerHTML);
|
81
|
+
that.scrollToLetter(letter.innerHTML);
|
82
|
+
event.preventDefault();
|
83
|
+
}, false);
|
84
|
+
containerDiv.addEventListener("touchmove", function (event) {
|
85
|
+
var letter = document.elementFromPoint(event.changedTouches[0].clientX, event.changedTouches[0].clientY);
|
86
|
+
if(!letter||!letter.getAttribute("alphatable-item")||letter.getAttribute("alphatable-item").length==0)
|
87
|
+
return;
|
88
|
+
if (!that.isMoving) return;
|
89
|
+
that.showLetter(letter.innerHTML);
|
90
|
+
that.scrollToLetter(letter.innerHTML);
|
91
|
+
event.preventDefault();
|
92
|
+
}, false);
|
93
|
+
|
94
|
+
//Create the alphabet
|
95
|
+
for (i = 0; i < arrAlphabet.length; i++) {
|
96
|
+
var tmpDiv = document.createElement("div");
|
97
|
+
tmpDiv.innerHTML = arrAlphabet[i];
|
98
|
+
tmpDiv.setAttribute("alphatable-item","true");
|
99
|
+
containerDiv.appendChild(tmpDiv);
|
100
|
+
}
|
101
|
+
this.container.appendChild(containerDiv);
|
102
|
+
|
103
|
+
var clientHeight = numOnly(containerDiv.clientHeight) - numOnly(containerDiv.style.top) - numOnly(containerDiv.style.paddingTop);
|
104
|
+
this.scroller.scrollTo({
|
105
|
+
x: 0,
|
106
|
+
y: 0
|
107
|
+
}); //There's a bug with webkit and css3. The letterbox would not show until -webkit-transform as applied.
|
108
|
+
containerDiv = null;
|
109
|
+
|
110
|
+
},
|
111
|
+
showLetter: function (letter) {
|
112
|
+
var that = this;
|
113
|
+
this.letterBox.style.display = "block";
|
114
|
+
if (this.letterBox.innerHTML != letter) {
|
115
|
+
that.letterBox.innerHTML = letter
|
116
|
+
}
|
117
|
+
|
118
|
+
},
|
119
|
+
clearLetterBox: function () {
|
120
|
+
this.letterBox.style.display = "none";
|
121
|
+
this.letterBox.innerHTML = "";
|
122
|
+
},
|
123
|
+
setupLetterBox: function () {
|
124
|
+
var div = document.createElement("div");
|
125
|
+
div.style.cssText = "-webkit-transform:translate3d(0,0,0);display:none;position:absolute;top:35%;left:35%;height:2em;width:15%;line-height:2em;text-align:center;font-size:2em;color:blue;background:#666;z-index:999999;border:1px solid black;border-raidus:10px;";
|
126
|
+
div.className = this.letterBoxCssClass;
|
127
|
+
div.innerHTML = "";
|
128
|
+
this.letterBox = div;
|
129
|
+
this.container.appendChild(div);
|
130
|
+
div = null;
|
131
|
+
|
132
|
+
}
|
133
|
+
};
|
134
|
+
return alphaTable;
|
135
|
+
})();
|
136
|
+
})(jq);
|
@@ -0,0 +1,415 @@
|
|
1
|
+
/**
|
2
|
+
* jq.web.carousel - a carousel library for html5 mobile apps
|
3
|
+
* @copyright AppMobi 2011 - AppMobi
|
4
|
+
*
|
5
|
+
*/
|
6
|
+
(function($) {
|
7
|
+
var cache = [];
|
8
|
+
$.fn.carousel = function(opts) {
|
9
|
+
if (opts === undefined && this.length > 0)
|
10
|
+
{
|
11
|
+
return cache[this[0].id] ? cache[this[0].id] : null;
|
12
|
+
}
|
13
|
+
var tmp;
|
14
|
+
for (var i = 0; i < this.length; i++) {
|
15
|
+
tmp = new carousel(this[i], opts);
|
16
|
+
if (this[i].id)
|
17
|
+
cache[this[i].id] = tmp;
|
18
|
+
}
|
19
|
+
return this.length === 1 ? tmp : this;
|
20
|
+
};
|
21
|
+
|
22
|
+
var carousel = (function() {
|
23
|
+
if (!window.WebKitCSSMatrix) {
|
24
|
+
return;
|
25
|
+
}
|
26
|
+
var translateOpen = 'm11' in new WebKitCSSMatrix() ? "3d(" : "(";
|
27
|
+
var translateClose = 'm11' in new WebKitCSSMatrix() ? ",0)" : ")";
|
28
|
+
|
29
|
+
var carousel = function(containerEl, opts) {
|
30
|
+
if (typeof containerEl === "string" || containerEl instanceof String) {
|
31
|
+
this.container = document.getElementById(containerEl);
|
32
|
+
} else {
|
33
|
+
this.container = containerEl;
|
34
|
+
}
|
35
|
+
if (!this.container) {
|
36
|
+
alert("Error finding container for carousel " + containerEl);
|
37
|
+
return;
|
38
|
+
}
|
39
|
+
if (this instanceof carousel) {
|
40
|
+
for (var j in opts) {
|
41
|
+
if (opts.hasOwnProperty(j)) {
|
42
|
+
this[j] = opts[j];
|
43
|
+
}
|
44
|
+
}
|
45
|
+
} else {
|
46
|
+
|
47
|
+
return new carousel(containerEl, opts);
|
48
|
+
}
|
49
|
+
try {
|
50
|
+
var that = this;
|
51
|
+
this.pagingDiv = this.pagingDiv ? document.getElementById(this.pagingDiv) : null;
|
52
|
+
|
53
|
+
|
54
|
+
// initial setup
|
55
|
+
this.container.style.overflow = "hidden";
|
56
|
+
this.container.style['-webkit-box-orient'] = "vertical";
|
57
|
+
this.container.style['display'] = "-webkit-box";
|
58
|
+
this.container.style['-webkit-box-orient'] = "vertical";
|
59
|
+
if (this.vertical) {
|
60
|
+
this.horizontal = false;
|
61
|
+
}
|
62
|
+
var tmpHTML = this.container.innerHTML;
|
63
|
+
this.container.innerHTML = "";
|
64
|
+
var el = document.createElement("div");
|
65
|
+
el.innerHTML = tmpHTML;
|
66
|
+
if (this.horizontal) {
|
67
|
+
el.style.display = "-webkit-box";
|
68
|
+
el.style['-webkit-box-flex'] = 1;
|
69
|
+
}
|
70
|
+
else {
|
71
|
+
el.style.display = "block";
|
72
|
+
}
|
73
|
+
this.container.appendChild(el);
|
74
|
+
this.el = el;
|
75
|
+
this.refreshItems();
|
76
|
+
el.addEventListener('touchmove', function(e) {
|
77
|
+
that.touchMove(e);
|
78
|
+
}, false);
|
79
|
+
el.addEventListener('touchend', function(e) {
|
80
|
+
that.touchEnd(e);
|
81
|
+
}, false);
|
82
|
+
el.addEventListener('touchstart', function(e) {
|
83
|
+
that.touchStart(e);
|
84
|
+
}, false);
|
85
|
+
var that = this;
|
86
|
+
window.addEventListener("orientationchange", function() {
|
87
|
+
that.onMoveIndex(that.carouselIndex,0);
|
88
|
+
}, false);
|
89
|
+
|
90
|
+
} catch (e) {
|
91
|
+
console.log("error adding carousel " + e);
|
92
|
+
}
|
93
|
+
};
|
94
|
+
|
95
|
+
carousel.prototype = {
|
96
|
+
startX: 0,
|
97
|
+
startY: 0,
|
98
|
+
dx: 0,
|
99
|
+
dy: 0,
|
100
|
+
myDivWidth: 0,
|
101
|
+
myDivHeight: 0,
|
102
|
+
cssMoveStart: 0,
|
103
|
+
childrenCount: 0,
|
104
|
+
carouselIndex: 0,
|
105
|
+
vertical: false,
|
106
|
+
horizontal: true,
|
107
|
+
el: null,
|
108
|
+
movingElement: false,
|
109
|
+
container: null,
|
110
|
+
pagingDiv: null,
|
111
|
+
pagingCssName: "carousel_paging",
|
112
|
+
pagingCssNameSelected: "carousel_paging_selected",
|
113
|
+
pagingFunction: null,
|
114
|
+
lockMove:false,
|
115
|
+
// handle the moving function
|
116
|
+
touchStart: function(e) {
|
117
|
+
this.myDivWidth = numOnly(this.container.clientWidth);
|
118
|
+
this.myDivHeight = numOnly(this.container.clientHeight);
|
119
|
+
this.lockMove=false;
|
120
|
+
if (event.touches[0].target && event.touches[0].target.type !== undefined) {
|
121
|
+
var tagname = event.touches[0].target.tagName.toLowerCase();
|
122
|
+
if (tagname === "select" || tagname === "input" || tagname === "button") // stuff we need to allow
|
123
|
+
{
|
124
|
+
return;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
if (e.touches.length === 1) {
|
128
|
+
|
129
|
+
this.movingElement = true;
|
130
|
+
this.startY = e.touches[0].pageY;
|
131
|
+
this.startX = e.touches[0].pageX;
|
132
|
+
//e.preventDefault();
|
133
|
+
//e.stopPropagation();
|
134
|
+
if (this.vertical) {
|
135
|
+
try {
|
136
|
+
this.cssMoveStart = numOnly(new WebKitCSSMatrix(window.getComputedStyle(this.el, null).webkitTransform).f);
|
137
|
+
} catch (ex1) {
|
138
|
+
this.cssMoveStart = 0;
|
139
|
+
}
|
140
|
+
} else {
|
141
|
+
try {
|
142
|
+
this.cssMoveStart = numOnly(new WebKitCSSMatrix(window.getComputedStyle(this.el, null).webkitTransform).e);
|
143
|
+
} catch (ex1) {
|
144
|
+
this.cssMoveStart = 0;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
}
|
148
|
+
},
|
149
|
+
touchMove: function(e) {
|
150
|
+
// e.preventDefault();
|
151
|
+
// e.stopPropagation();
|
152
|
+
if(!this.movingElement)
|
153
|
+
return;
|
154
|
+
if (e.touches.length > 1) {
|
155
|
+
return this.touchEnd(e);
|
156
|
+
}
|
157
|
+
|
158
|
+
var rawDelta = {
|
159
|
+
x: e.touches[0].pageX - this.startX,
|
160
|
+
y: e.touches[0].pageY - this.startY
|
161
|
+
};
|
162
|
+
|
163
|
+
if (this.vertical) {
|
164
|
+
var movePos = { x: 0, y: 0 };
|
165
|
+
this.dy = e.touches[0].pageY - this.startY;
|
166
|
+
this.dy += this.cssMoveStart;
|
167
|
+
movePos.y = this.dy;
|
168
|
+
e.preventDefault();
|
169
|
+
e.stopPropagation();
|
170
|
+
} else {
|
171
|
+
if (!this.lockMove&&isHorizontalSwipe(rawDelta.x, rawDelta.y)) {
|
172
|
+
|
173
|
+
var movePos = {x: 0,y: 0};
|
174
|
+
this.dx = e.touches[0].pageX - this.startX;
|
175
|
+
this.dx += this.cssMoveStart;
|
176
|
+
e.preventDefault();
|
177
|
+
e.stopPropagation();
|
178
|
+
movePos.x = this.dx;
|
179
|
+
}
|
180
|
+
else
|
181
|
+
return this.lockMove=true;
|
182
|
+
}
|
183
|
+
|
184
|
+
var totalMoved = this.vertical ? ((this.dy % this.myDivHeight) / this.myDivHeight * 100) * -1 : ((this.dx % this.myDivWidth) / this.myDivWidth * 100) * -1; // get a percentage of movement.
|
185
|
+
if(movePos)
|
186
|
+
this.moveCSS3(this.el, movePos);
|
187
|
+
},
|
188
|
+
touchEnd: function(e) {
|
189
|
+
if (!this.movingElement) {
|
190
|
+
return;
|
191
|
+
}
|
192
|
+
// e.preventDefault();
|
193
|
+
// e.stopPropagation();
|
194
|
+
var runFinal = false;
|
195
|
+
try {
|
196
|
+
var endPos = this.vertical ? numOnly(new WebKitCSSMatrix(window.getComputedStyle(this.el, null).webkitTransform).f) : numOnly(new WebKitCSSMatrix(window.getComputedStyle(this.el, null).webkitTransform).e);
|
197
|
+
if (endPos > 0) {
|
198
|
+
this.moveCSS3(this.el, {
|
199
|
+
x: 0,
|
200
|
+
y: 0
|
201
|
+
}, "300");
|
202
|
+
} else {
|
203
|
+
var totalMoved = this.vertical ? ((this.dy % this.myDivHeight) / this.myDivHeight * 100) * -1 : ((this.dx % this.myDivWidth) / this.myDivWidth * 100) * -1; // get a percentage of movement.
|
204
|
+
// Only need
|
205
|
+
// to drag 3% to trigger an event
|
206
|
+
var currInd = this.carouselIndex;
|
207
|
+
if (endPos < this.cssMoveStart && totalMoved > 3) {
|
208
|
+
currInd++; // move right/down
|
209
|
+
} else if ((endPos > this.cssMoveStart && totalMoved < 97)) {
|
210
|
+
currInd--; // move left/up
|
211
|
+
}
|
212
|
+
if (currInd > (this.childrenCount - 1)) {
|
213
|
+
currInd = this.childrenCount - 1;
|
214
|
+
}
|
215
|
+
if (currInd < 0) {
|
216
|
+
currInd = 0;
|
217
|
+
}
|
218
|
+
var movePos = {
|
219
|
+
x: 0,
|
220
|
+
y: 0
|
221
|
+
};
|
222
|
+
if (this.vertical) {
|
223
|
+
movePos.y = (currInd * this.myDivHeight * -1);
|
224
|
+
}
|
225
|
+
else {
|
226
|
+
movePos.x = (currInd * this.myDivWidth * -1);
|
227
|
+
}
|
228
|
+
|
229
|
+
this.moveCSS3(this.el, movePos, "150");
|
230
|
+
|
231
|
+
if (this.pagingDiv && this.carouselIndex !== currInd) {
|
232
|
+
document.getElementById(this.container.id + "_" + this.carouselIndex).className = this.pagingCssName;
|
233
|
+
document.getElementById(this.container.id + "_" + currInd).className = this.pagingCssNameSelected;
|
234
|
+
}
|
235
|
+
if (this.carouselIndex != currInd)
|
236
|
+
runFinal = true;
|
237
|
+
this.carouselIndex = currInd;
|
238
|
+
}
|
239
|
+
} catch (e) {
|
240
|
+
console.log(e);
|
241
|
+
}
|
242
|
+
this.dx = 0;
|
243
|
+
this.movingElement = false;
|
244
|
+
this.startX = 0;
|
245
|
+
this.dy = 0;
|
246
|
+
this.startY = 0;
|
247
|
+
if (runFinal && this.pagingFunction && typeof this.pagingFunction == "function")
|
248
|
+
this.pagingFunction(this.carouselIndex);
|
249
|
+
},
|
250
|
+
onMoveIndex: function(newInd,transitionTime) {
|
251
|
+
|
252
|
+
this.myDivWidth = numOnly(this.container.clientWidth);
|
253
|
+
this.myDivHeight = numOnly(this.container.clientHeight);
|
254
|
+
var runFinal = false;
|
255
|
+
try {
|
256
|
+
|
257
|
+
document.getElementById(this.container.id + "_" + this.carouselIndex).className = this.pagingCssName;
|
258
|
+
var newTime = Math.abs(newInd - this.carouselIndex);
|
259
|
+
|
260
|
+
var ind = newInd;
|
261
|
+
if (ind < 0)
|
262
|
+
ind = 0;
|
263
|
+
if (ind > this.childrenCount - 1) {
|
264
|
+
ind = this.childrenCount - 1;
|
265
|
+
}
|
266
|
+
var movePos = {
|
267
|
+
x: 0,
|
268
|
+
y: 0
|
269
|
+
};
|
270
|
+
if (this.vertical) {
|
271
|
+
movePos.y = (ind * this.myDivHeight * -1);
|
272
|
+
}
|
273
|
+
else {
|
274
|
+
movePos.x = (ind * this.myDivWidth * -1);
|
275
|
+
}
|
276
|
+
|
277
|
+
var time =transitionTime?transitionTime: 50 + parseInt((newTime * 20));
|
278
|
+
this.moveCSS3(this.el, movePos, time);
|
279
|
+
if (this.carouselIndex != ind)
|
280
|
+
runFinal = true;
|
281
|
+
this.carouselIndex = ind;
|
282
|
+
if (this.pagingDiv) {
|
283
|
+
|
284
|
+
document.getElementById(this.container.id + "_" + this.carouselIndex).className = this.pagingCssNameSelected;
|
285
|
+
}
|
286
|
+
} catch (e) {
|
287
|
+
console.log("Error " + e);
|
288
|
+
}
|
289
|
+
if (runFinal && this.pagingFunction && typeof this.pagingFunction == "function")
|
290
|
+
this.pagingFunction(currInd);
|
291
|
+
},
|
292
|
+
|
293
|
+
moveCSS3: function(el, distanceToMove, time, timingFunction) {
|
294
|
+
if (!time)
|
295
|
+
time = 0;
|
296
|
+
else
|
297
|
+
time = parseInt(time);
|
298
|
+
if (!timingFunction)
|
299
|
+
timingFunction = "linear";
|
300
|
+
|
301
|
+
el.style.webkitTransform = "translate" + translateOpen + distanceToMove.x + "px," + distanceToMove.y + "px" + translateClose;
|
302
|
+
el.style.webkitTransitionDuration = time + "ms";
|
303
|
+
el.style.webkitBackfaceVisiblity = "hidden";
|
304
|
+
el.style.webkitTransformStyle = "preserve-3d";
|
305
|
+
el.style.webkitTransitionTimingFunction = timingFunction;
|
306
|
+
},
|
307
|
+
|
308
|
+
addItem: function(el) {
|
309
|
+
if (el && el.nodeType) {
|
310
|
+
|
311
|
+
this.container.childNodes[0].appendChild(el);
|
312
|
+
this.refreshItems();
|
313
|
+
}
|
314
|
+
},
|
315
|
+
refreshItems: function() {
|
316
|
+
var childrenCounter = 0;
|
317
|
+
var that = this;
|
318
|
+
var el = this.el;
|
319
|
+
n = el.childNodes[0];
|
320
|
+
var widthParam;
|
321
|
+
var heightParam = "100%";
|
322
|
+
var elems = [];
|
323
|
+
for (; n; n = n.nextSibling) {
|
324
|
+
if (n.nodeType === 1) {
|
325
|
+
elems.push(n);
|
326
|
+
childrenCounter++;
|
327
|
+
}
|
328
|
+
}
|
329
|
+
var param = (100 / childrenCounter) + "%";
|
330
|
+
this.childrenCount = childrenCounter;
|
331
|
+
widthParam = parseFloat(100 / this.childrenCount) + "%";
|
332
|
+
for (var i = 0; i < elems.length; i++) {
|
333
|
+
if (this.horizontal) {
|
334
|
+
elems[i].style.width = widthParam;
|
335
|
+
elems[i].style.height = "100%";
|
336
|
+
}
|
337
|
+
else {
|
338
|
+
elems[i].style.height = widthParam;
|
339
|
+
elems[i].style.width = "100%";
|
340
|
+
elems[i].style.display = "block";
|
341
|
+
}
|
342
|
+
}
|
343
|
+
this.moveCSS3(el, {
|
344
|
+
x: 0,
|
345
|
+
y: 0
|
346
|
+
});
|
347
|
+
if (this.horizontal) {
|
348
|
+
el.style.width = Math.ceil((this.childrenCount) * 100) + "%";
|
349
|
+
el.style.height = "100%";
|
350
|
+
el.style['min-height'] = "100%"
|
351
|
+
}
|
352
|
+
else {
|
353
|
+
el.style.width = "100%";
|
354
|
+
el.style.height = Math.ceil((this.childrenCount) * 100) + "%";
|
355
|
+
el.style['min-height'] = Math.ceil((this.childrenCount) * 100) + "%";
|
356
|
+
}
|
357
|
+
// Create the paging dots
|
358
|
+
if (this.pagingDiv) {
|
359
|
+
this.pagingDiv.innerHTML = ""
|
360
|
+
for (i = 0; i < this.childrenCount; i++) {
|
361
|
+
|
362
|
+
var pagingEl = document.createElement("div");
|
363
|
+
pagingEl.id = this.container.id + "_" + i;
|
364
|
+
pagingEl.pageId = i;
|
365
|
+
if (i !== 0) {
|
366
|
+
pagingEl.className = this.pagingCssName;
|
367
|
+
}
|
368
|
+
else {
|
369
|
+
pagingEl.className = this.pagingCssNameSelected;
|
370
|
+
}
|
371
|
+
pagingEl.onclick = function() {
|
372
|
+
that.onMoveIndex(this.pageId);
|
373
|
+
};
|
374
|
+
var spacerEl = document.createElement("div");
|
375
|
+
|
376
|
+
spacerEl.style.width = "20px";
|
377
|
+
if(this.horizontal){
|
378
|
+
spacerEl.style.cssFloat = "left";
|
379
|
+
spacerEl.innerHTML = " ";
|
380
|
+
}
|
381
|
+
else{
|
382
|
+
spacerEl.innerHTML=" ";
|
383
|
+
spacerEl.style.display="block";
|
384
|
+
}
|
385
|
+
|
386
|
+
this.pagingDiv.appendChild(pagingEl);
|
387
|
+
if (i + 1 < (this.childrenCount))
|
388
|
+
this.pagingDiv.appendChild(spacerEl);
|
389
|
+
pagingEl = null;
|
390
|
+
spacerEl = null;
|
391
|
+
}
|
392
|
+
this.pagingDiv.style.width = (this.childrenCount) * 50 + "px";
|
393
|
+
this.pagingDiv.style.height = "25px";
|
394
|
+
}
|
395
|
+
this.onMoveIndex(this.carouselIndex);
|
396
|
+
|
397
|
+
}
|
398
|
+
|
399
|
+
};
|
400
|
+
return carousel;
|
401
|
+
})();
|
402
|
+
|
403
|
+
function isHorizontalSwipe(xAxis, yAxis) {
|
404
|
+
var X = xAxis;
|
405
|
+
var Y = yAxis;
|
406
|
+
var Z = Math.round(Math.sqrt(Math.pow(X,2)+Math.pow(Y,2))); //the distance - rounded - in pixels
|
407
|
+
var r = Math.atan2(Y,X); //angle in radians
|
408
|
+
var swipeAngle = Math.round(r*180/Math.PI); //angle in degrees
|
409
|
+
if ( swipeAngle < 0 ) { swipeAngle = 360 - Math.abs(swipeAngle); } // for negative degree values
|
410
|
+
if (((swipeAngle <= 215) && (swipeAngle >= 155)) || ((swipeAngle <= 45) && (swipeAngle >= 0)) || ((swipeAngle <= 360) && (swipeAngle >= 315))) // horizontal angles with threshold
|
411
|
+
{return true; }
|
412
|
+
else {return false}
|
413
|
+
}
|
414
|
+
|
415
|
+
})(jq);
|