
try {


  function init() {
    app.chartaca = Chartaca.init({
      key:'39da16f0-7739-4335-8c5e-dc00628f2c5c',target:'web',endpoint:C.chartaca_endpoint,eventperiod:2
    })
    app.chartaca.fire('launch')

    checkin()


    if(bowser.msie && bowser.version <= 7 ) {
      $('#stockchart').hide()

      if( bowser.version <= 6 ) {
        $('#front_cat_list').css({height:27})
        $('#front_cat_list li').css({height:27})
        $('.front_subcat_list li').css({paddingBottom:15})
        $('div.front_feature').css({margin:0,padding:0})
        $('#front_featurecol').css({width:315})
      }
      else if( bowser.version == 7 ) {
        $('#front_cat_list').css({height:17})
        $('#front_cat_list li').css({height:40,paddingBottom:15})
        $('#front_subcatbar').css({height:17})
      }
    }


    // models do not know about views
    // so can be constructed first
    models.init()
    var m = app.model = {}

    m.user          = new models.User()
    m.formfactor    = new models.FormFactor()
    m.page          = new models.Page()
    m.articlestore  = new models.ArticleStore()
    m.similar       = new models.Similar()
    m.articlelayout = new models.ArticleLayout()
    m.overview      = new models.Overview()
    m.edition       = new models.Edition()

    m.articlestore.clear()

    m.user.load()

    app.layout = function() {
      if( app.layout.width === window.innerWidth ) {
        return;
      }

      app.layout.width = window.innerWidth

      /* DEL
         app.model.articlelayout.setFormFactor({
         w:window.innerWidth, h:window.innerHeight
         })
      */

      m.formfactor.setDim(window.innerWidth,window.innerHeight)

      //app.model.popover.show()
    }



    app.model.frontpage = new models.FrontPage()

    app.model.search = new models.Search()

    app.model.frontarticles = new models.FrontArticles()
    app.model.frontarticles.catmodel = app.model.frontpage






    views.init()
    var v = app.view = {}

    v.overview = new views.OverviewColumn()

    v.featurecol = new views.FeatureColumn({
      pagetype:{front:1,editions:1,search:1,login:1,register:1,accdet:1,article:1},
      prefix:'web'
    })
    v.featurecol.show()

    v.search = new views.WebSearch({
      catmodel:app.model.frontpage,
      pagetype:'search',
      name:'search'
    })


    var pagetypes = [
      {n:'editions'},
      {n:'purchase'},
      {n:'register'},
      {n:'login'},
      {n:'accdet'}
    ]

    pagetypes.forEach(function(pagetype){
      var name = pagetype.n
      if( !views.pagetype[name] ) return;

      v[name] = new views.pagetype[name]({
        prefix:'web',
        name:name
      })
      views.makepage( v[name] )
      views.pagebtn( $('#web_'+name+'_btn'), v[name] )
    })

    
    v.login.options.success = function() {
      location.href='/'
    }

    v.register.options.success = function() {
      location.href='/'
    }

    v.accdet.options.logout = function() {
      location.href='/'
    }


    // FIX move to triggers?
    util.onchange([
      { model: m.page, prop:'type', trigger:[
        { view:v.overview, method:'render' }
      ] }
    ])


    app.view.page = new views.Page({
      model:app.model.page
    })

    app.view.menu = new views.MenuView({
      formfactor:app.model.formfactor
    })


    app.view.header = new views.WebHeader()

    app.view.catbar = new views.CatBarView()


    app.view.frontarticles = new views.FrontArticlesView({
      listelem:'#frontarticles',
      itemelem:'#frontarticles_item',
      name:'frontarticles',
      model:app.model.frontarticles,
      maxcount:96,
      imgcode:'pdf',
      catmodel:app.model.frontpage,
      pagetype:'front',
      articlecustom:function(){
        return function() {
          //log('FA read')
          //app.admanager && app.admanager.show({area:'banner-Home'})
        }
      }
    })

    // FIX: make articlesview a Basic view
    app.model.page.bind('change:type',function(){
      var pagetype = app.model.page.get('type')
      if( 'front' != pagetype ) {
        app.view.frontarticles.hide()
      }
    })

    app.model.featurebar    = new models.FeatureBar()
    app.model.featurebar.load()
    app.view.featurebar = new views.FeatureBarView({
      listelem:'#featurebar_list',
      itemelem:'#featurebar_item',
      name:'featurebar',
      model:app.model.featurebar,
      imgcode:'phf',
      catmodel:app.model.frontpage,
      smallstar:true,
      omit:-1
    })


    app.model.featurebox = new models.FeatureBox()
    app.view.featurebox = new views.FeatureBox({
      listelem:'#featurebox',
      itemelem:'#featurebox_item',
      name:'featurebox',
      model:app.model.featurebox,
      maxchars: 111,
      imgcode:'phf',
      catmodel:app.model.frontpage
    })
    app.model.featurebox.load()
    app.model.edition.bind('change:code',function(){
      app.model.featurebox.load()
    })




    app.view.frontpage = app.frontpageview = new views.FrontPageView()


    // DEL var fftype = app.model.formfactor.get('type')


    app.view.usermenu = new views.UserMenuView()


    app.model.articlelayout.setFormFactor({
      w:window.innerWidth, h:window.innerHeight
    })

    app.view.articleview = app.articleview = new views.ClickArticleView({
      articlelayout:app.model.articlelayout,
      page:app.model.page
    })


    // FIX: this should not be here
    app.view.articleview.loadArticle = function( sid, cb ) {                                             
      app.model.articlestore.load(sid, function(article){
        cb(article)
        return;

        // FIX make async
        /*
          app.model.similar.query(sid, function()
          {
          cb(article);
          })
        */
      });
    }



    app.layout()

    app.submanager = new SubManager()
    
    $('p.subcat').live(C.tap,function(event){
      event.stopPropagation()
      var item = $(this)
      var subcat = item.text()
      var cat = item.attr('data-cat')
      //log('subcat: '+subcat+' cat: '+cat)
      if( cat ) {
        app.model.frontpage.set({cat:cat})
      }
      app.model.frontpage.set({subcat:subcat}).trigger('frontpage-subcat')
    })


    util.triggers(m,v,{
      search: {
        page: ["page/change:type"]
      },
      usermenu: {
        render: ['user/user-load'] 
      },
      frontpage: {
        reload: ['user/user-logout']
      },
      editions: {
        page: ["page/change:type"]
      },
      purchase: {
        page: ["page/change:type"]
      },
      register: {
        page: ["page/change:type"]
      },
      login: {
        page: ["page/change:type"]
      },
      accdet: {
        page: ["page/change:type"]
      },
      featurecol: {
        page: ["page/change:type"]
      },
      header: {
        render: ["edition/change:code"]
      },
      articleview: {
        page: ["page/change:type"]
      }
    })


    var domain_codemaps = {

      'old-www.businesspost.ie': {
        "banner-Agenda":             [{name:'banner-Agenda',code:'3.0/1090/3440995/0/225'}],               
        "banner-Comment":            [{name:'banner-Comment',code:'3.0/1090/3441001/0/225'}],              
        "banner-Commercial Reports": [{name:'banner-Commercial Reports',code:'3.0/1090/3441003/0/225'}],   
        "banner-Home":               [{name:'banner-Home',code:'3.0/1090/3441007/0/225'}],                 
        "banner-Living":             [{name:'banner-Living',code:'3.0/1090/3441008/0/225'}],               
        "banner-Markets":            [{name:'banner-Markets',code:'3.0/1090/3441011/0/225'}],              
        "banner-Personal Finance":   [{name:'banner-Personal Finance',code:'3.0/1090/3441013/0/225'}],     
        "banner-Property":           [{name:'banner-Property',code:'3.0/1090/3441014/0/225'}],             
        "banner-Small Business":     [{name:'banner-Small Business',code:'3.0/1090/3441016/0/225'}],       
        "banner-Technology":         [{name:'banner-Technology',code:'3.0/1090/3441021/0/225'}],           
        
        "frontmpu-Agenda":             [{name:'frontmpu-Agenda',code:'3.0/1090/3440996/0/170'}],             
        "frontmpu-Comment":            [{name:'frontmpu-Comment',code:'3.0/1090/3441000/0/170'}],            
        "frontmpu-Commercial Reports": [{name:'frontmpu-Commercial Reports',code:'3.0/1090/3441002/0/170'}], 
        "frontmpu-Home":               [{name:'frontmpu-Home',code:'3.0/1090/3441005/0/170'}],               
        "frontmpu-Living":             [{name:'frontmpu-Living',code:'3.0/1090/3441009/0/170'}],             
        "frontmpu-Markets":            [{name:'frontmpu-Markets',code:'3.0/1090/3441010/0/170'}],            
        "frontmpu-Personal Finance":   [{name:'frontmpu-Personal Finance',code:'3.0/1090/3441012/0/170'}],   
        "frontmpu-Property":           [{name:'frontmpu-Property',code:'3.0/1090/3441015/0/170'}],           
        "frontmpu-Small Business":     [{name:'frontmpu-Small Business',code:'3.0/1090/3441018/0/170'}],     
        "frontmpu-Technology":         [{name:'frontmpu-Technology',code:'3.0/1090/3441023/0/170'}]         
      },

      'www.businesspost.ie': {
        "banner-Agenda":             [{name:'banner-Agenda',code:'3.0/1090/3593812/0/225'}],
        "banner-Comment":            [{name:'banner-Comment',code:'3.0/1090/3593814/0/225'}], 
        "banner-Commercial Reports": [{name:'banner-Commercial Reports',code:'3.0/1090/3593816/0/225'}], 
        "banner-Home":               [{name:'banner-Home',code:'3.0/1090/3593818/0/225'}], 
        "banner-Living":             [{name:'banner-Living',code:'3.0/1090/3593819/0/225'}], 
        "banner-Markets":            [{name:'banner-Markets',code:'3.0/1090/3593821/0/225'}], 
        "banner-Personal Finance":   [{name:'banner-Personal Finance',code:'3.0/1090/3593823/0/225'}], 
        "banner-Property":           [{name:'banner-Property',code:'3.0/1090/3593825/0/225'}], 
        "banner-Small Business":     [{name:'banner-Small Business',code:'3.0/1090/3593829/0/225'}], 
        "banner-Technology":         [{name:'banner-Technology',code:'3.0/1090/3593831/0/225'}], 

        "banner-Home-Media And Marketing":       [{name:'banner-Home-Media And Marketing',code:'3.0/1090/3593839/0/225'}], 
        "banner-Living-Motoring":                [{name:'banner-Living-Motoring',code:'3.0/1090/3593833/0/225'}], 
        "banner-Small Business-Out On Your Own": [{name:'banner-Small Business-Out On Your Own',code:'3.0/1090/3593837/0/225'}], 
        "banner-Technology-Apps":                [{name:'banner-Technology-Apps',code:'3.0/1090/3593835/0/225'}], 


        "frontmpu-Agenda":             [{name:'frontmpu-Agenda',code:'3.0/1090/3593811/0/170'}],
        "frontmpu-Comment":            [{name:'frontmpu-Comment',code:'3.0/1090/3593813/0/170'}], 
        "frontmpu-Commercial Reports": [{name:'frontmpu-Commercial Reports',code:'3.0/1090/3593815/0/170'}],
        "frontmpu-Home":               [{name:'frontmpu-Home',code:'3.0/1090/3593817/0/170'}], 
        "frontmpu-Living":             [{name:'frontmpu-Living',code:'3.0/1090/3593820/0/170'}], 
        "frontmpu-Markets":            [{name:'frontmpu-Markets',code:'3.0/1090/3593822/0/170'}], 
        "frontmpu-Personal Finance":   [{name:'frontmpu-Personal Finance',code:'3.0/1090/3593824/0/170'}], 
        "frontmpu-Property":           [{name:'frontmpu-Property',code:'3.0/1090/3593826/0/170'}], 
        "frontmpu-Small Business":     [{name:'frontmpu-Small Business',code:'3.0/1090/3593830/0/170'}], 
        "frontmpu-Technology":         [{name:'frontmpu-Technology',code:'3.0/1090/3593832/0/170'}],

        "frontmpu-Home-Media And Marketing":       [{name:'frontmpu-Home-Media And Marketing',code:'3.0/1090/3593840/0/170'}], 
        "frontmpu-Living-Motoring":                [{name:'frontmpu-Living-Motoring',code:'3.0/1090/3593834/0/170'}], 
        "frontmpu-Small Business-Out On Your Own": [{name:'frontmpu-Small Business-Out On Your Own',code:'3.0/1090/3593838/0/170'}], 
        "frontmpu-Technology-Apps":                [{name:'frontmpu-Technology-Apps',code:'3.0/1090/3593836/0/170'}] 
      }
    }

    domain_codemaps['preview.thepost.ie'] = domain_codemaps['desktopweblive.thepost.ie']

    var codemap = domain_codemaps[domain] || domain_codemaps[C.defaultdomain]

    // for testing
    //codemap = domain_codemaps['desktopweblive.thepost.ie']
    //log('codemap',codemap)


    app.admanager = new AdManager({
      writeCapture:true,
      codemap:codemap,

      slotmap:{
        'banner-*':[$('#front_adtop_content')],
        'frontmpu-*':[$('#front_mpu_content')]
      },
      build:function(code) {
        if( 0 === code.name.indexOf('banner-') ) {
          return '<script src="http://ad.dc2.adtech.de/addyn/'+code.code+'/ADTECH;loc=100;target=_blank;grp='+(Math.round(Math.random() * 1000))+';misc='+new Date().getTime()+'"></script>';
        }
        else if( 0 === code.name.indexOf('frontmpu-') ) {
          return '<script language="javascript1.1" src="http://ad.dc2.adtech.de/addyn/'+code.code+'/ADTECH;loc=100;target=_blank;grp='+window.adgroupid+';misc='+new Date().getTime()+'"></script>';
        }
        else return null
      },
      postbuild:function() {
      }
    })


    function change_cat() {
      var cat = app.model.frontpage.get('cat')
      var subcat = app.model.frontpage.get('subcat')

      var target = cat

      var specialsubcat = {'Media And Marketing':1,'Motoring':1,'Out On Your Own':1,'Apps':1}[subcat]
      //log('ssc',subcat,specialsubcat)
      if( specialsubcat ) {
        target = cat+"-"+subcat
        if( !codemap['banner-'+target] ) {
          target = cat
        }
      }

      app.admanager.show([{area:'banner-'+target},{area:'frontmpu-'+target}])      

      if( subcat ) {
        app.chartaca.fire('subcat:'+cat+':'+subcat)
      }
      else {
        app.chartaca.fire('cat:'+cat)
      }
    }
    app.model.frontpage.bind('frontpage-cat',change_cat)
    app.model.frontpage.bind('frontpage-subcat',change_cat)

    
    app.model.page.bind('change:type',function(ev,val){
      app.chartaca.fire('page:'+val)
    })




    var Router = Backbone.Router.extend({
      routes: {
        "": "front",
        "!page/:page": "page",
        "!story/:cat/:subcat/:title/id/:article": "story",
        "!story/:cat/:subcat/:title/:article": "story",
        "!article/:article": "article",
        "!cat/:cat": "cat",
        "!subcat/:cat/:subcat": "subcat",
        "!search/:terms": "search",
        "!editions/:select": "editions",
        "!edition/:code": "edition_code",
        "!purchase": "purchase",
        "!purchased/:edition/:article": "purchased",
        "!purchase-cancelled/:code": "purchase_cancelled",
        "!purchase-proceed/:spec/:time": "purchase_proceed",

        "!accdet":"accdet",
        "!accdet/reset":"accdet_reset",

        "!:pagetype": "pagetype",
        ":what": "front"
      },

      front: function() {
        app.model.page.set({type:'front'})
        app.model.frontpage.set({subcat:'',cat:'Home'})
        app.view.frontpage.trigger('frontpage-render')
        //app.admanager.showafter(1)
        change_cat()
      },

      page: function(page) {
        app.model.page.set({type:'page',page:page})
        app.view.frontpage.trigger('frontpage-render')
        //app.admanager.showafter(1)
        change_cat()
      },

      story: function(cat,subcat,title,artid) {
        app.router.article(artid,cat,subcat)
        //app.admanager.showafter(1)
        change_cat()
      },

      article: function(artid,cat,subcat) {
        var catok    =  ( cat && '' !== cat )
        var subcatok =  ( subcat && '' !== subcat )

        if( subcatok && catok ) {
          app.model.frontpage.set({subcat:subcat,cat:cat})
        }

        app.model.page.set({artid:artid})
        app.model.page.set({type:'article'})
        app.view.frontpage.trigger('frontpage-render')
        app.articleview.render()

        //app.admanager.showafter(1)
        change_cat()
      },

      cat: function(cat) {
        var catok =  ( cat && '' !== cat )
        if( catok ) {
          app.model.frontpage.set({subcat:'',cat:cat})
          app.model.page.set({type:'front'})
          app.view.frontpage.trigger('frontpage-render')
          app.view.frontpage.trigger('frontpage-cat')

          //app.admanager.showafter(1)
          change_cat()
        }
      },

      subcat: function(cat,subcat) {
        var catok    =  ( cat && '' !== cat )
        var subcatok =  ( subcat && '' !== subcat )

        if( subcatok && catok ) {
          app.model.frontpage.set({subcat:subcat,cat:cat})
          app.model.page.set({type:'front'})
          app.view.frontpage.trigger('frontpage-render')
          app.view.frontpage.trigger('frontpage-subcat')

          //app.admanager.showafter(1)
          change_cat()
        }
      },

      search: function(terms) {
        var termsok    =  ( terms && '' !== terms )
        if( termsok ) {
          app.model.page.set({type:'search'})
          app.view.search.query(terms)
          app.view.frontpage.trigger('frontpage-render')

          //app.admanager.showafter(1)
          change_cat()
        }
      },

      edition_code: function(code) {
        var codeok    =  ( code && '' !== code )
        //log('edition_code',code,codeok)
        if( codeok ) {
          app.model.edition.set({code:code})
          app.model.frontpage.set({cat:'Home'})
          app.model.frontpage.set({subcat:'News'})
          app.model.page.set({type:'front'})
          app.view.frontpage.trigger('frontpage-render')

          //app.admanager.showafter(1)
          change_cat()
        }
      },

      purchased: function(edition,artid) {
        var auth = app.model.user.get('auth')

        function show_purchase() {
          //log('show_purchase',edition,artid)
          app.model.page.set({purchase_complete:true})
          app.model.edition.set({code:edition})
          if( 'show'!=artid ) {
            app.router.article(artid)
          }
          else {
            app.router.edition_code(edition)
          }
        }

        if( !auth ) {
          app.model.user.load(function(auth){
            if( !auth ) {
              app.model.page.set({type:'login'})
              app.view.frontpage.trigger('frontpage-render')
            }
            else show_purchase()
          })
        }
        else show_purchase()

        app.admanager.showafter(1)
      },

      purchase: function() {
        store.set('purchase',null)
        app.model.page.set({type:'purchase'})
        app.view.frontpage.trigger('frontpage-render')
        app.admanager.showafter(1)
      },

      purchase_cancelled: function(code) {
        app.model.page.set({purchase_status:'cancelled'})
        app.model.page.set({purchase_code:code})
        app.model.page.set({type:'purchase'})
        app.view.frontpage.trigger('frontpage-render')
        app.admanager.showafter(1)
      },

      purchase_proceed: function(spec) {
        util.hide($('#main'))
        spec = JSON.parse(spec)
        //log(spec)
        app.submanager.subscribe(spec) 
        app.admanager.showafter(1)
      },

      pagetype: function(pagetype) {
        app.model.page.set({type:pagetype})
        app.view.frontpage.trigger('frontpage-render')
        app.admanager.showafter(1)
      },

      accdet: function() {
        app.model.user.load(function(user){
          app.model.page.set({type:'accdet'})
          app.view.frontpage.trigger('frontpage-render')
        })
        app.admanager.showafter(1)
      },

      accdet_reset: function() {
        app.model.user.load(function(){
          app.model.page.set({type:'accdet'})
          app.view.frontpage.trigger('frontpage-render')
        })
        app.admanager.showafter(1)
      },

      editions: function(select) {
        app.model.page.set({editions_select:select})
        app.model.page.set({type:'editions'})
        app.view.frontpage.trigger('frontpage-render')
        app.admanager.showafter(1)
      }

    })

    app.router = new Router()
    Backbone.history.start({pushState: false})

    app.model.page.start()
    app.initdone = true
    app.debug.post_start()
  }


}
catch( e ) {
  log('error',e)
}


