/*
 * Calendar Emoxion
 * with Mootools
 * Manuel Garcia (thekeeper)
 * http://www.mgarcia.info
 * Version 0.2
 *
 * Copyright (c) 2007 Manuel Garcia
 * http://www.opensource.org/licenses/mit-license.php
 */
window.addEvent('domready', function() {
    // create the elements required to make the icon appear beside the calendar input field
    var anchor = new Element('a').setProperties({'href':'#','class':'ncalendar_icon'});
    var img = new Element('img').setProperties({'src' : bsc.site.scripts + 'scripts/javascript/calendar/1/img/calendar.gif','alt':''}).injectInside(anchor);
    
    // process each calendar input box
    $$('input.ncalendar').each(function(el) {
        temp = anchor.clone();
        temp.injectAfter(el);
        
        // add the click to the text field to show the calendar
        el.addEvent('click', function(event) {
                new Calendar(el,true,{'Lng' : 'en','imgPath' : bsc.site.scripts + 'scripts/javascript/calendar/1/' });
        });
        
        // make the link fire the event on the input field
        temp.addEvent('click',function(event) {
            event = new Event(event);
            event.stop();
            
            this.fireEvent('click');
        }.bindAsEventListener(el));
    });
});

var Calendar = new Class({
    initialize: function(el,open,Config) {
      this.input = $(el);
            var lngs = new Object();

            // Firefox? IE ?
            try {  var nav = navigator.language.substr(0,2); }
            catch (e)    { var nav = navigator.userLanguage;}

            lngs['es'] = {
          month : ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
          day : ['L','M','M','J','V','S','D'],
          first: 1 // First day of week => Monday
            }
            lngs['de'] = {
          month : ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
          day : ['M','D','M','D','F','S','S'],
          first: 1 // Monday
            }
            lngs['fr'] = {
          month : ['Janvier', 'Février', 'Mars', 'Avril', 'Peuvent', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre','Décembre'],
          day : ['L','M','M','J','V','S','D'],
          first: 1 // Monday
            }
            lngs['it']= {
          month : ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Possono', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
          day : ['L','M','M','G','V','S','D'],
          first: 1 // Monday
            }
            lngs['en'] = {
          month : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
                day : ['S','M','T','W','T','F','S'],
                first: 0 // Sunday
      }
            var lng = (!lngs[nav]) ? lngs['en'] : lngs[nav] ;

          this.config = {
                        Lng: lng,
                      imgNext: 'img/next.gif',
                      imgPrev: 'img/prev.gif',
                      imgCancel: 'img/cancel.gif'
                };
      /* configuration */
      if (Config) {
          if(Config.Lng) this.config.Lng = lngs[Config.Lng]; 
          if(Config.imgPath) {
              this.config.imgNext = Config.imgPath + (Config.imgNext ? Config.imgNext : this.config.imgNext);
              this.config.imgPrev = Config.imgPath + (Config.imgPrev ? Config.imgPrev : this.config.imgPrev);
              this.config.imgCancel = Config.imgPath + (Config.imgCancel ? Config.imgCancel : this.config.imgCancel);
          }
      }

      this.month_name = this.config.Lng.month;
      this.day_name =  this.config.Lng.day;
            this.create_calendar();
    },
    create_calendar: function() {

     var position = this.input.getCoordinates();
     if ($('ncalendar')) $('ncalendar').remove();
      // content div  //
      this.div = new Element('div').setStyles({'top':(position.top+position.height)+'px', 'left':(position.left)+'px'}).setProperties({'id' : 'ncalendar'}).injectAfter(this.input);
      this.div.makeDraggable();
      this.nav();
      this.setdate(this.input.getProperty('value'));
            this.effect(this.div,'show');
        } ,
        nav: function (today) {
          // nav
        this.calendardiv_top = new Element('div').setProperties({'class' : 'top'}).injectInside(this.div);
        this.titulo = new Element('strong').injectInside(this.calendardiv_top);
        // close
        this.close = new Element('img').setProperties({'src':this.config.imgCancel,'class':'ncalendar_close'}).injectAfter(this.titulo);
        // next month
        this.next = new Element('img').setProperties({'src':this.config.imgNext,'class':'ncalendar_next'}).injectAfter(this.titulo);
        // before month
        this.before = new Element('img').setProperties({'src':this.config.imgPrev,'class':'ncalendar_prev'}).injectAfter(this.titulo);
        // table
        this.table = new Element('table').injectInside(this.div);
        this.calendardiv_bottom = new Element('div').setProperties({'class' : 'bottom'}).injectAfter(this.table);
        var thead = new Element('thead').injectInside(this.table);
           var tr = new Element('tr').injectInside(thead);

      this.day_name.each(function (day) {
                var td = new Element('th').appendText(day).injectInside(tr);
            });

            var localThis = this;
            this.close.addEvent('click', function(e) {
          localThis.div.remove();
          });
        },
        setdate : function(date) {
            // reset event nav
            this.next.removeEvents('click');
            this.before.removeEvents('click');

            if (!this.validate_date(date)) {
        this.today = new Date();
            this.today.setDate(1);
      } else {
          var dateinp = date.split('/');
            this.today = new Date(dateinp[2],dateinp[1]-1,dateinp[0],0,0,0);
            }

      this.next_m = this.today.getMonth();
      this.next_m++;

      this.titulo.innerHTML = this.month_name[this.today.getMonth()]+' ' + this.today.getFullYear();
          var localThis = this;

            // event next
            this.next.addEvent('click', function(e) {
          var date = localThis.today;
             date.setMonth(localThis.next_m+1,1);
            localThis.tbody.remove();
          localThis.setdate(date.getDate()+'/'+date.getMonth()+'/'+date.getFullYear());
          });
          // event before
            this.before.addEvent('click', function(e) {
          var date = localThis.today;
             date.setMonth(localThis.next_m-1,1);
          localThis.tbody.remove();
          localThis.setdate(date.getDate()+'/'+date.getMonth()+'/'+date.getFullYear());
          });
            var LastMonth = new Date(this.today.getFullYear(),this.next_m-2,1,0,0,0);

            var last = LastMonth.getMonth();
            // total days the last month
            var counter = 0;
            for (var b = 1; b <= 31; b++) {
              LastMonth.setDate(b);
                 if ( LastMonth.getMonth() == last) {
                   counter++;
                 }
            }

            this.tbody = new Element('tbody').injectInside(this.table);
            var first_day = this.today;
            var last_day = this.today;
            this.month = this.today.getMonth();
           var tr = new Element('tr').injectInside(this.tbody);

          var day=0;

            /* first day week */
            first_day.setDate(1);
            var rest = (!first_day.getDay())? 6: first_day.getDay()-1;
            counter = counter - rest;
            for (var i= this.config.Lng.first; i <= 6; i++) {
               if (first_day.getDay() == i) {
                break;
           } else {
                    counter++;
                    LastMonth.setDate(counter);
                    if (LastMonth.getMonth() == this.today.getMonth()) LastMonth.setMonth(this.today.getMonth()-1);
            this.create_td(tr,counter-1,LastMonth,'noday');
        }
           }
            (this.config.Lng.first)? brea_k = 1:brea_k = 0;
   /* everydays */
      var date_s = this.today;
      var class_Css;
      var brea_k; // breaking week
        var daycounter = 0;
         for (var i = 1; i <= 31; i++) {
            date_s.setDate(i);
                 if (date_s.getMonth() == this.month) {
               daycounter++;
              if (date_s.getDay() == brea_k) {
                        var tr = new Element('tr').injectInside(this.tbody);
                    }
          class_Css = (!date_s.getDay())? 'sunday' : '';
                    this.create_td(tr,i,date_s,class_Css);
                }
            }
              this.today.setMonth(this.month);
           this.today.setDate(daycounter);
           var NextMonth = new Date(this.today.getFullYear(),this.today.getMonth()+1,1,0,0,0);
            // finish month
              var num = date_s.getDay();
              num = (brea_k)? 7 - num: 6 - num;
              var b;
              b = (brea_k)? 0 : 6 ;
        if (this.today.getDay() != b) {
                  for (var i= 1; i <= (num); i++) {
                      NextMonth.setDate(i);
                            this.create_td(tr,i,NextMonth,'noday');
                    }
            }
            this.effect(this.tbody,'show');
    },
        create_td: function(tr,i,date,class_Css) {
        var localThis = this;
                var td = new Element('td');
                if (date) {
                  var dia = date.getDate();
                  var mes = (date.getMonth()+1);
                  //  9 to 09 or another number <= 9
                  if (dia <= 9) dia = "0"+ dia;
                  if (mes <= 9) mes = "0"+ mes;
            td.setProperty('id', dia + '/'+ mes +'/'+    date.getFullYear());
        }
        td.addEvent('click', function(e) {
                    localThis.input.value = this.id;
                         localThis.effect(localThis.div,'fade');
                         localThis.div.remove();
              });
              td.addEvent('mouseover', function(e) {
                         this.addClass('dayselected');
              });
              td.addEvent('mouseout', function(e) {
                         this.removeClass('dayselected');
              });

            if (class_Css) td.addClass(class_Css);
            // Today ??
            var today = new Date();
                today = today.getDate() + "/" + (today.getMonth()+1) + "/" + today.getFullYear();
                if (date) var date_td = date.getDate() + "/" + (date.getMonth()+1) + "/" + date.getFullYear();
                if (today == date_td) td.addClass('isToday');

            td.appendText(i);
                td.injectInside(tr);
        },
        effect: function(div,op) {
          var ef = new Fx.Style(div, 'opacity', {
                duration: 300,
                transition: Fx.Transitions.quartInOut
            });
            (op == 'fade')? ef.start(1,0): ef.start(0,1);
        },
        validate_date: function (date) {
                  var regex = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
                  return date.test(regex);
        }
});
