[v2] mini tutorial

/* this code can & should be written differently
   it is just to give you some idea 
   how to play with V2 */

// use kitchen-sink
// var app=new Framework7();
var obj={
  params:{
    r:app.views.current.router,
    minPages:0,
    maxPages:1000000,
    path:'/prefix-',
    title:'title ',
    block:'content ',
    firstPageBack:'index',
    lastPageText:'last page',
    nextTimeout:1000,
    cssClass:'.page-content'
  },
  methods:{
    get:function(k,i){
      return obj.params[k]+i;
    },
    now:function(){
      return new Date();
    }
  },
  tmpl:{
    cm:{
    },
    tm:{
      block:'<div class="block" style="text-align:center;">\
               {{block}}\
               <br>\
              {{subtitle}}\
             </div>',
      page:'<div class="page">\
              <div class="navbar">\
                <div class="navbar-inner sliding">\
                  <div class="left">\
                     <a href="#" class="link back">\
                       <i class="icon icon-back"></i>\
                       <span class="ios-only">{{back}}</span>\
                     </a>\
                  </div>\
                  <div class="title">{{title}}\
                    <div class="subtitle">{{subtitle}}</div>\
                  </div>\
                </div>\
              </div>\
              <div class="page-content"></div>\
            </div>'   
    },
    compile:function(){
      for(k in this.tm){
        this.cm[k]=Template7.compile(this.tm[k]);
      }
    }
  },
  init:function(){
    this.tmpl.compile();
    var r=this.params.r;
    app.utils.extend(r,{
      routes:[],
      params:{
        stackPages:true,
        animateWithJS:true
      }
    });
    for(var i=this.params.minPages;i<this.params.maxPages;i++){
      r.routes.push({
        id:i,
        path:obj.methods.get('path',i),
        title:obj.methods.get('title',i+1),
        block:obj.methods.get('block',i+1),
        template:obj.tmpl.cm.page,
        once:{
          pageMounted:function(e,page){
            var pageContext=page.route.context;
            var pageContainer=page.$pageEl;
            pageContainer.find(obj.params.cssClass).html(
              obj.tmpl.cm.block(pageContext)
            );
          },
          pageInit:function(e,page){
            var pageContext=page.route.context;
            var pageContainer=page.$pageEl;
            var next=r.routes[pageContext.id+1];
            if (!next) {
              pageContainer.find(obj.params.cssClass).html(
                obj.tmpl.cm.block(
                  app.utils.extend(pageContext,{
                    block:obj.params.lastPageText
                  })
                )
              );
              return;
            }
            setTimeout(function(){
              var context={
                id:next.id,
                title:next.title,
                subtitle:obj.methods.now,
                back:pageContext.title,
                block:next.block
              };
              page.view.router.navigate(
                next.path,{context:context,route:{context:context}}
              );
            },obj.params.nextTimeout);
          }
        }
      });
    }
    var next=r.routes[this.params.minPages];
    var context={
      id:next.id,
      title:next.title,
      subtitle:this.methods.now,
      back:this.params.firstPageBack,
      block:next.block
    };
    r.navigate(next.path,{context:context,route:{context:context}});
  }
};
obj.init();

What does this code do?