// Gaia Ajax Copyright (C) 2008 - 2009 Gaiaware AS. details at http://gaiaware.net/

/* 
 * Gaia Ajax - Ajax Control Library for ASP.NET
 * Copyright (C) 2008 - 2009 Gaiaware AS
 * All rights reserved.
 * This program is distributed under either GPL version 3 
 * as published by the Free Software Foundation or the
 * Gaia Commercial License version 1 as published by
 * Gaiaware AS
 * read the details at http://gaiaware.net
 */
 
/* ---------------------------------------------------------------------------
   Gaia Calendar Javascript file
   --------------------------------------------------------------------------- */

if( !Gaia.Extensions )
  Gaia.Extensions = Class.create();


Gaia.Extensions.Calendar = Class.create(Gaia.Control, {
  

  // "Constructor"
  initialize: function(element, options){
    this.initializeCalendar(element, options);
  },
  

  initializeCalendar: function(element, options){
    this.initializeControl(element, options);
    
    this.options.className = options.className;
    
    // wires up the click handlers for the days
    this._addDayEvents();
    
    // wire up the click handlers for month/year and navigation
    this._addMonthYearNavigationEvents();
  },
  

  _previousYearClick: function(btn){
     //todo: BAD logic, created in a hurry - should be replaced by server-side functionality
     for (var i=2; i< 13; i++){
        if (i != 7 ){
           var yearButton = $(this.element.id + '_year_' + i);
           var oldValue = parseInt(yearButton.innerHTML);
           yearButton.innerHTML = oldValue-4;
        }
     }
  },
  

  _nextYearClick: function(btn){
     //todo: BAD logic, created in a hurry - should be replaced by server-side functionality
     for (var i=2; i< 13; i++){
        if (i != 7 ){
           var yearButton = $(this.element.id + '_year_' + i);
           var oldValue = parseInt(yearButton.innerHTML);
           yearButton.innerHTML = oldValue+4;
        }
     }
  },


  onMonthClick: function(btn){
    var splits = btn.id.split('_month_');
    var id = splits[splits.length - 1];
    
    Gaia.Control.callControlMethod.bind(this)('MonthClicked', [id], 
    function(retVal){  
      if (retVal == 'false'){   // if retVal == true, the content is redrawn and updating styles is not required
         for(var i=1;i<13;i++){
           this._setStyle('_month_td_' + i, '-calendar-ympicker-selected', false);
         }
         this._setStyle('_month_td_' + id, '-calendar-ympicker-selected', true);
         
      }
    }.bind(this), 
    this.element.id);
    
  },
  

  onDayClick: function(btn){
    var splits = btn.id.split('_');
    var id = splits[splits.length - 1];
     
    // Calling server to set the selected Day clicked
    Gaia.Control.callControlMethod.bind(this)('DayClicked', [id], 
    function(retVal){  
      if (retVal == 'false'){ 
          for(var i=0;i<42;i++){
            this._setStyle('_td_' + i, '-calendar-selected', false);
          }          
          this._setStyle('_td_' + id, '-calendar-selected', true);
      }
    }.bind(this), 
    this.element.id);
  },
  

  onYearClick: function(btn){
    var splits = btn.id.split('_year_');
    var id = splits[splits.length - 1];
    var yearValue = btn.innerHTML; // retrieves the year
    
    Gaia.Control.callControlMethod.bind(this)('YearClicked', [yearValue], 
    function(retVal){  
      if (retVal == 'false'){   // if retVal == true, the content is redrawn and updating styles is not required
         for(var i=0;i<13;++i){
           this._setStyle('_year_td_' + i, '-calendar-ympicker-selected', false);
         }
         this._setStyle('_year_td_' + id, '-calendar-ympicker-selected', true);         
      }
    }.bind(this), 
    this.element.id);
  },
  

  setInnerContent: function(value){

     // since the day surface is re-rendered, we remove the existing event handlers
     this._removeDayEvents();

     // updates the days from the server and renders them.
     var innerCell = $(this.element.id + "_date-inner");
     innerCell.innerHTML = value;

     // wire up the events again for the new items
     this._addDayEvents();
     return this;
  },


  // add the day-click events
  _addDayEvents: function(){
    this.arrayOfDayClickEvents = new Array();
    for (var i=0; i<42; i++){
       var dayButton = $(this.element.id + '_' + i);
       this.arrayOfDayClickEvents[i] = this.onDayClick.bind(this, dayButton);
       Element.observe(dayButton, 'click', this.arrayOfDayClickEvents[i]);
    }
  },


  // remove the day-click events
  _removeDayEvents : function(){
     for (var i=0; i<42; i++){
       if (this.arrayOfDayClickEvents[i]){
         var dayButton = $(this.element.id + '_' + i);
         Element.stopObserving(dayButton, 'click', this.arrayOfDayClickEvents[i]);
       }
     }
  },


  _addMonthYearNavigationEvents : function(){
     
     // attach event handlers for the month buttons in the month and year picker
    this.arrayOfMonthObservers = new Array();
    for(var i=1; i< 13; i++){
       var monthButton = $(this.element.id + '_month_' + i);
       this.arrayOfMonthObservers[i] = this.onMonthClick.bind(this, monthButton);
       Element.observe(monthButton, 'click', this.arrayOfMonthObservers[i]);
    }
    
    // attach event handlers for the year buttons in the month and year picker
    this.arrayOfYearObservers = new Array();
    for (var i=2; i< 13; i++){
        if (i != 7 ){ // cell 1 and 7 contains the previous/next year buttons
           var yearButton = $(this.element.id + '_year_' + i);
           this.arrayOfYearObservers[i] = this.onYearClick.bind(this, yearButton);
           Element.observe(yearButton, 'click', this.arrayOfYearObservers[i]);
        }
     }
    
    var prevYear = $(this.element.id + '_year_prev');
    this.onPreviousYearClick = this._previousYearClick.bind(this, prevYear);
    Element.observe(prevYear, 'click', this.onPreviousYearClick);
    
    var nextYear = $(this.element.id + '_year_next');
    this.onNextYearClick = this._nextYearClick.bind(this, nextYear);
    Element.observe(nextYear, 'click', this.onNextYearClick);
  },


  _removeMonthYearNavigationEvents: function(){
    
    // remove event handlers for month observers
    for(var i=1; i< 13; i++){
       if (this.arrayOfMonthObservers[i]){
         var monthButton = $(this.element.id + '_month_' + i);
         Element.stopObserving(monthButton, 'click', this.arrayOfMonthObservers[i]);
       }
    }
    
    // remove event handlers for day observers
    for (var i=2; i< 13; i++){
        if (i != 7 ){ // cell 1 and 7 contains the previous/next year buttons
          if (this.arrayOfYearObservers[i]){
            var yearButton = $(this.element.id + '_year_' + i);
            Element.stopObserving(yearButton, 'click', this.arrayOfYearObservers[i]);
          }
        }
     }
    
    // remove event handlers for next/previous month navigation
    if (this.onPreviousYearClick){
      var prevYear = $(this.element.id + '_year_prev');
      Element.stopObserving(prevYear, 'click', this.onPreviousYearClick);
    }
    
    if (this.onPreviousYearClick){
      var nextYear = $(this.element.id + '_year_next');
      Element.stopObserving(nextYear, 'click', this.onNextYearClick);
    }
  },


  // helper function to add/remove classes based on calendar state. 
  _setStyle: function(additionalId, additionalClassName, addClasses) {
    if (this.element){
      var el = $(this.element.id + additionalId);
      if ( el ) {
        if (addClasses){
          Element.addClassName(el, this.options.className + additionalClassName);
        }
        else{
          Element.removeClassName(el, this.options.className + additionalClassName);
        }
      }
    }
  },


  destroy : function(){
    
    // remove event handlers 
    this._removeMonthYearNavigationEvents();
    this._removeDayEvents();
  
    //call base destroy
    this._destroyImpl();
  }
});

Gaia.Extensions.Calendar.browserFinishedLoading = true;
