// 
//  application.js
// 
//  JavaScript funcionalita pro Akropolis web. Pri rozsirovani webu ROZSIRUJTE TENTO SOUBOR 
//  s vyuzitim namespaces a konvenci, ktere zde vidite.

if ("undefined" == typeof console) var console = { log : function(what) {} }

// * Add initialize() handler
document.observe("dom:loaded", function() { try {Application.initialize()} catch(e) { alert('Error when initializing application! \n' + e); } });


Application = {
  
  initialize: function(options) {
    
    this.options = options
    this.window = document.viewport.getDimensions()
    
    Application.Page.addInfoPanelHandler()
    
    // console.log(this); // # Debug
  },
  
  // Pouzivame v Ajax callbacks
  loading : function() {
    $('container').addClassName('loading')
  },
  loaded : function() {
    $('container').removeClassName('loading')
  },
  
  redirect_to : function(url) {
    document.location.href=url; return false;
  },
  
  Page : {
    
    addInfoPanelHandler : function() {
      var o = $('info_panel')
      if (o) { new Effect.Fade(o, {duration:1.5,delay:3}) }
    }
    
  },
  
  Homepage : {
    
    initialize : function() {
      this.addLinkToDayHandlers()
      this.addHpTipHandlers()
    },
    
    // Handler pro bily prouzek
    addLinkToDayHandlers : function() {
      $$('.link_to_day').invoke( 'observe', 'mouseover', function(event){ Application.Homepage.showProgramforDay(event.element()) }  )
    },
    
    addHpTipHandlers : function() {
      var o = $('hpTip')
      if (o) {
        o.observe('mouseup',
            function(event) {
              // console.log(o.select('a').first().href)
              // console.log(event.element().tagName)
              if (event.element.tagName && event.element.tagName.toLowerCase() != 'a') { 
                Application.redirect_to( o.select('a').first().href )
                Event.stop(event)
              }
            } )
      }
    },
    
    // Skryje akce v bilem prouzku
    hideHpDatesToday : function() {
      var boxes = $$('.hpDatesToday')
      boxes.without( boxes.first() ).invoke('hide')
    },
    
    // Ukaze akce pro den v bilem prouzku
    showProgramforDay : function(link_to_day) {
      var day_info_box = $( 'day_info_' + link_to_day.identify().split('___').last() )
      // console.log(link_to_day)
      // console.log(day_info_box)
      if (day_info_box) {
        $$('.hpDatesDay.active').invoke('removeClassName', 'active')                  // De-activate previous link
        link_to_day.up().addClassName('active')                                       // Activate this link
        $$('.hpDatesToday.active').invoke('removeClassName', 'active').invoke('hide') // Hide previous info
        $(day_info_box).show().addClassName('active')                                 // Show info for this day
      }
    },
    
    // Ajax loading/loaded indikace
    showTipLoading : function() {
      Application.loading()                                                         // Loading state
      $('hpTipNavigation').select('span').first().replace('načítám data &hellip;')  // Nahrad odkaz
    },
    showTipLoaded : function() {
      Application.loaded()
    },
    
    // Posune sipku ukazujici na "tip" akci na urcitou pozici
    moveTipArrow : function(position) {
      // $('tipArrow').setStyle({marginLeft:position+'px'})
      // new Effect.Morph('tipArrow', {style:'margin-left:'+position+'px',duration:0.5})
      var arrow = $('tipArrow')
      if (arrow) {
        arrow.setStyle({marginLeft:'0px'})
        new Effect.Move('tipArrow', {x:position, mode:'absolute'})
        new Effect.Move('tipArrowTop', {x:position, mode:'absolute'})
        // TODO : Barvy musi odpovidat aktualnimu tematu (viz scheme-1.css), prevest do konstant vypsanych v application.html.erb
        // starcolor je barva#4, endcolor je barva#2 
        new Effect.Highlight('hpTip', {startcolor:'#8f7ebb', endcolor:'#583f99'})
      }
    },
    
    // Nastavi urcity den v horni rade jako "tip"
    setVisibleTip : function(date_time) {
      $$('.hpDatesDay.visibleTip').invoke('removeClassName', 'visibleTip')
      if($('day_'+date_time)) $('day_'+date_time).addClassName('visibleTip')
    }
    
  }, // end Homepage
  
  Program : {
    
    // Vychozi nastaveni zobrazeni boxu
    default_display_options : Object( { big_hall : 'on', small_hall : 'on', annotations : 'on' /*, pictures : 'on' */ } ),
    // Uzivatelske nastaveni zobrazeni boxu
    display_options : {},
    
    // Mapovani ID checkboxu na tridy v .programItems
    map_class_names : { big_hall:'head', small_hall:'small', annotations:'perex', pictures:'image' },
    
    // Vychozi nastaveni zobrazeni
    setDefaultDisplayOptions : function() {
      //console.log('setDefaultDisplayOptions')
      this.display_options = this.default_display_options
      this.initializeCheckboxesAndContainer()
      // createCookie('program_display_options', Object.toJSON(this.default_display_options))
      Cookie.set('program_display_options', Object.toJSON(this.default_display_options, 2592000))
    },
    
    // Nastavi checkboxy ve formulari 'program_display_options'
    initializeProgramDisplayOptions : function() {
      // Read options
      // var options = readCookie('program_display_options')
      var options = Cookie.get('program_display_options')
      //console.log(options)
      if (null == options) { this.setDefaultDisplayOptions(); return; } // RETURN pokud neni cookie --> setDefault
      // Write options
      this.display_options = options.evalJSON()
      //console.log(this.display_options)
      this.initializeCheckboxesAndContainer()
    },
    
    // Pridej handlery a nastav stav checkboxu
    initializeCheckboxesAndContainer : function() {
      $('program_display_options').getInputs().invoke( 'observe', 'click', function(event) {
         Application.Program.toggleDisplay(event.element()) } ).each( 
         function(n) { Object.keys( Application.Program.display_options ).include(n.name) ? n.checked = true : n.checked = false }
         )
      var container = $('programContent')
       $A( $('program_display_options') ).each( 
           function(n) { 
             if (n.checked) 
                   { if (container) container.addClassName(n.name) } 
             else 
                   { if (container) container.removeClassName(n.name) }
           } 
       )
    },
    
    // Stav daneho boxu s programem dne
    initializeProgramItem : function(item) {
      var item = $(item)
      if ( "undefined" == typeof item ) return
      if (Application.Utils.isIE6()) return
      if (this.display_options.big_hall    != 'on') { item.select('.head'). first().hide() }
      if (this.display_options.small_hall  != 'on') { item.select('.small').first().hide() }
      if (this.display_options.annotations != 'on') { item.select('.perex').first().hide() }
      if (this.display_options.pictures    != 'on') { item.select('.image').first().hide() }
    },
    
    // Prepinani zobrazeni boxu, ulozeni do cookie
    toggleDisplay : function(element) {
      //console.log(element.name)
      $A( $('program_display_options') ).each( 
          function(n) { 
            //console.log(n.name + ':' + n.checked)
            if (n.checked) { $('programContent').addClassName(n.name) } else { $('programContent').removeClassName(n.name) }
          } 
      ) 
      $$('#programContent .programItem .'+this.map_class_names[element.name]).
        each( function(n) { n.visible() ? new Effect.Fade(n) : new Effect.Appear(n) } )
      Cookie.set('program_display_options', Object.toJSON( $('program_display_options').serialize('true') ), 2592000)
      
    },
        
    // Prida handler onclick => jdi na stranku s programem dne na cely box
    // DEPRECATED
    addProgramItemHandlers : function() {
      return
      $$('.programItem').
        // invoke( 'observe', 'mouseover', function(event) { event.element().addClassName('active')} ).
        // invoke( 'observe', 'mouseout',  function(event) { event.element().removeClassName('active')} ).
        invoke( 'observe', 'mouseup',   function(event) {
          var ancestors = event.element().ancestors().first().select('p.day a')
          if ( event.element().tagName.toLowerCase() == 'a' || 'undefined' == typeof ancestors.first() ) return
          // console.log(a)
          Application.redirect_to( ancestors.first().href ) } )
    },
    
    showBiggerPhoto : function(options) {
      var options = options || {}
      $$('#photo img').first().src = options['src']
      if ( o = $$('#photoCredits span.title').first() )  o.update( options['title'] )
      if ( o = $$('#photoCredits span.author').first() ) o.update( options['author'] )
    },

    togglePriceHelp : function(id) {
      var o = $(id)
      if (o) { o.toggle() }
      return false
    }
    
  },
  
  Sifr : {
    
    // Inicializace Sifru
    // Viz soubor javascripts/sifr-config.js
    initialize : function() { sifr_initialize() }
    
  }, // end Sifr
  
  Utils : {
        
    isIE6 : function() { 
      return navigator.appVersion.include('MSIE 6');  
    }
    
  }

} // end Application
