//ABSTRACT CLASS !

var CalendarController = new Class({
	
	Extends: WindowController,
	
	calendar	: undefined,
	eventsList	: undefined,
	
	container	: undefined,
	
	changed : true,
	done: false,
	range : undefined,
	
	initCalendarDate: undefined,
	endCalendarDate: undefined,
	
	firstSelection : true,
	
	stepNumber 	: 1,
	stepTitle	: "Selecciona tus fechas de estancia",
	
	
	options: {
		getCalendarUrl: "public/datescontroller/getcalendar",
		getDatesUrl: "public/datescontroller/getdates",
		startDateProperty: "startDate",
		endDateProperty: "endDate",
		
		onCalendarLoad: $empty
	},
	
	
	initialize: function(container, initCalendarDate, endCalendarDate, options)
	{
		this.setOptions(options);
		this.initCalendarDate = initCalendarDate;
		this.endCalendarDate = endCalendarDate;
		this.parent(container);
		this.loading();
		this.getCalendar();
		this.bus		= new SearchBus();
		this.registerEvents();
		this.createDoneButton();
		//this.hideChildren();
	},
	
	getCalendar: function()
	{
		this.loading();
		var dataToSend = {};
		
		dataToSend["startDate"] = this.initCalendarDate;
		dataToSend["endDate"] = this.endCalendarDate;
		new Request.JSON({url:this.options.getCalendarUrl, data:{"QUERY":JSON.encode(dataToSend)}, onComplete:this.loadCalendar.bind(this)}).send();
	},
	
	loadCalendar: function(response)
	{
		var calendarObject = response.ANSWER.result; 
		this.loaded();
		this.setCalendar(calendarObject);
		this.fireEvent("onCalendarLoad");
		this.recoverData();
		
	},
	
	setCalendar: function(calendarObject)
	{
	},
	
	recoverData: function()
	{
		new Request.JSON({url:this.options.getDatesUrl, onComplete: function(response){
			this.loaded();
			if($type(response) == "string")
			{
				var response = JSON.decode(response);
			}
			
			var falseResponse 	= ($defined(response.ANSWER.result) && response.ANSWER.result == false);
			if(falseResponse)
			{
				this.maximize(undefined, true);
				return false;
			}
			
			this.firstSelection = false;
			this.calendarDone(true);
			this.calendar.selections.createRange(response.ANSWER.result.init, response.ANSWER.result.end);
			this.calendar.rangeSelection(this.calendar.getCurrentRange());
			var month = $$(".day.selected")[0].getParent(".month");
			this.calendar.scrollToMonth(month);
			
			this.minimize();

			
		}.bind(this)}).send();
	},
	
	registerEvents: function()
	{
		this.bus.registerCallback(this.rangeSelected.bind(this)					, "rangeSelection");
		this.bus.registerCallback(this.calendarUnselect.bind(this)				, "calendarUnselect");
		this.bus.registerCallback(this.calendarFirstDateSelected.bind(this)		, "calendarFirstDateSelected");
		this.bus.registerCallback(this.calendarUnselectAll.bind(this)			, "calendarUnselectAll");
	},
	
	calendarUnselectAll: function(range)
	{
		this.titleHeader.set("text", "Selecciona tus fechas de estancia");
	},
	
	calendarFirstDateSelected: function(timestamp)
	{
		this.titleHeader.set("html", "Fecha de entrada <strong>"+this.getDateString(timestamp)+"</strong>");
	},
	
	calendarUnselect: function()
	{
		this.doneButton = this.doneButton.dispose();
	},
	
	rangeSelected: function(range)
	{
		var text = this.generateHeaderText(range);
		
		this.titleHeader.set("html", text);
		if(!$defined(this.range))
		{
			this.range 		= range;
		}
		else if(this.range[this.options.startDateProperty] != range[this.options.startDateProperty] || this.range[this.options.endDateProperty] != range[this.options.endDateProperty])
		{
			this.changed = true;
		}
		
		this.range = range;
		//this.doneButton.inject(this.container);
	},
	
	generateHeaderText: function(range)
	{
		var fullRange = this.calendar.dayCollection.getRange(range[this.options.startDateProperty], range[this.options.endDateProperty]);
		var nights = fullRange.length - 1;
		
		var nightsText = "";
		if(nights > 1)
		{
			var nightsText = ", "+nights+" noches";
		}
		
		if(nights == 1)
		{
			var nightsText = ", "+nights+" noche";
		}
		
		var text = "Fecha de entrada <strong>"+this.getDateString(range[this.options.startDateProperty])+"</strong>, fecha de salida <strong>"+this.getDateString(range[this.options.endDateProperty])+"</strong>"+nightsText;
		return text;
	},
	
	injectMinimizedInfo: function()
	{
		var range = this.calendar.getCurrentRange();
		var text = this.generateHeaderText(range);
		var element = new Element("h1", {"class":"stepTitle", html:"<span class='number'>1</span> <span class='title'>"+text+"</span>"}); 
		this.parent(element);
	},
	
	/*minimize: function()
	{
		this.parent();
		this.setOncompleteMorph(this.minimizeComplete.bind(this));
		this.container.morph(".calendarMinimized");
	},*/
	
	minimizeComplete: function()
	{
	},
	
	/*maximize: function(e, withoutButton)
	{
		this.parent();
		
		if(!$defined(withoutButton))
			this.minimizeButton.inject(this.container, "top");
		
		this.bus.trigger("calendarMaximize");
		this.setOncompleteMorph(this.maximizeComplete.bind(this));
		this.container.morph(".calendarMaximized");
	},*/
	
	maximizeComplete: function(){},
	
	createDoneButton: function()
	{
		this.doneButton = new Element("a", {href:"#", html: "<span>Continuar >> </span>", "class":"done"});
		this.doneButton.addEvent("click", function(event){event.stop()});
		this.doneButton.addEvent("click", this.calendarDone.bind(this));
	},
	
	calendarDone: function(firstDataRecovered)
	{
		
		this.minimize();
		if($defined(firstDataRecovered) && firstDataRecovered === true)
		{
			this.changed 	= false;
			this.done 		= true;
			this.bus.trigger("firstControllerDone");
			return false;
		}
		
		if(!this.changed)
		{
			return false;
		}
		
		if(this.firstSelection)
		{
			this.bus.trigger("firstControllerFirstSelection");
			this.firstSelection = false;
			this.changed 	= false;
			this.done 		= true;
			return false;
		}
		
		
		try{
			pageTracker._trackPageview("/userSelectedDates");
		}
		catch(exception){}
		
		this.changed 	= false;
		this.done 		= true;
		
		this.bus.trigger("firstControllerDone");
		this.bus.trigger("firstControllerChanged");
	},
	
	getDateString: function(date){
		var milliseconds=date*1000;
		var realDate=new Date(milliseconds);
		var dateString="";
		dateString=dateString+realDate.getDate()+"/";
		dateString=dateString+(realDate.getMonth()+1)+"/";
		dateString=dateString+realDate.getFullYear();
		return dateString;
	}
	
});