var ArchiveView = ScrollableView.extend({
el: "#archive",
menu_template: $("#archive .menu .template").html(),
row_template: $("#archive .scroll .template").html(),
events: {
"click .item": "pick",
"mousedown .row": "mousedown",
"touchstart .row": "touchstart",
"mousemove .row": "mousemove",
"touchmove .row": "touchmove",
"mouseup .row": "mouseup",
"touchend .row": "touchend",
},
initialize: function(){
this.$menu_items = this.$(".menu .items")
this.$content = this.$(".content")
this.$loader = this.$(".loader")
this.scroller = new IScroll('#archive .scroll', app.iscroll_options)
this.$subtitle = this.$('.subtitle')
this.subtitle_html = this.$subtitle.html()
},
back: function(){
this.$el.addClass("menu")
app.header.set_back(false)
this.$subtitle.html( this.subtitle_html )
},
pick: function(e){
this.$el.removeClass("menu")
app.header.set_back(true)
var index = $(e.currentTarget).data("index")
this.$subtitle.html( $(e.currentTarget).text() )
this.populateDecade(index)
},
show: function(){
this.deferScrollToTop()
app.footer.hide()
this.back()
document.body.className = "archive"
},
populate: function(data){
if (this.loaded) { return }
this.loaded = true
this.data = data
this.$loader.hide()
this.$content.empty()
// id title images[ uri label code caption ]
this.data.forEach(function(row, index){
var t = this.menu_template.replace(/{{title}}/, row.title)
var $t = $(t)
$t.data("title", row.title)
$t.data("index", index)
this.$menu_items.append($t)
}.bind(this))
this.back()
this.deferScrollToTop()
this.populateDecade(0, 3)
},
populateDecade: function(index, count){
this.$content.empty()
var loader = new Loader()
var row = this.data[index]
count = count || row.images.length
row.images.forEach(function(cell, i){
var $t = $("
")
$t.addClass("row").addClass("loading")
var t = this.row_template.replace(/{{image}}/, cell.uri)
.replace(/{{label}}/, cell.label)
.replace(/{{code}}/, cell.code)
.replace(/{{caption}}/, cell.caption)
$t.html(t)
$t.data("flipped", false)
this.$content.append($t)
var item = $t[0]
var aa = this.build_aa_item( item )
aa.q = 0
this.render( aa, 0 )
aa.flipped = true
this.fix_z_index( aa )
var $text = $t.find(".text")
if ( ($text.height() % 2) == 1) {
$text.css("margin-bottom", "1px")
}
loader.preloadImage(cell.uri, function(){
aa.flipped = false
this.fix_z_index( aa )
$t.removeClass('loading')
}.bind(this))
}.bind(this))
},
// ['transformProp'] = "translateZ(0) translateX(-50%) translateY(-50%) ";
// .image, .text
touchstart: function(e){
app.archive.row = e.currentTarget
app.archive.mousedown(e.touches[0])
},
touchmove: function(e){
app.archive.mousemove(e.touches[0])
},
touchend: function(e){
app.archive.mouseup()
},
row: null,
image: null,
text: null,
flipped: false,
q: 0,
mousedown: function(e){
var aa = app.archive.item = app.archive.build_aa_item( app.archive.row || e.currentTarget )
aa.mouse_x = e.pageX
aa.mouse_y = e.pageY
},
build_aa_item: function(el){
var aa = {}
aa.row = el
aa.flipped = $(aa.row).data('flipped')
aa.image = $(aa.row).find(".image")[0]
aa.text = $(aa.row).find(".text")[0]
aa.q = 0
return aa
},
mousemove: function(e){
if (! app.archive.item) return
aa = app.archive.item
var dx = ( aa.mouse_x - e.pageX ) / window.innerWidth
var dy = ( aa.mouse_y - e.pageY ) / window.innerWidth
var gray, opacity, q
dx = Math.abs(dx)
dx *= 2
q = clamp( dx, 0, 1 )
this.render(aa, q)
aa.q = q
/*
aa.row.style['transformProp'] = [
"translateZ(0)",
"translateX(-50%)",
"translateY(-50%)",
"rotateY(" + dx + "deg)",
].join(" ")
*/
},
render: function(aa, q){
if ( aa.flipped ) {
gray = Math.round( (1-q) * 100 )
opacity = lerp(q, 0.2, 1)
text_opacity = lerp(q, 1, 0.3)
// console.log("<", gray, opacity)
}
else {
gray = Math.round( q * 100 )
opacity = lerp(q, 1, 0.2)
text_opacity = lerp(q, 0.3, 1)
// console.log(">", gray, opacity)
}
aa.image.style.WebkitFilter = "grayscale(" + gray + "%)"
aa.image.style.opacity = opacity
aa.text.style.opacity = text_opacity
},
margin: 0.3,
mouseup: function(e){
aa = app.archive.item
app.archive.row = null
app.archive.item = null
var was_flipped = aa.flipped
var flipped = aa.flipped ? (aa.q < app.archive.margin) : (aa.q > app.archive.margin)
var dest = was_flipped == flipped ? 0 : 1
$(aa.row).data('flipped', flipped)
oktween.add({
obj: {q: aa.q},
to: {q: dest},
duration: 200 * Math.abs(aa.q-dest),
update: function(o, dt){
app.archive.render(aa, o.q)
},
})
this.fix_z_index(aa)
},
fix_z_index: function (aa) {
if ( aa.flipped ) {
console.log(aa.q)
z = aa.q > app.archive.margin ? 2 : 1
zz = aa.q > app.archive.margin ? 1 : 2
}
else {
z = aa.q < app.archive.margin ? 2 : 1
zz = aa.q < app.archive.margin ? 1 : 2
}
aa.image.style.zIndex = z
aa.text.style.zIndex = zz
},
})