
var Picker=new Class({Implements:[Options,Events],options:{container:'mooPCal',leftImgURL:'/thomascookstyle/assets/global/left.png',rightImgURL:'/thomascookstyle/assets/global/right.png',leftFadedImgURL:'/thomascookstyle/assets/global/left-faded.png',rightFadedImgURL:'/thomascookstyle/assets/global/right-faded.png',daySelect:'departureDay',monthSelect:'departureMonthYear',showButton:'showcal',hiddenClass:'hidden',rangeStart:'',rangeEnd:''},initialize:function(options){this.setOptions(options);this.extendDate();this.days=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];this.months=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];this.daysInMonth=30;this.today=new Date();this.calDate=new Date();this.rangeStart=new Date.parse(this.options.rangeStart);this.rangeEnd=new Date.parse(this.options.rangeEnd);this.startingOffset=0;this.viewStartDate=new Date();this.viewEndDate=new Date();this.setCalParams();this.startup();this.showMonth();this.fillFromFields()},setDaysInMonth:function(month,year){var daysInMonths=[31,28,31,30,31,30,31,31,30,31,30,31];if(new Date(year,1,29).getDate()==29){daysInMonths[1]=29}this.daysInMonth=daysInMonths[month]},setStartingOffset:function(month,year){this.startingOffset=new Date(year,month,1).getDay()},setDate:function(day){this.calDate.setDate(day)},setCalParams:function(){this.setDaysInMonth(this.calDate.getMonth(),this.calDate.getFullYear());this.setStartingOffset(this.calDate.getMonth(),this.calDate.getFullYear())},startup:function(){if(!$(this.options.container).hasClass(this.options.hiddenClass)){$(this.options.container).addClass(this.options.hiddenClass)}$(this.options.showButton).addEvent('click',function(){$(this.options.container).toggleClass(this.options.hiddenClass)}.bind(this))},showControlsRow:function(calTitle){var controlsTR=new Element('tr',{'class':'trcontrols'});var prevcalTH,prevcalIMG,prevcalA;if(this.calDate<=this.today){prevcalTH=new Element('th',{'class':'prevcal'}).inject(controlsTR);prevcalIMG=new Element('img',{'class':'png','src':this.options.leftFadedImgURL}).inject(prevcalTH)}else{prevcalTH=new Element('th',{'class':'prevcal'}).inject(controlsTR);prevcalA=new Element('a',{'href':'javascript:void(0)'}).inject(prevcalTH);prevcalIMG=new Element('img',{'class':'png','src':this.options.leftImgURL}).inject(prevcalA);prevcalA.addEvent('click',function(){this.showPrevMonth()}.bind(this))}var titleTH=new Element('th',{'class':'headercal','colspan':'5','html':calTitle}).inject(controlsTR);var nextcalTH,nextcalIMG,nextcalA;if((this.calDate.getMonth()==this.rangeEnd.getMonth())&&(this.calDate.getFullYear()==this.rangeEnd.getFullYear())){nextcalTH=new Element('th',{'class':'nextcal'}).inject(controlsTR);nextcalIMG=new Element('img',{'class':'png','src':this.options.rightFadedImgURL}).inject(nextcalTH)}else{nextcalTH=new Element('th',{'class':'nextcal'}).inject(controlsTR);nextcalA=new Element('a',{'href':'javascript:void(0)'}).inject(nextcalTH);nextcalIMG=new Element('img',{'class':'png','src':this.options.rightImgURL}).inject(nextcalA);nextcalA.addEvent('click',function(){this.showNextMonth()}.bind(this))}return controlsTR},showDowRow:function(dow){var dowrowTR=new Element('tr',{'class':'dowrow'});this.days.each(function(day){new Element('th',{'scope':'col','text':day.substr(0,1)}).inject(dowrowTR)});return dowrowTR},showNextMonth:function(){this.calDate.nextMonth();this.setCalParams();this.showMonth()},showPrevMonth:function(){this.calDate.prevMonth();this.setCalParams();this.showMonth()},showMonth:function(){$(this.options.container).set('html','');var table=new Element('table',{'class':'moocal'});var thead=new Element('thead').inject(table);var tbody=new Element('tbody').inject(table);this.showControlsRow(this.months[this.calDate.getMonth()]+' '+this.calDate.getFullYear()).inject(thead);this.showDowRow().inject(thead);var calDone=false;for(var i=0;i<6;i++){if(calDone){break}var weekrowTR=new Element('tr',{'class':'monthweek'}).inject(tbody);for(var j=0;j<7;j++){var day=((j+1)+(i*7))-this.startingOffset;var td=new Element('td',{'class':'monthday','id':'day'+day}).inject(weekrowTR);if(day>0&&day<=this.daysInMonth){td.set({events:{'mouseover':function(){this.addClass('hover')},'mouseout':function(){this.removeClass('hover')},'click':function(){$$('td.selected').removeClass('selected');this.addClass('selected')}}});td.addEvent('click',function(e){this.setDate(e.target.retrieve('date'));this.fillToFields()}.bind(this));var el=new Element('span',{'class':'date','text':day}).store('date',day).inject(td);td.store('date',day);if((day==this.today.getDate())&&(this.calDate.getMonth()==this.today.getMonth())){td.addClass('selected')}if(day==this.daysInMonth){calDone=true}}else{td.set('html','&nbsp;')}}}table.inject($(this.options.container));var hr=new Element('hr').inject($(this.options.container));this.fillToFields();this.viewStartDate.setTime(this.calDate.valueOf());this.viewStartDate.setDate(1);this.viewEndDate.setTime(this.calDate.valueOf());this.viewEndDate.setDate(this.daysInMonth);this.viewStartDate.clearTime();this.viewEndDate.endOfDay()},fillFromFields:function(){var dayf=$(this.options.daySelect);var monthf=$(this.options.monthSelect);monthf.addEvent('change',function(){year=parseInt(monthf.value.substr(3,6),10);month=parseInt(monthf.value.substr(0,2)-1,10);day=parseInt(dayf.value.substr(0,2),10);this.calDate.setFullYear(year);this.calDate.setMonth(month);this.calDate.setDate(day);this.setCalParams();this.showMonth();$$('td.monthday').removeClass('selected');$$('td#day'+day).addClass('selected')}.bind(this));dayf.addEvent('change',function(){year=parseInt(monthf.value.substr(3,6),10);month=parseInt(monthf.value.substr(0,2)-1,10);day=parseInt(dayf.value.substr(0,2),10);this.calDate.setFullYear(year);this.calDate.setMonth(month);this.calDate.setDate(day);this.setCalParams();this.showMonth();$$('td.monthday').removeClass('selected');$$('td#day'+day).addClass('selected')}.bind(this))},fillToFields:function(){var month,day;var dayf=$(this.options.daySelect);dayf.empty();this.daysInMonth.each(function(day,i){day=day+1;if(day<10){day='0'+day}new Element('option',{'value':day,'text':day}).inject(dayf)});var monthf=$(this.options.monthSelect);day=this.calDate.getDate();if(day<10){day='0'+day}dayf.value=day;month=this.calDate.getMonth()+1;if(month<10){month='0'+month}month=month+'-'+this.calDate.getFullYear();monthf.value=month},extendDate:function(){function prevMonth(){var thisMonth=this.getMonth();this.setMonth(thisMonth-1);if(this.getMonth()!=thisMonth-1&&(this.getMonth()!=11||(thisMonth==11&&this.getDate()==1))){this.setDate(0)}}function nextMonth(){var thisMonth=this.getMonth();this.setMonth(thisMonth+1);if(this.getMonth()!==thisMonth+1&&this.getMonth()!==0){this.setDate(0)}}function endOfDay(){this.setHours(23);this.setMinutes(59);this.setSeconds(59);this.setMilliseconds(999)}function getMDay(){if(this.getDay()===0){return 6}else{return this.getDay()-1}}function ymd(){return this.format('%Y-%m-%d')}function thTime(){var ampm=this.format('%p').toLowerCase();return this.format('%I:%M'+ampm)}Date.prototype.nextMonth=nextMonth;Date.prototype.prevMonth=prevMonth;Date.prototype.endOfDay=endOfDay;Date.prototype.getMDay=getMDay;Date.prototype.ymd=ymd;Date.prototype.thTime=thTime}});
var Picker = new Class({
  Implements: [Options, Events],
  options: {
    container: 'mooPCal',
    leftImgURL: systemContentPath + 'assets/global/left.png',
    rightImgURL: systemContentPath + 'assets/global/right.png',
    leftFadedImgURL: systemContentPath + 'assets/global/left-faded.png',
    rightFadedImgURL: systemContentPath + 'assets/global/right-faded.png',
    daySelect: 'departureDay',
    monthSelect: 'departureMonthYear',
    showButton: 'showcal',
    hiddenClass: 'hidden',
    rangeStart: '',
    rangeEnd: ''
  },
  initialize: function(options){
    this.setOptions(options);
    this.extendDate();
    this.days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    this.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    this.daysInMonth = 30;
    this.today = new Date();
    this.calDate = new Date();
    this.rangeStart = new Date.parse(this.options.rangeStart);
    this.rangeEnd = new Date.parse(this.options.rangeEnd);
    this.startingOffset = 0;
    this.viewStartDate = new Date();
    this.viewEndDate = new Date();

    var monthf = $(this.options.monthSelect);
    var dayf = $(this.options.daySelect);
    this.calDate.setFullYear(parseInt(monthf.value.substr(3,6)));
    this.calDate.setMonth(parseInt( monthf.value.substr(0,1) == "0" ? monthf.value.substr(1,2) : monthf.value.substr(0,2)) -1);
    this.calDate.setDate(parseInt(dayf.value.substr(0,1) == "0" ? dayf.value.substr(1,2) : dayf.value.substr(0,2)));

    this.setCalParams();
    this.startup();
    this.showMonth();
    this.fillFromFields();
  },
  setDaysInMonth: function(month, year){
    var daysInMonths = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    if(new Date(year,1,29).getDate() == 29)
      daysInMonths[1] = 29;
    this.daysInMonth = daysInMonths[month];
  },
  setStartingOffset: function(month,year){
    this.startingOffset = new Date(year,month,1).getDay();
  },
  setDate: function(day){
    this.calDate.setDate(day);
  },
  setCalParams: function(){
    this.setDaysInMonth(this.calDate.getMonth(), this.calDate.getFullYear());
    this.setStartingOffset(this.calDate.getMonth(), this.calDate.getFullYear());
  },
  startup: function(){
    if(!$(this.options.container).hasClass(this.options.hiddenClass)) $(this.options.container).addClass(this.options.hiddenClass);
    $(this.options.showButton).addEvent('click', function(){
      $(this.options.container).toggleClass(this.options.hiddenClass)
    }.bind(this));
  },
  showControlsRow: function(calTitle){ // Complete & Functioning Correctly
    // Initialise the Row
    var controlsTR  = new Element('tr',{
      'class':'trcontrols'
    });
    // Previous Link Cell
    if(this.calDate <= this.today){
      var prevcalTH = new Element('th',{
        'class': 'prevcal'
      }).inject(controlsTR);
      var prevcalIMG = new Element('img',{
        'class':'png',
        'src': this.options.leftFadedImgURL
      }).inject(prevcalTH);
    }else{
      var prevcalTH = new Element('th',{
        'class': 'prevcal'
      }).inject(controlsTR);
      var prevcalA = new Element('a',{
        'href':'javascript:void(0)'
      }).inject(prevcalTH);
      var prevcalIMG = new Element('img',{
        'class':'png',
        'src': this.options.leftImgURL
      }).inject(prevcalA);
      prevcalA.addEvent('click', function(){
        this.showPrevMonth()
      }.bind(this));
    }
    // Title Cell
    var titleTH = new Element('th', {
      'class':'headercal',
      'colspan':'5',
      'html':calTitle
    }).inject(controlsTR);
    // Next Link Cell
    if( (this.calDate.getMonth() == this.rangeEnd.getMonth()) && (this.calDate.getFullYear() == this.rangeEnd.getFullYear()) ){
      var nextcalTH = new Element('th',{
        'class': 'nextcal'
      }).inject(controlsTR);
      var nextcalIMG = new Element('img',{
        'class':'png',
        'src': this.options.rightFadedImgURL
      }).inject(nextcalTH);
    }else{
      var nextcalTH = new Element('th',{
        'class': 'nextcal'
      }).inject(controlsTR);
      var nextcalA = new Element('a',{
        'href':'javascript:void(0)'
      }).inject(nextcalTH);
      var nextcalIMG = new Element('img',{
        'class':'png',
        'src': this.options.rightImgURL
      }).inject(nextcalA);
      nextcalA.addEvent('click', function(){
        this.showNextMonth()

      }.bind(this));
    }
    // Return the Content
    return controlsTR;
  },
  showDowRow: function(dow){
    // Initialise the Row
    var dowrowTR = new Element('tr', {
      'class':'dowrow'
    });
    // Initiate Days THs
    this.days.each(function(day){
      new Element('th', {
        'scope': 'col',
        'text':day.substr(0,1)
      }).inject(dowrowTR);
    });
    // Return the Content
    return dowrowTR;
  },
  showNextMonth: function(){
    this.calDate.nextMonth();
    this.setCalParams();
    this.showMonth();
  },
  showPrevMonth: function(){
    this.calDate.prevMonth();
    this.setCalParams();
    this.showMonth();
  },
  showMonth: function(){
    $(this.options.container).set('html','');
    // Initialise the Table
    var table = new Element('table',{
      'class':'moocal'
    });
    // Initialise the Inner Containers
    var thead = new Element('thead').inject(table);
    var tbody = new Element('tbody').inject(table);
    // Output the Header Content
    this.showControlsRow(this.months[this.calDate.getMonth()]+' '+this.calDate.getFullYear()).inject(thead);
    this.showDowRow().inject(thead);
    // Loop Through For Weeks & Days
    var calDone = false;
    for (var i = 0; i < 6; i++){
      if(calDone) break;
      var weekrowTR = new Element('tr', {
        'class':'monthweek'
      }).inject(tbody);
      for (var j = 0; j < 7; j++) {
        var day = ((j+1) + (i*7)) - this.startingOffset;
        var td = new Element('td', {
          'class':'monthday',
          'id':'day'+day
        }).inject(weekrowTR);
        if (day > 0 && day <= this.daysInMonth){
          td.set({
            events: {
              'mouseover': function(){this.addClass('hover')},
              'mouseout': function(){this.removeClass('hover')},
              'click': function(){
                $$('td.selected').removeClass('selected');
                this.addClass('selected');
              }
            }
          });
          td.addEvent('click', function(e){
              this.setDate(e.target.retrieve('date'));
              this.fillToFields();
          }.bind(this));
          var el = new Element('span', {
            'class': 'date',
            'text':day
          }).store('date',day).inject(td);
          td.store('date',day);
          if( (day == this.today.getDate()) && (this.calDate.getMonth() == this.today.getMonth()) ) td.addClass('selected');
          if(day == this.daysInMonth) calDone = true;
        }
        else{
          td.set('html', '&nbsp;');
        }
      }
    }
    table.inject($(this.options.container));
    var hr = new Element('hr').inject($(this.options.container))
    this.fillToFields();
    this.viewStartDate.setTime(this.calDate.valueOf());
    this.viewStartDate.setDate(1);
    this.viewEndDate.setTime(this.calDate.valueOf());
    this.viewEndDate.setDate(this.daysInMonth);
    this.viewStartDate.clearTime();
    this.viewEndDate.endOfDay();
  },
  fillFromFields: function(){
    var monthf = $(this.options.monthSelect);
    monthf.addEvent('change', function(){
      year = parseInt(monthf.value.substr(3,6));
      month = parseInt(monthf.value.substr(0,2)-1);
      day = parseInt(dayf.value.substr(0,2).replace(/^0/,''));
      this.calDate.setFullYear(year);
      this.calDate.setMonth(month);
      this.calDate.setDate(day);
      this.setCalParams();
      this.showMonth();
      $$('td.monthday').removeClass('selected');
      $$('td#day'+day).addClass('selected');
    }.bind(this));
    var dayf = $(this.options.daySelect);
    dayf.addEvent('change', function(){
      year = parseInt(monthf.value.substr(3,6));
      month = parseInt(monthf.value.substr(0,2)-1);
      day = parseInt(dayf.value.substr(0,2).replace(/^0/,''));
      this.calDate.setFullYear(year);
      this.calDate.setMonth(month);
      this.calDate.setDate(day);
      this.setCalParams();
      this.showMonth();
      $$('td.monthday').removeClass('selected');
      $$('td#day'+day).addClass('selected');
    }.bind(this));
  },
  fillToFields: function(){
    var dayf = $(this.options.daySelect);
    dayf.empty();
    this.daysInMonth.each(function(day, i){
      day = day+1;
      (day<10) ? day = '0' + day : '' ;
      new Element('option', {
        'value': day,
        'text': day
      }).inject(dayf);
    });
    var monthf = $(this.options.monthSelect);
    // Build Correct Month
    day = this.calDate.getDate();
    (day<10) ? day = '0' + day : '' ;
    // Fill In Month, Year Field
    dayf.value = day;
    // Build Correct Month
    month = this.calDate.getMonth() + 1;
    (month<10) ? month = '0' + month : '' ;
    month = month + '-' + this.calDate.getFullYear();
    // Fill In Month, Year Field
    monthf.value = month;
  },
  extendDate: function(){
    function prevMonth(){
      var thisMonth = this.getMonth();
      this.setMonth(thisMonth-1);
      if(this.getMonth() != thisMonth-1 && (this.getMonth() != 11 || (thisMonth == 11 && this.getDate() == 1))){
        this.setDate(0);
      }
    };
    function nextMonth(){
      var thisMonth = this.getMonth();
      this.setMonth(thisMonth+1);
      if(this.getMonth() != thisMonth+1 && this.getMonth() != 0)
        this.setDate(0);
    };
    function endOfDay(){
      this.setHours(23);
      this.setMinutes(59);
      this.setSeconds(59);
      this.setMilliseconds(999);
    };
    function getMDay(){
      if(this.getDay() == 0)
        return 6;
      else
        return this.getDay() - 1;
    };
    function ymd(){
      return this.format('%Y-%m-%d');
    }
    function thTime(){
      var ampm = this.format('%p').toLowerCase();
      return this.format('%I:%M'+ampm);
    }

    Date.prototype.nextMonth = nextMonth;
    Date.prototype.prevMonth = prevMonth;
    Date.prototype.endOfDay = endOfDay;
    Date.prototype.getMDay = getMDay;
    Date.prototype.ymd = ymd;
    Date.prototype.thTime = thTime;
  }
});
