Calendars = {
	getCalendar:function(element) {
		return element.hasClass('calendar') ? document.id(element) : document.id(element).getParent('.calendar');
	},
	
	init: function(calendar) {
		calendar = this.getCalendar(calendar);
		if(!calendar) return;
		calendar.getElement('img.today').setStyles({'display':'none'});
	},
	
	dayRequest: function(day) {
		day = document.id(day);
		if(!day.get('html') && !day.get('class') || day.hasClass('blocked')) return;
		var calendar = this.getCalendar(day);
		(calendar.getElement('ul li.day.active') || new Element('div')).removeClass('active');
		day.addClass('active');
		day.getElement('!dd !dl').getAllNext('input[name=departure]')[0].set('value', day.getParent('ul').get('data') + '-' + day.get('html'));
		
		var booking = calendar.getParent('#booking');
		if(booking)
			booking.getElement('dd.active .process').fade('in');
	},
	
	monthRequest: function(element) {
		// var calendarDays = calendarDays;
		element = document.id(element);
		var calendar = this.getCalendar(element);
		
		if(calendar.retrieve('running')==1)
			return;
		calendar.store('running',1);
		
		var dateFormat = CUSTOM_DATA.cultureKey=='cn' ? '%Y'+'年'+'%m'+'月' : '%B %Y';
		var monthKey = calendar.getElement('.monthKey');
		var currKeys = monthKey.get('html').split('|');
		var currMonths = calendar.getElement('.days').getElements('ul[data]');
		
		if(element.hasClass('next')){
			var deadMonth = currMonths[0];
			var movingMonth = currMonths[1];
			var currKey = currKeys[1].split('-');
			if(currKey[1]<12){
				currKey[1] = currKey[1].toInt()+1;
				var key = currKey[0]+'-'+(currKey[1]<10 ? '0' : '')+currKey[1];
			} else {
				var key = (currKey[0].toInt()+1)+'-01';
			}
			var label = new Date().parse( movingMonth.get('data')+'-01' ).format(dateFormat)
				+' - '+ new Date().parse(key+'-01').format(dateFormat);
			var _monthKey = movingMonth.get('data')+'|'+key;
		} else {
			var deadMonth = currMonths[1];
			var movingMonth = currMonths[0];
			var currKey = currKeys[0].split('-');
			if(currKey[1]>1){
				currKey[1] = currKey[1].toInt()-1;
				var key = currKey[0]+'-'+(currKey[1]<10 ? '0' : '')+currKey[1];
			} else {
				var key = (currKey[0].toInt()-1)+'-12';
			}
			var label = new Date().parse(key+'-01').format(dateFormat)
				+' - ' + new Date().parse( movingMonth.get('data')+'-01' ).format(dateFormat);
			var _monthKey = key+'|'+movingMonth.get('data');
		}
		//console.log(calendarDays.hasOwnProperty(key), key, _monthKey, deadMonth, movingMonth);
		if(!calendarDays.hasOwnProperty(key)){
			calendar.store('running',0);
			return;
		}
		
		
		monthKey.set('html',_monthKey);
		var data = calendarDays[key];
		var newMonth = movingMonth.clone(true, true);
		newMonth.setAttribute('data', key);
		newMonth.getElements('li[onclick="Calendars.dayRequest(this)"]').destroy();
		for(var i=0; i<data.length; i++){
			var obj = data[i];
			var attrs = {'onclick':"Calendars.dayRequest(this)"};
			if(obj.hasOwnProperty('e')){
				// no attr
			} else if(obj.hasOwnProperty('c')){
				attrs['class'] = 'clr';
			} else {
				attrs['class'] = 'day' + (obj.hasOwnProperty('b') ? ' blocked' : '');
				attrs.html = (obj.hasOwnProperty('t') ? obj.t : '');
			}
			new Element('li',attrs).inject(newMonth);
		}
		calendar.getElement('.months h3').set('html', label);
			
	
		var cloned = movingMonth.clone(true, true).inject(movingMonth, "after");
		this.calendarFade(deadMonth, cloned);
		this.calendarFade(movingMonth, newMonth, function(){
			this.store('running',0);
		}, calendar);
	},
	calendarFade: function(oldElement, newElement, onComplete, onCompleteBind){
		oldElement.setStyles({position:"absolute",top:0,"z-index":99999,width:oldElement.getStyle("width"),left:oldElement.getStyle("margin-left")});
		var container=new Element("ul",{"class":"calendarContainer", styles:{margin:0,padding:0,position:"relative",overflow:"hidden",height:oldElement.getFullSize("height"),width:oldElement.getFullSize("width"),float:"left"}});
		container.wraps(oldElement);
		newElement.setStyles({"opacity":0}).inject(oldElement,"after");
		var newHeight=newElement.getFullSize("height");
		new Fx.Tween(newElement).start("opacity",1);
		new Fx.Tween(oldElement).start("opacity",0);
		new Fx.Tween(container,{
			onComplete:function(){
				this.newElement.inject(this.container,"after");
				this.container.dispose();
				if(onComplete){onComplete.apply((onCompleteBind||this) ,[])}
			}.bind({container:container,newElement:newElement})
		}).start("height",newHeight);
    }
};
