diff --git a/layout-iscroll2.html b/layout-iscroll2.html
index 0c6ad2a..d450001 100755
--- a/layout-iscroll2.html
+++ b/layout-iscroll2.html
@@ -114,18 +114,22 @@ $(document).ready(function(){
window.THRESHOLD = 10
- var scroller = makeScrollHandler($('.viewer'), function(speed, distance){
- // XXX this is not too correct...
- // ...make this mode specific...
- if(getMagazineScale() >= 1){
- var cur = $('.current.page')
- if(distance > THRESHOLD){
- return nextPage(cur)
- } else if(distance < -THRESHOLD){
- return prevPage(cur)
+ window.MagazineScroller = makeScrollHandler($('.viewer'), {
+ hScroll: true,
+ vScroll: false,
+ callback: function(speed, distance){
+ // XXX this is not too correct...
+ // ...make this mode specific...
+ if(getMagazineScale() >= 1){
+ var cur = $('.current.page')
+ if(distance > THRESHOLD){
+ return nextPage(cur)
+ } else if(distance < -THRESHOLD){
+ return prevPage(cur)
+ }
}
- }
- setCurrentPage()
+ setCurrentPage()
+ },
}).start()
//setMagazineScale(0.5)
diff --git a/layout.js b/layout.js
index f931eef..bcf972b 100755
--- a/layout.js
+++ b/layout.js
@@ -44,6 +44,7 @@ var togglePageView = createCSSClassToggler(
// XXX this is not correct...
// ...need to fit one rectangel (page) into another (viewer)
+ // ...use the implementation in magazine.js
if(W >= H){
// fit to width...
var scale = W/w
@@ -80,13 +81,16 @@ var togglePageView = createCSSClassToggler(
// XXX should we use a callback or an event???
// XXX make this get the scrolled item automatically...
// ...now $('.magazine') is hardcoded...
-function makeScrollHandler(root, callback){
+function makeScrollHandler(root, config){
+ root = $(root)
// local data...
+ var scrolled
var scrolling = false
var touch = false
var touches = 0
- var start
+ var start_x
+ var start_y
var prev_x
var prev_y
var prev_t
@@ -97,41 +101,35 @@ function makeScrollHandler(root, callback){
var y
var t
var dx
+ var dy
var dt
- // XXX at this point this is not used...
- var config = {
- hScroll: true,
- vScroll: false,
-
- enableEvents: false,
- autoCancelEvents: false,
- eventBounds: 5,
- }
-
function startMoveHandler(evt, callback){
prev_t = event.timeStamp || Date.now();
- if(config.autoCancelEvents){
+ if(scroller.options.autoCancelEvents){
bounds = {
- left: config.eventBounds,
- right: root.width() - config.eventBounds,
- top: config.eventBounds,
- bottom: root.height() - config.eventBounds
+ left: scroller.options.eventBounds,
+ right: root.width() - scroller.options.eventBounds,
+ top: scroller.options.eventBounds,
+ bottom: root.height() - scroller.options.eventBounds
}
}
- setTransitionDuration($('.magazine'), 0)
+ scrolled = $(root.children()[0])
+ setTransitionDuration(scrolled, 0)
if(event.touches != null){
touch = true
}
scrolling = true
scroller.state = 'scrolling'
- //root.trigger('userScrollStart')
+ scroller.options.enabelStartEvent && root.trigger('userScrollStart')
//togglePageDragging('on')
- shift = getMagazineShift()
- scale = getMagazineScale()
+ shift = getElementShift(scrolled)
+ scale = getElementScale(scrolled)
// get the user coords...
prev_x = touch ? event.touches[0].pageX : evt.clientX
- start = prev_x
+ start_x = prev_x
+ prev_y = touch ? event.touches[0].pageY : evt.clientY
+ start_y = prev_y
return false
}
@@ -143,13 +141,14 @@ function makeScrollHandler(root, callback){
t = event.timeStamp || Date.now();
// get the user coords...
x = touch ? event.touches[0].pageX : evt.clientX
+ y = touch ? event.touches[0].pageY : evt.clientY
touches = touch ? event.touches.length : 0
// XXX needs testing...
// check scroll bounds...
if(bounds != null){
- if(config.hScroll && (x <= bounds.left || x >= bounds.right)
- || config.vScroll && (y <= bounds.top || y >= bounds.bottom)){
+ if(scroller.options.hScroll && (x <= bounds.left || x >= bounds.right)
+ || scroller.options.vScroll && (y <= bounds.top || y >= bounds.bottom)){
// XXX cancel the touch event and trigger the end handler...
return endMoveHandler(evt)
}
@@ -157,17 +156,24 @@ function makeScrollHandler(root, callback){
// do the actual scroll...
if(scrolling){
- shift += x - prev_x
- setElementTransform($('.magazine'), shift, scale)
+ if(scroller.options.hScroll){
+ shift.left += x - prev_x
+ }
+ if(scroller.options.vScroll){
+ shift.top += y - prev_y
+ }
+ setElementTransform(scrolled, shift, scale)
// XXX these should be done every time the event is caught or
// just while scrolling?
dx = x - prev_x
+ dy = y - prev_y
dt = t - prev_t
- prev_t = t
prev_x = x
+ prev_y = y
+ prev_t = t
- //root.trigger('userScroll')
+ scroller.options.enableUserScrollEvent && root.trigger('userScroll')
}
return false
}
@@ -175,20 +181,34 @@ function makeScrollHandler(root, callback){
// XXX get real transition duration...
setTransitionDuration($('.magazine'), 200)
x = touch ? event.changedTouches[0].pageX : evt.clientX
+ y = touch ? event.changedTouches[0].pageY : evt.clientY
touch = false
scrolling = false
scroller.state = 'waiting'
touches = 0
bounds = null
//togglePageDragging('off')
- // XXX add speed to this...
- //root.trigger('userScrollEnd')
- callback && callback(dx/dt, start - x)
+ scroller.options.enableEndEvent && root.trigger('userScrollEnd', dx, dy, dt, start_x, start_y)
+ scroller.options.callback && scroller.options.callback(dx/dt, start_x-x)
return false
}
var scroller = {
+ options: {
+ hScroll: true,
+ vScroll: true,
+
+ enabelStartEvent: false,
+ enableUserScrollEvent: false,
+ enableEndEvent: false,
+
+ autoCancelEvents: false,
+ eventBounds: 5,
+
+ callback: null
+ },
+
start: function(){
this.state = 'waiting'
// XXX STUB: this makes starting the scroll a bit sluggish,
@@ -233,6 +253,12 @@ function makeScrollHandler(root, callback){
// NOTE: this is updated live but not used by the system in any way...
state: 'stopped'
}
+
+ // merge the config with the defaults...
+ if(config != null){
+ $.extend(scroller.options, config)
+ }
+
return scroller
}
@@ -274,15 +300,18 @@ function getMagazineOffset(page, scale, align){
var offset = $('.viewer').width()/2 - (page.width()/2)*scale
}
+ // NOTE: this without scaling also represents the inner width of
+ // the viewer...
var w = mag.outerWidth(true)
// XXX this depends on scale...
var pos = page.position().left//*scale
+ var l = 0
+
return -((w - w*scale)/2 + pos) + offset
}
-// XXX make this work for narrow and left/right alligned pages...
function getPageNumber(page){
// a page is given explicitly, get the next one...
if(page != null){
diff --git a/lib/jli.js b/lib/jli.js
index 8d9f19e..888faab 100755
--- a/lib/jli.js
+++ b/lib/jli.js
@@ -196,14 +196,27 @@ function unanimated(obj, func, time){
// NOTE: at this point this works only on the X axis...
function setElementTransform(elem, offset, scale){
+ elem = $(elem)
if(offset == null){
- var offset = getElementShift(elem).left
+ offset = getElementShift(elem)
+ // number -- only the x coord...
+ } else if(typeof(offset) == typeof(1)){
+ offset = {
+ left: offset,
+ top: 0
+ }
+ // array...
+ } else if(offset.indexOf){
+ offset = {
+ left: offset[0] ? offset[0] : 0,
+ top: offset[1] ? offset[1] : 0
+ }
}
if(scale == null){
var scale = getElementScale(elem)
}
if(USE_TRANSFORM){
- var transform = 'translate('+ offset +'px, 0px) scale('+ scale +') translateZ(0px)'
+ var transform = 'translate('+ offset.left +'px, '+ offset.top +'px) scale('+ scale +') translateZ(0px)'
elem.css({
'-ms-transform' : transform,
'-webkit-transform' : transform,
@@ -212,14 +225,17 @@ function setElementTransform(elem, offset, scale){
'transform' : transform,
// XXX can we avoid this here??
- left: 0
+ left: 0,
+ // XXX is this correct???
+ top: ''
})
} else {
var transform = 'translate(0px, 0px) scale('+ scale +') translateZ(0px)'
elem.css({
// NOTE: this will be wrong during a transition, that's why we
// can pass the pre-calculated offset as an argument...
- left: offset,
+ left: offset.left,
+ top: offset.top,
// XXX can we avoid this here??
'-ms-transform' : transform,
@@ -284,15 +300,16 @@ function getElementShift(elem){
if(!transform || transform == 'none'){
return {left: 0, top: 0}
}
+ res = /(translate\(|matrix\([^,]*,[^,]*,[^,]*,[^,]*,)([^,]*),([^\)]*)\)/.exec(transform)
return {
- left: parseFloat(/(translate\(|matrix\([^,]*,[^,]*,[^,]*,[^,]*,)([^,]*),/.exec(transform)[2]),
- top: null
+ left: parseFloat(res[2]),
+ top: parseFloat(res[3])
}
// using left...
} else {
return {
left: elem.position().left,
- top: null
+ top: elem.position().top
}
}
}