var CalendarScroller = new Class({
	Implements:[Options, Events],
	
	options:
	{
		onMissingMonth: $empty,
		scrollDuration:	400,
		scrollTransition:"Quint:out",
		offsetElements:2
	},
	
	pointer: 1,
	months: $H({}),
	
	initialize: function(wrapper, calendarContainer, options)
	{
		this.setOptions(options);
		this.wrapper = $(wrapper);
		this.calendarContainer = $(calendarContainer);
		this.setUp();
	},
	
	setUp: function()
	{
		this.calendarContainer.set("tween", {duration:this.options.scrollDuration, transition:this.options.scrollTransition});
		if(this.wrapper.getStyle("position") != "absolute")
		{
			this.wrapper.setStyle("position","relative");
		}
		this.wrapper.setStyle("overflow","hidden");
		this.calendarContainer.setStyle("position","absolute");
		this.createLinks();
		this.checkButtonsToDisable(this.pointer);
		
		this.calendarContainer.addEvent("mouseenter", this.setDocumentEvents.bind(this));
		this.calendarContainer.addEvent("mouseleave", this.unSetDocumentEvents.bind(this));
	},
	
	setDocumentEvents: function()
	{
		window.addEvent("calendarLeft", function(){
			this.scrollTo(this.pointer-1);
		}.bind(this));
		window.addEvent("calendarRight", function(){
			this.scrollTo(this.pointer+1);
		}.bind(this))
	},
	
	unSetDocumentEvents: function()
	{
		window.removeEvents("calendarLeft");
		window.removeEvents("calendarRight");
	},
	
	scrollTo: function(pointer)
	{
		if(pointer < 1)
		{
			pointer = 1;
		}
		
		var monthNotExist = (!$defined(this.months[(pointer)+this.options.offsetElements]));
		
		if(monthNotExist)
		{
			this.fireEvent("onMissingMonth");
			return false;
		}
		
		this.checkButtonsToDisable(pointer);
		
		var month = this.months[pointer];
		var left = month.getCoordinates(this.calendarContainer).left;
		this.calendarContainer.tween("left", -left);
		this.pointer = pointer;
	},
	
	scrollToElement: function(element)
	{
		var pointer = this.months.keyOf(element);
		this.scrollTo(pointer.toInt());
	},
	
	checkButtonsToDisable: function(pointer)
	{
		//this.regressMoreCalendar.removeClass("disabled");
		this.regressCalendar.removeClass("disabled");
		
		this.advanceCalendar.removeClass("disabled");
		//this.advanceMoreCalendar.removeClass("disabled");
		
		var atInitMonth = (pointer == 1);
		var atFinalMonth = (pointer == this.months.getLength()-this.options.offsetElements);
		
		if(atInitMonth)
		{
			//this.regressMoreCalendar.addClass("disabled");
			this.regressCalendar.addClass("disabled");	
		}
		
		if(atFinalMonth)
		{
			this.advanceCalendar.addClass("disabled");
			//this.advanceMoreCalendar.addClass("disabled");	
		}
			
	},
	
	getPointer: function()
	{
		return this.pointer;
	},
	
	createLinks: function()
	{
		
		this.regressCalendar = new Element("a", {
			href: "#",
			html: "<span> < </span>",
			"class": "button regress"
		});
		
		this.advanceCalendar = new Element("a", {
			href: "#",
			html: "<span> > </span>",
			"class": "button advance"
		});
		
		/*this.advanceMoreCalendar = new Element("a", {
			href: "#",
			text: " >> ",
			"class": "advance more"
		});*/
		
		/*this.regressMoreCalendar = new Element("a", {
			href: "#",
			text: " << ",
			"class": "regress more"
		});*/
		
		this.regressCalendar.inject(this.wrapper);
		this.advanceCalendar.inject(this.wrapper);
		/*this.regressMoreCalendar.inject(this.wrapper);
		this.advanceMoreCalendar.inject(this.wrapper);*/
		
		
		//this.regressMoreCalendar.addEvent("click", function(e){e.stop()});
		this.regressCalendar.addEvent("click", function(e){e.stop()});
		this.advanceCalendar.addEvent("click", function(e){e.stop()});
		//this.advanceMoreCalendar.addEvent("click", function(e){e.stop()});
		
		/*this.regressMoreCalendar.addEvent("click", function(){
			this.scrollTo(this.pointer-3);
		}.bind(this));*/
		this.regressCalendar.addEvent("click", function(){
			this.scrollTo(this.pointer-1);
		}.bind(this));
		this.advanceCalendar.addEvent("click", function(){
			this.scrollTo(this.pointer+1);
		}.bind(this));
		/*this.advanceMoreCalendar.addEvent("click", function(){
			this.scrollMore(3);
		}.bind(this));*/
		
	},
	
	setMonths: function(months)
	{
		var counter = 1;
		months.each(function(month){
			this.months[counter] = month;
			counter++;
		}.bind(this))
	},
	
	scrollMore: function(number)
	{
		if(!$defined(this.months[(this.pointer+number) + this.options.offsetElements]))
		{
			this.scrollMore(number-1);
			return false;
		}
		
		this.scrollTo(this.pointer+number);
	}
	
	
});
