var Calendar = new Class({

    initialize: function(el,open,Config) {
      this.input = $(el);
			var lng = new Object();

			// Firefox? IE ?
			try {  var nav = navigator.language.substr(0,2); }
			catch (e)	{ var nav = navigator.userLanguage;}

			lng['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
			}
			lng['de'] = {
		      	month : ['Januar', 'Februar', 'Mrz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
		      	day : ['M','D','M','D','F','S','S'],
		      	first: 1 // Monday
			}
			lng['fr'] = {
		      	month : ['Janvier', 'Fevrier', 'Mars', 'Avril', 'Peuvent', 'Juin', 'Juillet', 'Aot', 'Septembre', 'Octobre', 'Novembre','Decembre'],
		      	day : ['L','M','M','J','V','S','D'],
		      	first: 1 // Monday
			}
			lng['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
			}
			lng['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
      		}
			lng = (!lng[nav])? lng['en'] : lng =  lng[nav] ;
      /* configuration */
      if (!Config)
	      this.config = {
					  Lng: lng,
					  imgNext: '/images/calendar/next.png',
					  imgPrev: '/images/calendar/prev.png'
				};

      this.month_name =  this.config.Lng.month;
      this.day_name   =  this.config.Lng.day;
			this.create_calendar();
    }, // END INTIALIZE
    
    create_calendar: function() {
      var position = $(this.input.id+"pos").getCoordinates();
//      if ($('ncalendar')) $('ncalendar').remove();
      // content div  //
//      this.div = new Element('div').setStyles({'top':(position.top+position.height)+'px', 'left':(position.left)+'px'}).setProperty('id', 'ncalendar').injectAfter(this.input);
      this.div = new Element('div').setStyles({'position':'relative'}).setProperty('id', 'ncalendar').injectAfter($(this.input.id+"pos"));
      this.nav();
      this.setdate(this.input.getProperty('value'));
	  this.effect(this.div,'show');
	},
	
	nav: function (today) {
	  // nav
      this.calendardiv = new Element('div').injectInside(this.div);
      this.titulo = new Element('strong').injectInside(this.calendardiv);
      // next month
//      this.next = new Element('img').setProperty('src', this.config.imgNext).injectAfter(this.titulo);
		this.next = new Element('span').injectAfter(this.titulo);
		this.next.innerHTML = "&nbsp;&raquo;";
      // before month
//      this.before = new Element('img').setProperty('src', this.config.imgPrev).injectBefore(this.titulo);
		this.before = new Element('span').injectBefore(this.titulo);
		this.before.innerHTML = "&laquo;&nbsp;";
	  // table
	  this.table = new Element('table').injectInside(this.div);
	  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;
	},
	
	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[0]-1,dateinp[1],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.getMonth()+'/'+date.getDate()+'/'+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.getMonth()+'/'+date.getDate()+'/'+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,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', mes + '/'+ dia +'/'+ date.getFullYear());	
      }
      
      td.addEvent('click', function(e) {
        localThis.input.value = this.id;
        if ($(localThis.input.id+"_func")) {
          myjs = $(localThis.input.id+"_func").value;
          eval(myjs);
        }
  	  });
  	  
  	  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.getMonth()+1) + "/" + today.getDate() + "/" + today.getFullYear();
	  if (date) var date_td = (date.getMonth()+1) + "/" + date.getDate() + "/" + 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: 500,
	  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);
  }
  
});